vim: update
[shutils.git] / dotfiles / vim / .vimrc
index 78f58a1b9fd69973bd94f306dbc9fee1382ad724..1afa776496a204596986348607661b3d96ab2a07 100644 (file)
 " Purpose:      My personal .vimrc
 " Author:       Stefan Huber
-"
-"Essential resources for vim users
-"  - vim.sf.net -- find tips and scripts for vim and gvim
-"
-"By calling ":help keyword" you get help for the specific
-"option and setting.
 
+"profile start /tmp/profile.log
+"profile func *
+"profile file *
 
-" Pathogen runtime path manipulation
-"call pathogen#infect() "Using the infect method breaks ft detection
-call pathogen#runtime_append_all_bundles()
-
-
-"Activate syntax highlighting
-syntax on
-"Activate filetype plugins: syntax highlighting, indentation, and more
-filetype plugin indent on
 
-set modeline
-set autoindent
-"set tabstop=4
+set nocompatible
+set encoding=utf8
 set number
-set bs=2
-
-"vim-7 and newer has vimspell (spell checker) built in
-if version >= 703
-       set spelllang=de_at,en
-       set tabpagemax=20
-       set colorcolumn=80,+1
-endif
+set backspace=indent,eol,start
 
-"Set some properties for ctags, grep and the size of the
-"most-left column for foldings
 set tagstack
 set grepprg=grep\ -nH\ $*
 set foldcolumn=1
 
-"Set incremental search and highlighted search results
 set incsearch
 set hlsearch
 
+set cursorline
+set laststatus=2
+set scrolloff=4
+
+set listchars=tab:»­,trail:·,eol:$
+set virtualedit=block
+
+set autoindent
+set tabstop=4
+set shiftwidth=4
+set expandtab
+
+if version >= 703
+    set spelllang=de_at,en
+    set tabpagemax=20
+    set colorcolumn=+1
+endif
+
+set wildmode=longest,list:longest
+
+set tags=./tags;/
+
+syntax on
+filetype plugin indent on
+
+" Pathogen runtime path manipulation
+"call pathogen#infect() "Using the infect method breaks ft detection
+call pathogen#runtime_append_all_bundles()
+call pathogen#helptags()
+
 
 "Power saving tip: powertop-homepage
-let &guicursor = &guicursor . ",a:blinkon0"
+"let &guicursor = &guicursor . ",a:blinkon0"
 "According to vim help -- enable mouse in xterm...
 set mouse=a
 
-
-"Open current file with a specific program
-function OpenIn(prog)
-       execute ":!" . a:prog . " % &"
-endfunction
+" Use 256 colors
+set t_Co=256
+let g:CSApprox_attr_map = { 'bold' : 'bold', 'italic' : 'underline', 'sp' : 'bg' }
+colorscheme shuber-wombat
 
 
 " Use the below highlight group when displaying bad whitespace is desired.
 highlight BadWhitespace ctermbg=red guibg=red
 " Make trailing whitespace be flagged as bad.
-au Filetype python,tex,c,cpp,cs,objc,java syn match BadWhitespace /\s\+$/ containedin=ALL
+au Filetype python,tex,c,cpp,cs,objc,java,vim syn match BadWhitespace /\s\+$/ containedin=ALL
+au Filetype python,tex,c,cpp,cs,objc,java,vim let g:airline#extensions#whitespace#enabled = 0
 
-" set list to activate 
-set listchars=tab:»­,trail:·,eol:$
+
+" Detect indentation, but otherwise set expandtab
+if exists(":DetectIndent")
+    au BufReadPost * :DetectIndent
+endif
 
 
+let g:syntastic_mode_map = { 'mode' : 'active', 'active_filetypes' : [], 'passive_filetypes' : ['html'] }
 
 
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
-"  fortran
-""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+"  Airline
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-"let fortran_free_source=1
-au BufNewFile *.f90            set fortran_free_source=1
-au BufRead,BufNewFile *.INC    set filetype=fortran
-au Filetype fortran            set cindent cst csto=0
+let g:airline_powerline_fonts = 0
+let g:airline_theme = 'wombat'
 
+let g:airline#extensions#tabline#enabled = 1
+let g:airline#extensions#tagbar#enabled = 0
+let g:airline#extensions#whitespace#enabled = 0
+let g:airline#extensions#branch#enabled = 1
+let g:airline#extensions#branch#use_vcscommand = 1
 
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+"  Some macros
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+"Open current file with a specific program
+function OpenIn(prog)
+    execute ":!" . a:prog . " % &"
+endfunction
 
 
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
-"  IRSSI logs
+"  key bindings
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-au BufRead,BufNewFile */.irssi/logs/*.log    set filetype=irssilog
+nmap <s-PageDown> :bn<CR>
+nmap <s-PageUp>   :bp<CR>
+
+map <a-c> <plug>NERDCommenterToggle
+nmap <F9> :NERDTreeToggle<CR>
+nmap <F10> :TagbarToggle<CR>
+
+"nmap <c-q> :q<CR>
+"nmap <c-s> :w<CR>
+"vmap <c-s> <Esc><c-s>gv
+"imap <c-s> <c-o><c-s>
 
 
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
-"  Easychair conference system review form
-"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+"  fortran
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-au BufRead,BufNewFile review_form_*.txt set filetype=easychair
-au Syntax easychair runtime! syntax/easychair.vim
+"let fortran_free_source=1
+au BufNewFile *.f90     set fortran_free_source=1
+au Filetype fortran     set cindent cst csto=0
 
 
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 "  C, C++, C#, objc, java
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-au Filetype c,cpp,cs,objc,java map <F4> :cnext <CR>
-au Filetype c,cpp,cs,objc,java map <S-F4> :cprevious <CR>
-au Filetype c,cpp,cs,objc,java map <F11> :AS <CR>
-au Filetype c,cpp,cs,objc,java map <S-F11> :A <CR>
+au Filetype c,cpp,cs,objc,java map <buffer> <F4> :cnext <CR>
+au Filetype c,cpp,cs,objc,java map <buffer> <S-F4> :cprevious <CR>
+au Filetype c,cpp,cs,objc,java map <buffer> <F11> :AS <CR>
+au Filetype c,cpp,cs,objc,java map <buffer> <S-F11> :A <CR>
 au Filetype c,cpp,cs,objc,java set cindent cst csto=0
-au Filetype c,cpp,cs,objc map <F7> :make <CR>
-au Filetype java map <F7> :!ant -f ../build.xml <CR>
-au Filetype c,cpp,cs,obj set makeprg=make
-au Filetype c,cpp,cs,obj set tabstop=4
-au Filetype c,cpp,cs,obj set shiftwidth=4
-
-
-"Adds STL prefix 'std::' to 'id'
-function AddNamespaceDeclTo(ns, id)
-       echo "Add '" . a:ns . "' to " . a:id
-       "Line starts with a:id
-       execute ":%s!^\\(\\s*\\)" . a:id . "\\>!\\1" . a:ns . "::" . a:id . "!e"
-       "Line beginning, white space, not # or / (preprocessor or comment)
-       execute ":%s!^\\(\\s*[^#/].*[^:]\\)\\<" . a:id . "\\>!\\1" . a:ns . "::" . a:id . "!ge"
+au Filetype c,cpp,cs,objc map <buffer> <F7> :make <CR>
+au Filetype java map <buffer> <F7> :!ant -f ../build.xml <CR>
+au Filetype c,cpp,cs,objc set makeprg=make
+
+
+"Prepend the namespace to an identifier, e.g. 'std::' before 'map' excluding
+"those in C/C++ comments.
+function PrependCppNamespaceToIdent(ns, id)
+
+    "     To match                   Not to match
+    "
+    "|id                        |// id
+    "|    id                    |// /* */ id
+    "|/* */ /* */ id            |/* */ // id
+    "|id /* */                  |/* id
+    "|*/ id                     | * id
+    "                           |/* id */
+    "                           |::id
+    "                           |/**/ ::id
+       "                           |#include <id>
+    "
+    " In order to not match '* id' it is assumed that multi-line comment lines
+    " in the middle begin with a star.
+
+    " If #include and // and /* and ^* and :: is not prepend:
+    execute ':%s@\(\(#include\|\/\/\|\/\*\|^\s*\*[^/]\).*\|::\)\@<!\<' . a:id . '\>@' . a:ns . '::' . a:id . '@ge'
+    " If #include and // and :: is not prepend, but */ is, and no further /* or // are found
+    execute ':%s@\(\(#include\|\/\/\).*\)\@<!\*\/\(\/[^\/\*]\|[^\/]\)*\zs\(::\)\@<!\<' . a:id . '\>@' . a:ns . '::' . a:id . '@ge'
+
 endfunction
 
+"Prepend STL namespace 'std::' to several identifiers
+function PrependSTLNamespace()
+       " This list of identifier is not complete, but adding all of them is too
+       " much. We rather like to add identifieres that are 'typical' for C++.
+       " Others, like 'move' are likely to not be C++ specific. In this cases the
+       " user is asked to call PrependCppNamespaceToIdent by hand.
+    let id = []
+    let id = id +['cin', 'cout', 'cerr', 'endl']
+    let id = id +['swap', 'sort', 'max', 'min']
+    let id = id +['vector', 'deque', 'list', 'map', 'multimap', 'set']
+    let id = id +['queue', 'stack', 'priority_queue']
+    let id = id +['ostream', 'istream', 'sstream']
+    let id = id +['pair', 'string']
+
+    for i in id
+        call PrependCppNamespaceToIdent("std", i)
+    endfor
+endfunction
 
-"Adds STL prefix 'std::' to several identifiers
-function AddSTLNamespaceDecl()
-       call AddNamespaceDeclTo("std","cin")
-       call AddNamespaceDeclTo("std","cout")
-       call AddNamespaceDeclTo("std","cerr")
-
-       call AddNamespaceDeclTo("std","swap")
-       call AddNamespaceDeclTo("std","sort")
-       call AddNamespaceDeclTo("std","max")
-       call AddNamespaceDeclTo("std","min")
-
-       call AddNamespaceDeclTo("std","deque")
-       call AddNamespaceDeclTo("std","endl")
-       call AddNamespaceDeclTo("std","list")
-       call AddNamespaceDeclTo("std","map")
-       call AddNamespaceDeclTo("std","multimap")
-       call AddNamespaceDeclTo("std","ostream")
-       call AddNamespaceDeclTo("std","pair")
-       call AddNamespaceDeclTo("std","priority_queue")
-       call AddNamespaceDeclTo("std","set")
-       call AddNamespaceDeclTo("std","queue")
-       call AddNamespaceDeclTo("std","stack")
-       call AddNamespaceDeclTo("std","string")
-       call AddNamespaceDeclTo("std","vector")
+function EscapeHexToChar()
+    echo 'Call "x/Nxb addr" in GDB to print N bytes at addr'
+    execute '%s/^.*://'
+    execute '%s/\s*0x\(\x\x\)/\\x\1/g'
+    execute '%s/^\(.*\)$/"\1"/'
 endfunction
 
+function InsertIncludeGuardsWithoutEndif()
+       let gatename = substitute(expand("%:t"), "\\.", "_", "g") . '_' . strpart(system('pwgen -c 16 1'), 0, 16)
+       execute "normal! i#ifndef " . gatename
+       execute "normal!   o#define " . gatename
+endfunction
 
-function EscapeHexToChar()
-       echo 'Call "x/Nxb addr" in GDB to print N bytes at addr' 
-       execute '%s/^.*://'
-       execute '%s/\s*0x\(\x\x\)/\\x\1/g'
-       execute '%s/^\(.*\)$/"\1"/'
+function AddIncludeGuards()
+       execute "normal! Go#endif"
+       execute "normal! gg"
+       call InsertIncludeGuardsWithoutEndif()
 endfunction
 
+autocmd BufNewFile *.{h,hpp,hxx} call AddIncludeGuards()
 
 
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
@@ -159,15 +211,20 @@ endfunction
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
 au Filetype text set textwidth=80
+au Filetype markddown set textwidth=80
 "According to thunderbirds settings
 au Filetype mail set textwidth=72
+au Filetype mail set expandtab
 
 "a and w reformat the paragraph automatically and a new paragraph
 "is indicated by lines not ending with white-space
 if version>=700
-       au Filetype mail,text set fo+=n spell
+    au Filetype mail,text set fo+=n spell
 endif
 
+"Scissor line
+au Filetype mail syn match Statement /^\s*-*\s*>8\s*-*\s*$/
+au Filetype mail syn match Statement /^\s*-*\s*8<\s*-*\s*$/
 
 
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
@@ -176,137 +233,205 @@ endif
 
 "au Filetype php set fo=tcqn
 if version >= 700
-       au Filetype php set spell
+    au Filetype php set spell
 endif
 
 au Filetype php set textwidth=80
 "au Filetype php set cindent
 
 
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+"  maxima
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+au BufRead,BufNewFile *.wxm set filetype=maxima
 
 
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 "  LaTeX
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
+
+let g:LatexBox_split_side = "rightbelow"
+"let g:LatexBox_split_resize = 1
+let g:LatexBox_ref_pattern = '\c\\\a*ref\*\?\_\s*{'
+
+let g:tex_flavor = "latex"
+let g:LatexBox_output_type = "pdf"
+let g:LatexBox_viewer = "okular"
+let g:LatexBox_latexmk_async = 1
+let g:LatexBox_latexmk_preview_continuously = 1
+"let g:LatexBox_show_warnings = 0
+let g:LatexBox_quickfix = 4
+
+
+if version >= 700
+    au Filetype tex set spell
+endif
+
 au BufRead,BufNewFile *.cls set filetype=tex
 au Filetype tex set textwidth=80
+au Filetype tex set smartindent
+" Override Tagbar Toggle with LatexBox TOC
+au Filetype tex nmap <buffer> <F10> :LatexTOCToggle<CR>
+au Filetype tex nmap <buffer> <F11> :LatexLabels<CR>
+
 
 "Remove Umlaute
 function TexTransUmlaute()
-       execute ':%s/ü/\\\"u/ge'
-       execute ':%s/Ü/\\\"U/&'
-       execute ':%s/ö/\\\"o/&'
-       execute ':%s/Ö/\\\"O/&'
-       execute ':%s/ä/\\\"a/&'
-       execute ':%s/Ä/\\\"A/&'
-       execute ':%s/ß/\\\"s/&'
-       execute ':%s/²/\^2/&'
+    execute ':%s/ü/\\\"u/ge'
+    execute ':%s/Ü/\\\"U/&'
+    execute ':%s/ö/\\\"o/&'
+    execute ':%s/Ö/\\\"O/&'
+    execute ':%s/ä/\\\"a/&'
+    execute ':%s/Ä/\\\"A/&'
+    execute ':%s/ß/\\\"s/&'
+    execute ':%s/²/\^2/&'
 endfunction
 
-
 function FindWordRepeatings()
-       execute '/\(\<\S\+\>\)\s\+\1\>'
+    execute '/\(\<\S\+\>\)\s\+\1\>'
 "        let pos = search('\(\<\S\+\>\)\s\+\1\>', "cw")
 "        call cursor(pos)
 endfunction
 
 
-let g:tex_flavor = "latex"
-let g:LatexBox_viewer="okular"
-let g:LatexBox_latexmk_options="-pvc"
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+"  python
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-au Filetype tex set smartindent
+au Filetype python map <buffer> <F5> :!python % <CR>
 
-au Filetype tex set tabstop=4
-au Filetype tex set shiftwidth=4
+" vimrc file for following the coding standards specified in PEP 7 & 8.
 
-au Filetype tex map! ,b \begin{}<Esc>i
-au Filetype tex map! ,e <esc>:call TexClosePrev(0)<cr>a<cr>
-au Filetype tex map! ,i \begin{itemize}<Return>\end{itemize}<ESC>O\item 
-au Filetype tex map! ,f \begin{frame}<Return>\end{frame}<ESC>O\frametitle{
-au Filetype tex map! ,p \begin{figure}<Return>\end{figure}<ESC>O\centering<Return>\includegraphics{
+" Number of spaces that a pre-existing tab is equal to.
+" For the amount of space used for a new tab use shiftwidth.
+au Filetype python set shiftwidth=4
+au Filetype python set expandtab
 
+" Wrap text after a certain number of characters
+au Filetype python set textwidth=79
 
 
-if version >= 700
-       au Filetype tex set spell
-endif
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+"  XML, Ipe
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
+"Opens the current file in ipe
+au BufRead,BufNewFile *.ipe set filetype=ipe
+au Filetype xml,ipe map <buffer> <M-o> :call OpenIn("ipe") <CR>
 
+au Filetype xml let g:tagbar_sort = 0
+let g:tagbar_type_xml = {
+  \ 'ctagstype' : 'xml',
+  \ 'kinds' : [
+    \ 't:Tag'
+  \ ]
+\ }
 
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
-"  python
+"  gnuplot
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-au Filetype python map <F5> :!python % <CR>
+"Opens the current file in ipe
+au Filetype gnuplot map <buffer> <M-o> :call OpenIn("gnuplot -persist") <CR>
 
 
-" vimrc file for following the coding standards specified in PEP 7 & 8.
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+"  remind
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-" Number of spaces that a pre-existing tab is equal to.
-" For the amount of space used for a new tab use shiftwidth.
-au Filetype python set tabstop=4
-au Filetype python set shiftwidth=4
-au Filetype python set expandtab
+au BufRead,BufNewFile */.remind/* set filetype=remind
 
-" Wrap text after a certain number of characters
-au BufRead,BufNewFile *.py,*.pyw set textwidth=79
 
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+"  vim-orgmode
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
+au BufRead,BufNewFile *.org set filetype=org
+let g:org_todo_keywords=['TODO', 'FEEDBACK', 'VERIFY', '|', 'DONE', 'DELEGATED']
+let g:org_todo_keyword_faces = [['FEEDBACK', 'magenta'], ['TODO', 'yellow']]
 
 
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
-"  XML, Ipe
+"  markdown
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-"Opens the current file in ipe
-au Filetype xml map <M-o> :call OpenIn("ipe") <CR>
+let g:instant_markdown_autostart = 0
+let g:instant_markdown_slow = 1
+au Filetype markdown map <buffer> <F5> :InstantMarkdownPreview<CR>
+au Filetype markdown let g:tagbar_sort = 0
+
+let g:tagbar_type_markdown = {
+  \ 'ctagstype' : 'markdown',
+  \ 'kinds' : [
+    \ 'h:Heading_L1',
+    \ 'i:Heading_L2',
+    \ 'k:Heading_L3'
+  \ ]
+\ }
+
+if executable('marktag')
+    let g:tagbar_type_markdown = {
+        \ 'ctagstype' : 'markdown',
+        \ 'ctagsbin' : 'marktag',
+        \ 'kinds' : [
+            \ 'h:header'
+        \ ],
+        \ 'sro' : '.',
+        \ 'kind2scope' : {
+            \ 'h' : 'header'
+        \  },
+        \ 'scope2kind' : {
+            \ 'header' : 'h'
+        \ }
+    \ }
+end
 
 
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
-"  gnuplot
+"  youcompleteme
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
+let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
 
-au BufRead,BufNewFile *.plt              set filetype=gnuplot
-au BufRead,BufNewFile *.plot      set filetype=gnuplot
-au BufRead,BufNewFile *.gnuplot   set filetype=gnuplot
+let g:ycm_min_num_of_chars_for_completion = 4
+let g:ycm_collect_identifiers_from_tags_files = 1
+let g:ycm_autoclose_preview_window_after_completion = 1
 
-"Opens the current file in ipe
-au Filetype gnuplot map <M-o> :call OpenIn("gnuplot -persist") <CR>
+let g:ycm_key_list_select_completion = ['<Down>']
+nnoremap <buffer> <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
+
+let g:ycm_filetype_whitelist = { 'c' : 1, 'cpp' : 1, 'cs' : 1, 'objc' : 1, 'java' : 1, 'python' : 1 }
 
+"let g:ycm_server_use_vim_stdout = 1
+"let g:ycm_server_log_level = 'debug'
 
 
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
-"  Commenting
+"  syntastic
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-let g:EnhCommentifyUseAltKeys = 'Yes'
-
+let g:ycm_show_diagnostics_ui = 0
+let g:syntastic_c_checkers = ["cppcheck"]
+let g:syntastic_cpp_checkers = g:syntastic_c_checkers
 
 
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
-"  Tab completion
+"  signify
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-"function InsertTabWrapper()
-"    let col = col('.') - 1
-"    if !col || getline('.')[col - 1] !~ '\k'
-"        return "\<tab>"
-"    else
-"        return "\<c-p>"
-"    endif
-"endfunction
+let g:signify_vcs_list = ['git']
+
 
-" Remap the tab key to select action with InsertTabWrapper
-"inoremap <C-space> <c-r>=InsertTabWrapper()<cr>
 
-let g:SuperTabMappingForward = "<C-space>"
-let g:SuperTabDefaultCompletionType = 'context'
-"let g:SuperTabDefaultCompletionType = '<c-x><c-u>'
 
+if filereadable($HOME . "/.vimrc-local")
+    source ~/.vimrc-local
+endif
 
-source ~/.vimrc-local
+" Being able to load project specific vimrc files
+set exrc
+set secure