use cursorline
[dotvim.git] / 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 isdirectory( b:vim_conf_dir . '/tmp/') == 0
9     call mkdir(b:vim_conf_dir.'/tmp/', 'p', 0700)
10 endif
11
12
13 "load plugins
14 if filereadable(b:vim_conf_dir . '/plugins.vundel.vim')
15     exec 'source ' . b:vim_conf_dir . '/plugins.vundel.vim'
16 endif
17 "
18 " auskommentiert, macht in screen das nix gut aussieht..
19 "set termguicolors
20 set background=dark
21 try
22     let g:gruvbox_contrast_dark = 'hard'
23     let g:gruvbox_italicize_comments = 0
24     colorscheme gruvbox
25 catch /^Vim\%((\a\+)\)\=:E185/
26     "  wird evtl rest instlliert... E185 heißt nicht gefunden..
27 endtry
28
29 syntax on
30
31 set backspace=indent,eol,start
32 set relativenumber
33 set number
34 set lazyredraw
35
36 set autoindent
37 set expandtab
38 set tabstop=4
39 set softtabstop=4
40 set shiftwidth=4
41
42 set pastetoggle=<F3>
43
44 set encoding=utf-8
45 set modeline
46
47 set history=50
48 set noerrorbells
49 set visualbell t_vb=
50 set hidden
51 set nojoinspaces
52 set nrformats=
53 set ttymouse=xterm2
54 set mouse=a
55
56 " Tab-completion in command-line mode
57 set path+=**
58 set wildmode=full
59 set wildmenu
60 set wildignore=*.pdf,*.fo,
61 set title
62
63 " Appearance
64 set ruler
65 set showmode
66 set showcmd
67 set laststatus=2
68 set hlsearch
69 set incsearch
70 set ignorecase
71 set smartcase
72
73 " remove =, thus 'gf' works whit filepath asignemens like myvar=/path/tofile
74 set isfname-==
75
76 let perl_include_pod = 1
77 augroup PerlSettings
78     autocmd!
79     autocmd FileType perl setlocal complete-=i
80 augroup END
81
82 let mapleader = ","
83
84 nnoremap <F8> ]s
85 nnoremap <S-F8> [s
86 nnoremap Z Y
87
88 " Window switching
89 nnoremap <C-k> <C-W>k
90 nnoremap <C-j> <C-W>j
91 nnoremap <C-h> <C-W>h
92 nnoremap <C-l> <C-W>l
93
94 nnoremap <Leader>i a'" <<  << "' <Esc>6hi
95 nnoremap <Leader>a a'{}' <Esc>2hi
96 nnoremap <Leader>A a'"+  +"' <Esc>4hi
97 autocmd FileType cpp nnoremap <Leader>a a'"<<  <<"' <Esc>5hi
98
99 " see :h restore-position
100 nnoremap <Leader>= msgg=G`s
101
102 inoremap kj <Esc>
103 inoremap jk <Esc>
104 inoremap ts<tab> // TODOts: <Esc>=$A
105 inoremap obs<tab> /// <para><CR> OBSOLETE kann nach der Abspaltung von 1.12 entfernt werden<CR><Esc>=$A
106 inoremap no<tab> <Esc>0i <nodoc /><Esc>0i///<Esc>=$
107 inoremap td<tab> <Esc>0i//TODOts: doku<CR><summary> </summary><Esc>0i/// <Esc>kVj=$
108
109 autocmd InsertEnter * set timeoutlen=500
110 autocmd InsertLeave * set timeoutlen=1000
111
112 inoremap in<tab> <Esc>0i<inheritdoc /><Esc>0i///<Esc>V=
113
114 " do not use ex mode
115 map Q <Nop>
116
117 nnoremap <C-p> :bprev<CR>
118 nnoremap <C-n> :bnext<CR>
119
120 nnoremap <leader>e :tabedit $MYVIMRC<CR>
121
122 nnoremap  ZZ :wqall<CR>
123 nnoremap  <F6> :wa<CR>:make -j 8<CR><CR>
124 inoremap  <F6> <esc>:wa<CR>:make -j 8<CR><CR>
125
126 nnoremap  <F5> :wa\|!./%<CR>
127 inoremap  <F5> <esc>:wa\|!./%<CR>
128
129 nnoremap <C-l> <C-W>l
130
131 " Copy paste to/from system clipboard
132 vnoremap <C-c> "*y
133 noremap  <C-v> "*p
134 noremap  <C-V> "*p
135 inoremap <C-v> <esc>"*p
136 vnoremap <C-v> "*p
137
138 "nnoremap <Leader>= mzgg=G`z<CR>
139 nnoremap <F2> :call FormatDocument()<CR>
140 " write using sudo.
141 cmap w!! w !sudo tee > /dev/null %
142 "
143 "move visually selected
144
145 vnoremap <M-j> :m '>+1<CR>gv=gv
146 vnoremap <M-k> :m '<-2<CR>gv=gv
147 nnoremap <M-k> :m -2<CR>==
148 nnoremap <M-j> :m +1<CR>==
149
150 " repeat last command on all selected:
151 vnoremap . :normal.<CR>
152
153 vnoremap <leader>tt :Tabular /^[^-+=]*\zs\S*=/l1l1<cr>
154 vnoremap <leader>t, :Tabular /,\zs/l1l1<cr>
155 vnoremap <leader>t<space>  :Tabular /\s\+\zs/l1l0<cr>
156 vnoremap <leader>t:        :Tabular /:\zs/l1l0<cr>
157 vnoremap <leader>t(  :Tabular /(/l1l0<cr>
158 "
159 " append word under cursor with 'or' to current search pattern
160 nnoremap <Leader>s yiw/<C-R>/\\|<C-R>"<cr>
161 " append selection with 'or' to current search pattern
162 vnoremap <Leader>s y/<C-R>/\\|<C-R>"<cr>
163
164 cmap w!! w !sudo tee % >/dev/null
165 nnoremap <Leader>mh :wa<CR>:silent !mhsend -run reload code<CR>:redraw!<CR>
166 nnoremap <Leader>ll iprint_log("");<Esc>V=0f(la
167
168 if has('win32')
169     nnoremap <Leader>r :source ~/vimfiles/vimrc<CR>
170 else
171     nnoremap <Leader>r :source ~/.vim/vimrc<CR>
172 endif
173
174 filetype plugin indent on
175
176 " ack seems to have vanished from artfull, thus use silversearchger-ag
177 " for ack.vim:
178 if executable('ag')
179     let g:ackprg = 'ag --vimgrep'
180 endif
181
182 set list listchars=tab:→\ ,trail:·
183
184 hi Visual  guifg=White guibg=Blue gui=bold
185
186 set diffopt+=vertical
187 "set diffopt+=iwhite
188 set diffopt+=algorithm:patience
189 "jump to next diff and center line
190 noremap <leader>n ]cz.
191 noremap <leader>p [cz.
192 if has ('win32')
193     set guifont=DejaVu_Sans_Mono:h11:cANSI:qDRAFT
194 endif
195 if &diff
196     " ignore whitespace
197     set diffopt+=vertical
198     set diffopt+=iwhite
199     set diffopt+=algorithm:patience
200
201     syntax off
202     highlight DiffText term=reverse cterm=reverse ctermfg=214 ctermbg=234 gui=reverse guifg=lightgreen guibg=DarkGreen
203     " go fullscreen:
204     if has ('win32')
205         autocmd GuiEnter * simalt ~x
206         set guifont=DejaVu_Sans_Mono:h8:cANSI:qDRAFT
207     endif
208     " make all diff windows the same size
209     autocmd VimResized * wincmd =
210     autocmd VimEnter *  2wincmd w
211     autocmd VimEnter *  syntax off
212     autocmd VimEnter * set guioptions+=b
213     set relativenumber!
214     set number
215 else
216     if has("gui_running")
217         set lines=999 columns=120
218     endif
219     " from /etc/vim/vimrc (restore last editing position)
220     if has("autocmd")
221         au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
222     endif
223
224     set textwidth=120
225     let &colorcolumn="121"
226     highlight ColorColumn ctermbg=lightgray guibg=lightcyan
227
228 endif
229
230
231 " remove currently unused fugitive buffers:
232 autocmd BufReadPost fugitive://* set bufhidden=delete
233
234 " reset terminal colors after vim leaves
235 "if !has("gui_running")
236 "    au VimLeave * !echo -ne "\033[0m"
237 "endif
238
239 " macht dass auch in screen auf dem server der vollstaendige hintergund gmalt
240 " wird.
241 set t_ut=
242
243 if has ('win32') || has('win32unix')
244     let g:vimwiki_list = [
245                 \{
246                 \   'path':'~/vimwiki',
247                 \   'path_html':'~/vimwiki/html/',
248                 \   'syntax': 'markdown',
249                 \   'ext': '.md'
250                 \ }
251                 \ ]
252 else
253     let g:vimwiki_list = [
254                 \ {
255                 \   'path':'~/p/wiki',
256                 \   'path_html':'~/p/wiki/html/',
257                 \   'syntax': 'markdown',
258                 \   'ext': '.md'
259                 \ }
260                 \ ]
261 endif
262
263 "" tmp files:
264 if isdirectory( b:vim_conf_dir . '/tmp/backup') == 0
265     call mkdir(b:vim_conf_dir.'/tmp/backup', 'p', 0700)
266 endif
267 exec 'set backupdir='. b:vim_conf_dir.'/tmp/backup//'
268 set backup
269
270 " Save your swp files to a less annoying place than the current directory.
271 " If you have .vim-swap in the current directory, it'll use that.
272 " Otherwise it saves it to ~/.vim/swap, ~/tmp or .
273 if isdirectory( b:vim_conf_dir . '/tmp/swap') == 0
274     call mkdir(b:vim_conf_dir.'/tmp/swap', 'p', 0700)
275 endif
276 exec 'set directory='. b:vim_conf_dir.'/tmp/swap//'
277
278 " viminfo stores the the state of your previous editing session
279 if has('win32')
280     set viminfo+=n~/vimfiles/tmp/viminfo
281 else
282     set viminfo+=n~/.vim/tmp/viminfo
283 endif
284
285 " letzte suche beim öffnen einer Datei sofort wieder anzeigen
286 set viminfo-=h
287
288 if exists("+undofile")
289     " undofile - This allows you to use undos after exiting and restarting
290     " This, like swap and backups, uses .vim-undo first, then ~/.vim/undo
291     " :help undo-persistence
292     " This is only present in 7.3+
293     if isdirectory( b:vim_conf_dir . '/tmp/undo') == 0
294         call mkdir(b:vim_conf_dir.'/tmp/undo', 'p', 0700)
295     endif
296     exec 'set undodir='. b:vim_conf_dir.'/tmp/undo'
297     set undofile
298 endif
299
300 " format document
301 function! FormatDocument()
302     let save_pos = getpos(".")
303     normal gg=G
304     call setpos('.', save_pos)
305     echom "formatiert.."
306 endfunction
307
308 noremap <Leader>x :call XmlPretty()<cr>
309 " reformat xml stuff
310 function! XmlPretty()
311     let save_pos = getpos(".")
312     :silent! %s/&lt;/</g
313     :silent! %s/&gt;/>/g
314     :silent! %s/></>\r</g
315     :set ft=xml
316     :normal mzgg=G`z
317     call setpos('.', save_pos)
318 endfunction
319
320 " fix logger stuff to use the newer api call
321 " remove #regions and whitspaces
322 " use {var} instead of " + var + "
323 noremap <Leader>fx ma:1,$ call FixCsharp()<cr>'a
324 function! FixCsharp()
325     let save_pos = getpos(".")
326     " regions entfernen;
327     :silent! %g/^\s*#\(end\)\{0,1\}region/d
328
329     :silent! %g/\.WriteException(/normal 0df,$^iLog.Exception(\eV=
330     :silent! %g/\.WriteMessage(/normal 0f(ldf."ayiw0P0xlveu0iLog.\eelcf,(\eld0$^PV=
331
332     " '+ varname +' durch '{varname}' ersetzen
333     :silent! %s/"\s*+\s*\(.\{-\}\)\s*+\s*"/{\1}/g
334     :silent! %s/"\s*+\s*\(.\{-\}\)\s*+\s*$/{\1}" +/g
335     :silent! %s/"\s*+\s*\(.\{-\}\)\s*);/{\1}");/g
336     "
337     "ersetze 'Zeilenanfang "'
338     :silent! %s/\(^\s*\)\("[^"]*{\)/\1$\2/g
339     :silent! %s/[^$]\(".*{\)/$\1/g
340
341     " mehrere leerzeilen durch eine einzelne ersetzen:
342     :silent! %s/\s\+$//e
343     :silent! %s/\n\{3,}/\r\r/e
344     :noh
345     call setpos('.', save_pos)
346 endfunction
347
348 function! FixWhitespace()
349     " convert tabs to spaces
350     :retab
351     " remove trailing whitespace
352     :silent! %s/\s\+$//e
353     :silent! g/\s*<!--\**-->\s*/d
354
355     " remov '//******' and '//#####'
356     :silent! g/\/\/\(\*\|#\)*\s*$/d
357     " remove excessive newlines
358     :silent! %s/\n\n\n\+/\r\r/
359     :noh
360 endfunction
361
362 function! UndoCSharStringInterpolation()
363     silent! s/\$"/"/g
364     silent! s/{\(.\{-}\)}/" + \1 + "/g
365 endfunction
366
367 """" ALE start """"
368 inoremap <F4> <Esc>:ALEToggle<CR>
369 nnoremap <F4> <Esc>:ALEToggle<CR>
370 let g:ale_linters = {
371             \   'cpp': ['gcc', 'cppcheck', 'clang'],
372             \   'perl': ['perl', 'perlcritic'],
373             \}
374 let b:ale_warn_about_trailing_whitespace = 1
375 let g:ale_sign_column_always = 1
376 let g:ale_cpp_clang_options =
377             \  '-std=c++14 -Wall -pedantic -fPIC
378             \   -I/usr/include/x86_64-linux-gnu/qt5
379             \   -I/usr/include/x86_64-linux-gnu/qt5/QtPrintSupport
380             \   -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets
381             \   -I/usr/include/x86_64-linux-gnu/qt5/QtGui
382             \   -I/usr/include/x86_64-linux-gnu/qt5/QtCore
383             \   -I/usr/include/libdrm
384             \   -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g+
385             \'
386
387 let g:ale_cpp_gcc_options =
388             \  '-std=c++14 -Wall -pedantic -fPIC
389             \   -I/usr/include/x86_64-linux-gnu/qt5
390             \   -I/usr/include/x86_64-linux-gnu/qt5/QtPrintSupport
391             \   -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets
392             \   -I/usr/include/x86_64-linux-gnu/qt5/QtGui
393             \   -I/usr/include/x86_64-linux-gnu/qt5/QtCore
394             \   -I/usr/include/libdrm
395             \   -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g+
396             \'
397
398 """" ALE end """"
399
400 if has("patch-7.4.354")
401     " Indents word-wrapped lines as much as the 'parent' line
402     set breakindent
403     " Ensures word-wrap does not split words
404     set formatoptions=l
405     set lbr
406 endif
407
408 hi CursorLineNr  ctermbg=black guibg=black
409 hi CursorLine    ctermbg=black guibg=black
410 augroup CursorLine
411   au!
412   au VimEnter,WinEnter,BufWinEnter * setlocal cursorline
413   au WinLeave * setlocal nocursorline
414 augroup END
415
416 packadd! matchit
417
418 let g:acp_enableAtStartup = 1
419 let g:acp_behaviorPerlOmniLength = 0
420 let g:acp_behaviorPhpOmniLength = 0
421 let g:acp_completeoptPreview = 1
422 let g:acp_behaviorPythonOmniLength = 0
423 let g:acp_behaviorXmlOmniLength = 0
424 let g:acp_behaviorHtmlOmniLength = 0
425 let g:acp_behaviorCssOmniPropertyLength = 1
426 let g:acp_behaviorCssOmniValueLength = 0
427
428 highlight ExtraWhitespace ctermfg=red guifg=red ctermbg=white guibg=DarkGrey
429
430 " keine trailing whitespaces in hub log files anzeigen
431 match ExtraWhitespace /\s\+$/
432
433 let g:ale_python_flake8_options = "--max-line-length=120"
434
435 if has("win32")
436     function! CopyFormatted(line1, line2)
437         let prev_number = &number
438         let prev_relativenumber = &relativenumber
439         let prev_background = &background
440         let prev_ft = &ft
441         setlocal number!
442         setlocal relativenumber!
443         setlocal background=light
444         " wenn ft manuel gesetzt war wird das von set background zurueckgesetzt, deswegen gleich wieder setzen
445         exe 'setlocal ft='.expand(prev_ft)
446
447         execute a:line1 . "," . a:line2 . "TOhtml"
448         %yank *
449         !start /min powershell -noprofile "gcb | scb -as"
450         bwipeout!
451
452         if (prev_number)
453             set number
454         endif
455         if (prev_relativenumber)
456             set relativenumber
457         endif
458         exe 'setlocal background='.expand(prev_background)
459         exe 'setlocal ft='.expand(prev_ft)
460     endfunction
461
462     command! -range=% HtmlClip silent call CopyFormatted(<line1>,<line2>)
463 endif