]> src.twobees.de Git - dotfiles.git/blob - stow/vim/.vim/vimrc
initial
[dotfiles.git] / stow / vim / .vim / vimrc
1 "set vim config dir
2 let b:vim_conf_dir = $HOME.'/.vim'
3 if has("win32")
4     let b:vim_conf_dir = $HOME.'\vimfiles'
5 endif
6 set nocompatible
7
8 if has('nvim')
9     if isdirectory( b:vim_conf_dir . '/tmpnvim/') == 0
10         call mkdir(b:vim_conf_dir.'/tmpnvim/', 'p', 0700)
11     endif
12 else
13     if isdirectory( b:vim_conf_dir . '/tmp/') == 0
14         call mkdir(b:vim_conf_dir.'/tmp/', 'p', 0700)
15     endif
16 endif
17
18 let g:qs_highlight_on_keys = ['f', 'F', 't', 'T']
19 augroup qs_colors
20   autocmd!
21   autocmd ColorScheme * highlight QuickScopePrimary guifg='#afff5f' gui=underline ctermfg=155 cterm=underline
22   autocmd ColorScheme * highlight QuickScopeSecondary guifg='#5fffff' gui=underline ctermfg=81 cterm=underline
23 augroup END
24
25
26 "load plugins
27 if filereadable(b:vim_conf_dir . '/plugins.vundel.vim')
28     exec 'source ' . b:vim_conf_dir . '/plugins.vundel.vim'
29 endif
30 "
31 " auskommentiert, macht in screen das nix gut aussieht..
32 "set termguicolors
33 set background=dark
34 set t_Co=256
35 try
36     let g:gruvbox_contrast_dark = 'hard'
37     let g:gruvbox_italicize_comments = 0
38     colorscheme gruvbox
39 catch /^Vim\%((\a\+)\)\=:E185/
40     "  wird evtl rest instlliert... E185 heißt nicht gefunden..
41 endtry
42
43
44 set backspace=indent,eol,start
45 set relativenumber
46 set number
47 set lazyredraw
48
49 set expandtab
50 set tabstop=4
51 set softtabstop=4
52 set shiftwidth=4
53
54 set pastetoggle=<F3>
55
56 set encoding=utf-8
57 set modeline
58
59 set history=50
60 set noerrorbells
61 set visualbell t_vb=
62 set hidden
63 set nojoinspaces
64 set nrformats=
65 if ! has ('nvim')
66     set ttymouse=xterm2
67 endif
68 set mouse=a
69
70 " Tab-completion in command-line mode
71 set path+=**
72 set wildmode=full
73 set wildmenu
74 set wildignore=*.pdf,*.fo,
75 set title
76
77 " Appearance
78 set ruler
79 set showmode
80 set showcmd
81 set laststatus=2
82 set hlsearch
83 set incsearch
84 set ignorecase
85 set smartcase
86
87 " remove =, thus 'gf' works whit filepath asignemens like myvar=/path/tofile
88 set isfname-==
89
90 let perl_include_pod = 1
91 augroup PerlSettings
92     autocmd!
93     autocmd FileType perl setlocal complete-=i
94 augroup END
95
96 let mapleader = ","
97
98 nnoremap <F5> :wa<CR>:!./%
99 nnoremap <F8> ]s
100 nnoremap <S-F8> [s
101 nnoremap Z Y
102
103 nnoremap <leader>- i• 
104 inoremap <leader>- • 
105
106 " Window switching
107 nnoremap <C-k> <C-W>k
108 nnoremap <C-j> <C-W>j
109 nnoremap <C-h> <C-W>h
110 nnoremap <C-l> <C-W>l
111
112 nnoremap <Leader>i a'" <<  << "' <Esc>6hi
113 nnoremap <Leader>a a'{}' <Esc>2hi
114 nnoremap <Leader>A a'"+  +"' <Esc>4hi
115 autocmd FileType cpp nnoremap <Leader>a a'"<<  <<"' <Esc>5hi
116
117 " see :h restore-position
118 nnoremap <Leader>= msgg=G`s
119
120 inoremap kj <Esc>
121 inoremap jk <Esc>
122 inoremap ts<tab> // TODOts: <Esc>=$A
123 inoremap obs<tab> //TODOObsolete: kann nach der Abspaltung von XXXX entfernt werden<Esc>=$0fXviw
124
125 inoremap no<tab> <Esc>0i <nodoc /><Esc>0i///<Esc>=$
126 inoremap td<tab> <Esc>0i//TODOts: doku<CR><summary> </summary><Esc>0i/// <Esc>kVj=$
127
128 autocmd InsertEnter * set timeoutlen=500
129 autocmd InsertLeave * set timeoutlen=1000
130
131 inoremap in<tab> <Esc>0i<inheritdoc /><Esc>0i///<Esc>V=
132
133 " do not use ex mode
134 map Q <Nop>
135
136 nnoremap <C-p> :bprev<CR>
137 nnoremap <C-n> :bnext<CR>
138
139 nnoremap <leader>e :tabedit $MYVIMRC<CR>
140
141 nnoremap  ZZ :wqall<CR>
142 nnoremap  <F6> :wa<CR>:make -j 8<CR><CR>
143 inoremap  <F6> <esc>:wa<CR>:make -j 8<CR><CR>
144
145 nnoremap <Leader>x :wa\|!./%<CR>
146 inoremap <Leader>x <esc>:wa\|!./%<CR>
147
148 nnoremap <C-l> <C-W>l
149
150 " Copy paste to/from system clipboard
151 vnoremap <leader>c "*y
152 noremap  <leader>v "*p
153 inoremap <leader>v <esc>"*p
154 vnoremap <leader>v "*p
155
156 "nnoremap <Leader>= mzgg=G`z<CR>
157 nnoremap <F2> :call FormatDocument()<CR>
158 " write using sudo.
159 cmap w!! w !sudo tee > /dev/null %
160
161 "move lines up/down visually selected
162 inoremap <S-Up> <Esc>:m .-2<CR>==gi
163 nnoremap <S-Up> :m .-2<CR>==
164 vnoremap <S-Up> :m '<-2<CR>gv=gv
165 inoremap <S-Down> <Esc>:m .+1<CR>==gi
166 nnoremap <S-Down> :m .+1<CR>==
167 vnoremap <S-Down> :m '>+1<CR>gv=gv
168
169 nnoremap <S-Right> >>
170 vnoremap <S-Right> :><CR>gv
171 vnoremap <S-Left>  :<<CR>gv
172 nnoremap <S-Left> <<
173
174 " repeat lS-ast command on all selected:
175 vnoremap . :normal.<CR>
176
177 vnoremap <leader>tt :Tabular /^[^-+=]*\zs\S*=/l1l1<cr>
178 vnoremap <leader>t, :Tabular /,\zs/l1l1<cr>
179 vnoremap <leader>t<space>  :Tabular /\s\+\zs/l1l0<cr>
180 vnoremap <leader>t:        :Tabular /:\zs/l1l0<cr>
181 vnoremap <leader>t(  :Tabular /(/l1l0<cr>
182 "
183 " append word under cursor with 'or' to current search pattern
184 nnoremap <Leader>s yiw/<C-R>/\\|<C-R>"<cr>
185 " append selection with 'or' to current search pattern
186 vnoremap <Leader>s y/<C-R>/\\|<C-R>"<cr>
187
188 cmap w!! w !sudo tee % >/dev/null
189 nnoremap <Leader>mh :wa<CR>:silent !mhsend -run reload code<CR>:redraw!<CR>
190 nnoremap <Leader>ll iprint_log("");<Esc>V=0f(la
191
192 if has('win32')
193     nnoremap <Leader>r :source ~/vimfiles/vimrc<CR>
194 else
195     nnoremap <Leader>r :source ~/.vim/vimrc<CR>
196 endif
197
198 filetype plugin indent on
199 syntax enable
200 set autoindent
201
202 " ack seems to have vanished from artfull, thus use silversearchger-ag
203 " for ack.vim:
204 if executable('ag')
205     let g:ackprg = 'ag --vimgrep'
206 endif
207
208 set list listchars=tab:→\ ,trail:·
209
210 hi Visual  guifg=White guibg=Blue gui=bold
211
212 set diffopt+=vertical
213 "set diffopt+=iwhite
214 set diffopt+=algorithm:patience
215 "jump to next diff and center line
216 noremap <leader>n ]cz.
217 noremap <leader>p [cz.
218 if has ('win32')
219     set guifont=DejaVu_Sans_Mono:h9:cANSI:qDRAFT
220 endif
221 if &diff
222     " ignore whitespace
223     set diffopt+=vertical
224     "set diffopt+=iwhite
225     set diffopt+=algorithm:patience
226
227     syntax off
228     highlight DiffText term=reverse cterm=reverse ctermfg=214 ctermbg=234 gui=reverse guifg=lightgreen guibg=DarkGreen
229     " go fullscreen:
230     if has ('win32')
231         autocmd GuiEnter * simalt ~x
232         set guifont=DejaVu_Sans_Mono:h8:cANSI:qDRAFT
233     endif
234     " make all diff windows the same size
235     autocmd VimResized * wincmd =
236     autocmd VimEnter *  2wincmd w
237     autocmd VimEnter *  syntax off
238     autocmd VimEnter * set guioptions+=b
239     set relativenumber!
240     set number
241 else
242     if has("gui_running")
243         set lines=999 columns=120
244     endif
245     " from /etc/vim/vimrc (restore last editing position)
246     if has("autocmd")
247         au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
248     endif
249
250     set textwidth=120
251
252 endif
253
254
255 " remove currently unused fugitive buffers:
256 autocmd BufReadPost fugitive://* set bufhidden=delete
257
258 " reset terminal colors after vim leaves
259 "if !has("gui_running")
260 "    au VimLeave * !echo -ne "\033[0m"
261 "endif
262
263 " macht dass auch in screen auf dem server der vollstaendige hintergund gmalt
264 " wird.
265 set t_ut=
266
267 if has ('win32') || has('win32unix')
268     let g:vimwiki_list = [
269                 \{
270                 \   'path':'~/vimwiki',
271                 \   'path_html':'~/vimwiki/html/',
272                 \   'syntax': 'markdown',
273                 \   'ext': '.md'
274                 \ }
275                 \ ]
276 else
277     let g:vimwiki_list = [
278                 \ {
279                 \   'path':'~/p/wiki',
280                 \   'path_html':'~/p/wiki/html/',
281                 \   'syntax': 'markdown',
282                 \   'ext': '.md'
283                 \ }
284                 \ ]
285 endif
286
287 if has('nvim')
288     "" tmp files:
289     if isdirectory( b:vim_conf_dir . '/tmpnvim/backup') == 0
290         call mkdir(b:vim_conf_dir.'/tmpnvim/backup', 'p', 0700)
291     endif
292     exec 'set backupdir='. b:vim_conf_dir.'/tmpnvim/backup//'
293     set backup
294
295     " delete old swap dirs and disable swap files
296     if isdirectory( b:vim_conf_dir . '/tmpnvim/swap') == 1
297         call delete(b:vim_conf_dir.'/tmpnvim/swap', 'rf')
298     endif
299     set noswapfile
300
301     " viminfo stores the the state of your previous editing session
302     if has('win32')
303         set viminfo+=n~/vimfiles/tmpnvim/viminfo
304     else
305         set viminfo+=n~/.vim/tmpnvim/viminfo
306     endif
307
308     " letzte suche beim öffnen einer Datei sofort wieder anzeigen
309     set viminfo-=h
310
311     if exists("+undofile")
312         " undofile - This allows you to use undos after exiting and restarting
313         " This, like swap and backups, uses .vim-undo first, then ~/.vim/undo
314         " :help undo-persistence
315         " This is only present in 7.3+
316         if isdirectory( b:vim_conf_dir . '/tmpnvim/undo') == 0
317             call mkdir(b:vim_conf_dir.'/tmpnvim/undo', 'p', 0700)
318         endif
319         exec 'set undodir='. b:vim_conf_dir.'/tmpnvim/undo'
320         set undofile
321     endif
322 else
323     "" tmp files:
324     if isdirectory( b:vim_conf_dir . '/tmp/backup') == 0
325         call mkdir(b:vim_conf_dir.'/tmp/backup', 'p', 0700)
326     endif
327     exec 'set backupdir='. b:vim_conf_dir.'/tmp/backup//'
328     set backup
329
330     " delete old swap dirs and disable swap files
331     if isdirectory( b:vim_conf_dir . '/tmp/swap') == 1
332         call delete(b:vim_conf_dir.'/tmp/swap', 'rf')
333     endif
334     set noswapfile
335
336     " viminfo stores the the state of your previous editing session
337     if has('win32')
338         set viminfo+=n~/vimfiles/tmp/viminfo
339     else
340         set viminfo+=n~/.vim/tmp/viminfo
341     endif
342
343     " letzte suche beim öffnen einer Datei sofort wieder anzeigen
344     set viminfo-=h
345
346     if exists("+undofile")
347         " undofile - This allows you to use undos after exiting and restarting
348         " This, like swap and backups, uses .vim-undo first, then ~/.vim/undo
349         " :help undo-persistence
350         " This is only present in 7.3+
351         if isdirectory( b:vim_conf_dir . '/tmp/undo') == 0
352             call mkdir(b:vim_conf_dir.'/tmp/undo', 'p', 0700)
353         endif
354         exec 'set undodir='. b:vim_conf_dir.'/tmp/undo'
355         set undofile
356     endif
357 endif
358
359 " format document
360 function! FormatDocument()
361     let save_pos = getpos(".")
362     normal gg=G
363     call setpos('.', save_pos)
364     echom "formatiert.."
365 endfunction
366
367 " reformat xml stuff
368 function! XmlPretty()
369     let save_pos = getpos(".")
370     :silent! %s/&lt;/</g
371     :silent! %s/&gt;/>/g
372     :silent! %s/></>\r</g
373     :set ft=xml
374     :normal mzgg=G`z
375     call setpos('.', save_pos)
376 endfunction
377
378 " fix logger stuff to use the newer api call
379 " remove #regions and whitspaces
380 " use {var} instead of " + var + "
381 command! -range FixCsharp call FixCsharp(<line1>, <line2>)
382
383 function! FixCsharp(l1,l2) range
384     let save_pos = getpos(".")
385     let r = a:l1. ','. a:l2
386     echo 'fixing range: '. r
387     " regions entfernen;
388     :silent! exec r . 'g/^\s*#\(end\)\{0,1\}region/d'
389     :silent! exec r . 'g/\.WriteException(/normal 0df,$^iLog.Exception(\eV='
390     :silent! exec r . 'g/\.WriteMessage(/normal 0f(ldf."ayiw0P0xlveu0iLog.\eelcf,(\eld0$^PV='
391
392     " '+ varname +' durch '{varname}' ersetzen
393     :silent! exec r . 's/"\s*+\s*\(.\{-\}\)\s*+\s*"/{\1}/g'
394     :silent! exec r . 's/"\s*+\s*\(.\{-\}\)\s*+\s*$/{\1}" +/g'
395     :silent! exec r . 's/"\s*+\s*\(.\{-\}\)\s*);/{\1}");/g'
396     "
397     "ersetze 'Zeilenanfang "'
398     :silent! exec r . 's/\(^\s*\)\("[^"]*{\)/\1$\2/g'
399     :silent! exec r . 's/[^$]\(".*{\)/ $\1/g'
400
401     " mehrere leerzeilen durch eine einzelne ersetzen:
402     :silent! exec r . 's/\s\+$//e'
403     :silent! exec r . 's/\n\{3,}/\r\r/e'
404     :noh
405     call setpos('.', save_pos)
406 endfunction
407
408 function! FixWhitespace()
409     " convert tabs to spaces
410     :retab
411     " remove trailing whitespace
412     :silent! %s/\s\+$//e
413     :silent! g/\s*<!--\**-->\s*/d
414
415     " remov '//******' and '//#####'
416     :silent! g/\/\/\(\*\|#\)*\s*$/d
417     " remove excessive newlines
418     :silent! %s/\n\n\n\+/\r\r/
419     :noh
420 endfunction
421
422 function! UndoCSharStringInterpolation()
423     silent! s/\$"/"/g
424     silent! s/{\(.\{-}\)}/" + \1 + "/g
425 endfunction
426
427 let g:ale_linters = {
428             \   'cpp': ['gcc', 'cppcheck', 'clang'],
429             \   'perl': ['perl', 'perlcritic'],
430             \}
431 let b:ale_warn_about_trailing_whitespace = 1
432 let g:ale_sign_column_always = 1
433 let g:ale_cpp_clang_options =
434             \  '-std=c++14 -Wall -pedantic -fPIC
435             \   -I/usr/include/x86_64-linux-gnu/qt5
436             \   -I/usr/include/x86_64-linux-gnu/qt5/QtPrintSupport
437             \   -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets
438             \   -I/usr/include/x86_64-linux-gnu/qt5/QtGui
439             \   -I/usr/include/x86_64-linux-gnu/qt5/QtCore
440             \   -I/usr/include/libdrm
441             \   -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g+
442             \'
443
444 let g:ale_cpp_gcc_options =
445             \  '-std=c++14 -Wall -pedantic -fPIC
446             \   -I/usr/include/x86_64-linux-gnu/qt5
447             \   -I/usr/include/x86_64-linux-gnu/qt5/QtPrintSupport
448             \   -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets
449             \   -I/usr/include/x86_64-linux-gnu/qt5/QtGui
450             \   -I/usr/include/x86_64-linux-gnu/qt5/QtCore
451             \   -I/usr/include/libdrm
452             \   -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g+
453             \'
454
455 """" ALE end """"
456
457 if has("patch-7.4.354")
458     " Indents word-wrapped lines as much as the 'parent' line
459     set breakindent
460     " Ensures word-wrap does not split words
461     set formatoptions=l
462     set lbr
463 endif
464
465 hi CursorLineNr  ctermbg=black guibg=black
466 hi CursorLine    ctermbg=black guibg=black
467 augroup CursorLine
468     au!
469     au VimEnter,WinEnter,BufWinEnter * setlocal cursorline
470     au WinLeave * setlocal nocursorline
471 augroup END
472
473 packadd! matchit
474
475 let g:acp_enableAtStartup = 1
476 let g:acp_behaviorPerlOmniLength = 0
477 let g:acp_behaviorPhpOmniLength = 0
478 let g:acp_completeoptPreview = 1
479 let g:acp_behaviorPythonOmniLength = 0
480 let g:acp_behaviorXmlOmniLength = 0
481 let g:acp_behaviorHtmlOmniLength = 0
482 let g:acp_behaviorCssOmniPropertyLength = 1
483 let g:acp_behaviorCssOmniValueLength = 0
484
485 highlight ExtraWhitespace ctermfg=red guifg=red ctermbg=white guibg=DarkGrey
486
487 " keine trailing whitespaces in hub log files anzeigen
488 match ExtraWhitespace /\s\+$/
489
490 let g:ale_python_flake8_options = "--max-line-length=120"
491
492 if has("win32")
493     function! CopyFormatted(line1, line2)
494         let prev_number = &number
495         let prev_relativenumber = &relativenumber
496         let prev_background = &background
497         let prev_ft = &ft
498         setlocal number!
499         setlocal relativenumber!
500         setlocal background=light
501         " wenn ft manuel gesetzt war wird das von set background zurueckgesetzt, deswegen gleich wieder setzen
502         exe 'setlocal ft='.expand(prev_ft)
503
504         execute a:line1 . "," . a:line2 . "TOhtml"
505         %yank *
506         !start /min powershell -noprofile "gcb | scb -as"
507         bwipeout!
508
509         if (prev_number)
510             set number
511         endif
512         if (prev_relativenumber)
513             set relativenumber
514         endif
515         exe 'setlocal background='.expand(prev_background)
516         exe 'setlocal ft='.expand(prev_ft)
517     endfunction
518
519     command! -range=% HtmlClip silent call CopyFormatted(<line1>,<line2>)
520 endif
521
522 augroup logfilesgroup
523     autocmd!
524     au! BufRead,BufNewFile *.log    setlocal nowrap |
525                 \ setlocal textwidth=0 |
526                 \ let &colorcolumn=""
527 augroup END
528
529 set suffixes+=.mhp,.backup1,.backup2,.backup3
530
531 " firenvim config
532 let g:firenvim_config = {
533     \ 'globalSettings': {
534         \ 'alt': 'all',
535     \  },
536     \ 'localSettings': {
537         \ '.*': {
538             \ 'cmdline': 'neovim',
539             \ 'content': 'text',
540             \ 'priority': 0,
541             \ 'selector': 'textarea',
542             \ 'takeover': 'never',
543         \ },
544     \ }
545 \ }
546 let fc = g:firenvim_config['localSettings']
547
548
549 " lsp
550 let g:lsp_diagnostics_echo_cursor = 1
551 " Register ccls C++ lanuage server.
552 if executable('ccls')
553    au User lsp_setup call lsp#register_server({
554       \ 'name': 'ccls',
555       \ 'cmd': {server_info->['ccls']},
556       \ 'root_uri': {server_info->lsp#utils#path_to_uri(
557       \     lsp#utils#find_nearest_parent_file_directory(
558       \             lsp#utils#get_buffer_path(),
559       \                 ['compile_commands.json']
560       \     ))},
561       \ 'initialization_options': {
562           \ 'cache': {'directory': expand('~/.cache/ccls') },
563           \},
564       \ 'allowlist': ['ino', 'c', 'cpp', 'objc', 'objcpp', 'cc'],
565       \ })
566 endif
567
568 if executable('typescript-language-server')
569     au User lsp_setup call lsp#register_server({
570                 \ 'name': 'javascript support using typescript-language-server',
571                 \ 'cmd': { server_info->[&shell, &shellcmdflag, 'typescript-language-server --stdio']},
572                 \ 'root_uri': { server_info->lsp#utils#path_to_uri(lsp#utils#find_nearest_parent_directory(lsp#utils#get_buffer_path(), '.git/..'))},
573                 \ 'whitelist': ['javascript', 'javascript.jsx', 'javascriptreact']
574                 \ })
575 endif
576
577
578 "" if executable('pls')
579 ""     au User lsp_setup call lsp#register_server({
580 ""                 \ 'name': 'pls',
581 ""                 \ 'cmd': {server_info->['pls']},
582 ""                 \ 'settings': { 'perl': {
583 ""                 \                    'cwd': getcwd(),
584 ""                 \                    'perlcritic': { 'enabled': 'true' },
585 ""                 \                    'syntax': { 'enabled': 'true' },
586 ""                 \               } },
587 ""                 \ 'allowlist': ['perl'],
588 ""                 \ })
589 "" endif
590
591 function! s:on_lsp_buffer_enabled() abort
592     setlocal omnifunc=lsp#complete
593     setlocal signcolumn=yes
594     nmap <buffer> gd <plug>(lsp-definition)
595     nmap <buffer> gs <plug>(lsp-document-symbol-search)
596     nmap <buffer> gS <plug>(lsp-workspace-symbol-search)
597     nmap <buffer> gr <plug>(lsp-references)
598     nmap <buffer> gi <plug>(lsp-implementation)
599     nmap <buffer> gt <plug>(lsp-type-definition)
600     nmap <buffer> <leader>rn <plug>(lsp-rename)
601     nmap <buffer> <f2> <plug>(lsp-rename)
602     nmap <buffer> [g <plug>(lsp-previous-diagnostic)
603     nmap <buffer> ]g <plug>(lsp-next-diagnostic)
604     nmap <buffer> K <plug>(lsp-hover)
605 endfunction
606
607 augroup lsp_install
608     au!
609     autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
610 augroup END
611
612 let g:lsp_diagnostics_highlights_enabled = 1
613
614 highlight lspReference cterm=underline guifg=red guibg=green
615
616
617 " asyncomplete tabcompletion
618 inoremap <expr> <Tab>   pumvisible() ? "\<C-n>" : "\<Tab>"
619 inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
620 inoremap <expr> <cr>    pumvisible() ? asyncomplete#close_popup() : "\<cr>"
621
622 " netrw
623 inoremap <F4> :Explore<CR>
624 nnoremap <F4> <Esc>:Explore<CR>