]> ruderich.org/simon Gitweb - config/dotfiles.git/blobdiff - vimrc
vimrc: map <C-]> to tjump
[config/dotfiles.git] / vimrc
diff --git a/vimrc b/vimrc
index 40e95ba3c9a798419ca7a1753859c1c8c1ff2fe8..c9726f2bbcfc6e85b5e19bded501f4b55a350713 100644 (file)
--- a/vimrc
+++ b/vimrc
@@ -1,6 +1,6 @@
 " Vim main configuration file.
 
-" Copyright (C) 2008-2012  Simon Ruderich
+" Copyright (C) 2008-2016  Simon Ruderich
 "
 " This file is free software: you can redistribute it and/or modify
 " it under the terms of the GNU General Public License as published by
@@ -21,7 +21,8 @@
 " Save 'runtimepath' in case it was changed by the system's configuration
 " files. Also save 'diff' as set all& resets it; but somehow later (after
 " sourcing the vimrc - for example in a VimEnter autocmd) it gets
-" automagically restored to the correct value.
+" automagically restored to the correct value. Not sure what exactly Vim is
+" doing there.
 if has('eval')
     let s:save_runtimepath = &runtimepath
     let s:save_diff = &diff
@@ -40,6 +41,16 @@ endif
 " Make sure Vim (and not Vi) settings are used.
 set nocompatible
 
+" Disallow :autocmd, shell and write commands in .vimrc and .exrc files in the
+" current directory. Only used if 'exrc' is enabled (off by default),
+" precaution just in case somebody enables 'exrc'.
+set secure
+
+" Try to use pipes instead of temporary files. Prevents some auto commands
+" from running for temporary files but also prevents the file's content to be
+" written to disk.
+set noshelltemp
+
 " Use UTF-8 for all internal data (buffers, registers, etc.). This doesn't
 " affect reading files in different encodings, see 'fileencodings' for that.
 set encoding=utf-8
@@ -49,13 +60,15 @@ set encoding=utf-8
 set runtimepath-=~/.vim
 set runtimepath^=~/.vim,~/.vim/runtime
 
-" Don't store swap files in the same directory as the edited file. But only if
+" Don't store swap files in the same directory as the edited file, but only if
 " we have a "safe" writable directory available.
 if filewritable('~/.tmp') == 2 || filewritable('~/tmp') == 2
     set directory-=.
 endif
 " But store them in ~/.tmp or ~/tmp (already set by default) if available.
 set directory^=~/.tmp
+" Never use /tmp which gets cleaned on reboot.
+set directory-=/tmp
 
 " Disable modelines as they may cause security problems. Instead use
 " securemodelines (Vim script #1876).
@@ -158,7 +171,8 @@ endif
 " existing files.
 set fileencodings=utf-8,latin1
 
-" Always use unix line-endings for new files.
+" Always use unix line-endings for new files. DOS line endings in existing
+" files are recognized.
 set fileformats=unix,dos
 
 " Wrap text after 78 characters.
@@ -228,9 +242,9 @@ if exists('+spell') && has('syntax')
     set spelllang=en_us
 endif
 
-" Allow buffers with changes to be hidden. Very important for effective
+" Allow buffers with changes to be hidden. Very important for efficient
 " editing with multiple buffers. Prevents the "E37: No write since last change
-" (add ! to override)" warning when switching buffers.
+" (add ! to override)" warning when switching modified buffers.
 set hidden
 
 " When splitting vertically put the new window right of the current one.
@@ -257,7 +271,7 @@ set number
 if exists('+numberwidth')
     set numberwidth=1
 endif
-" Display the ruler with current line/file position. If 'statusline' is used
+" Display the ruler with current line/file position. If 'statusline' is used,
 " then this only affects <C-G>.
 set ruler
 " Display partial commands in the status line.
@@ -387,7 +401,7 @@ if has('statusline')
         endif
     endfunction
 
-    " Display unexpected 'fileformat' and 'fileencoding' settings.
+    " Display unexpected 'fileformat', 'fileencoding' and 'bomb' settings.
     function! s:StatuslineFileFormat()
         if &fileformat != 'unix'
             return '[' . &fileformat . ']'
@@ -403,6 +417,13 @@ if has('statusline')
             return ''
         endif
     endfunction
+    function! s:StatuslineFileBOMB()
+        if exists('+bomb') && &bomb
+            return '[BOM]'
+        else
+            return ''
+        endif
+    endfunction
 
     " Return current syntax group in brackets or nothing if there's none.
     function! s:StatuslineSyntaxGroup()
@@ -427,6 +448,9 @@ if has('statusline')
     function! SFE()
         return s:StatuslineFileEncoding()
     endfunction
+    function! SFB()
+        return s:StatuslineFileBOMB()
+    endfunction
     function! SSG()
         return s:StatuslineSyntaxGroup()
     endfunction
@@ -438,10 +462,10 @@ if has('statusline')
     set statusline+=:
     if has('modify_fname') && v:version >= 700 " some functions need 7.0
         set statusline+=%{SRF()}      " path to current file
-        set statusline+=\             " space after path
     else
-        set statusline+=%f\           " path to current file in buffer
+        set statusline+=%f            " path to current file in buffer
     endif
+    set statusline+=\                 " space after path
     set statusline+=%h                " [help] if buffer is help file
     set statusline+=%w                " [Preview] if buffer is preview buffer
     set statusline+=%m                " [+] if buffer was modified,
@@ -451,6 +475,7 @@ if has('statusline')
         set statusline+=%#Error#      " display warnings
         set statusline+=%{SFF()}      "   - unexpected file format
         set statusline+=%{SFE()}      "   - unexpected file encoding
+        set statusline+=%{SFB()}      "   - unexpected file byte order mask
         set statusline+=%##           " continue with normal colors
     endif
 
@@ -471,13 +496,18 @@ endif
 " modified by a plugin or other settings. Except for <Nop> which isn't
 " affected by mappings.
 
-" Easy way to exit insert mode. jk is preferred because it's faster.
-inoremap jj <Esc>
+" Easy way to exit insert mode (jj is too slow).
 inoremap jk <Esc>
 " Also for command mode, thanks to http://github.com/mitechie/pyvim
 " (2010-10-15).
-cnoremap jj <C-C>
 cnoremap jk <C-C>
+" And fix my typos ...
+inoremap JK <Esc>
+inoremap Jk <Esc>
+inoremap jK <Esc>
+cnoremap JK <C-C>
+cnoremap Jk <C-C>
+cnoremap jK <C-C>
 
 " Disable arrow keys for all modes except command modes. Thanks to James Vega
 " (http://git.jamessan.com/?p=etc/vim.git;a=summary).
@@ -501,6 +531,11 @@ cmap <Left>  <Nop>
 cnoremap <C-P> <Up>
 cnoremap <C-N> <Down>
 
+" Use :tjump to lookup tags (instead of :tag) which lists all available tags
+" if there's more than one match. This is really helpful in larger projects
+" where tags may occur multiple times.
+nnoremap <C-]> g<C-]>
+
 if has('eval')
 " Don't move the cursor to the first column for certain scroll commands (<C-F,
 " <C-B>, <C-D>, <C-U>). Thanks to jamessan in #vim on Freenode (2011-08-31
@@ -528,6 +563,10 @@ if has('eval')
         \ :call <SID>TemporaryNostartofline("<Bslash><Lt>C-U>")<CR>
 endif
 
+" Let Y yank to the end of the line, similar to D and C. Use yy if you want to
+" yank a line. This fixes a weird inconsistency in Vi(m).
+nnoremap Y y$
+
 " Write before suspending, thanks to deryni in #vim on Freenode (2011-05-09
 " 20:02 CEST). To suspend without saving either unmap this or use :stop<CR>.
 " Only the current buffer is written, thus switching to another buffer works
@@ -587,6 +626,21 @@ nnoremap <silent> <Leader>8 :8buffer<CR>
 nnoremap <silent> <Leader>9 :9buffer<CR>
 nnoremap <silent> <Leader>0 :10buffer<CR>
 
+" Use real tabs instead of soft tabs.
+if has('eval')
+" Switch from soft tabs to real tabs.
+    function! s:UseTabs()
+        setlocal noexpandtab shiftwidth=8 softtabstop=8
+    endfunction
+    nnoremap <silent> <Leader>t :call <SID>UseTabs()<CR>
+endif
+" Enable "verbatim" mode. Used to view files with long lines or without syntax
+" coloring. 'list' is not changed, see next mapping.
+nnoremap <silent> <Leader>v :setlocal nowrap nospell synmaxcol=0<CR>
+                          \ :2match<CR>
+" Toggle 'list'.
+nnoremap <silent> <Leader>l :set invlist<CR>
+
 " Make last active window the only window. Similar to <C-W> o.
 nnoremap <C-W>O <C-W>p<C-W>o
 
@@ -603,11 +657,6 @@ else
     nmap <Leader>sd <Nop>
 endif
 
-" Add semicolon to the end of the line. Thanks to
-" http://www.van-laarhoven.org/vim/.vimrc for this idea and godlygeek in #vim
-" on Freenode for an improved version which doesn't clobber any marks.
-nnoremap <silent> <Leader>; :call setline(line('.'), getline('.') . ';')<CR>
-
 if has('eval')
 " * and # for selections in visual mode. Thanks to
 " http://got-ravings.blogspot.com/2008/07/vim-pr0n-visual-search-mappings.html
@@ -736,7 +785,11 @@ inoreabbrev completly completely
 
 " Activate syntax coloring.
 if has('syntax')
-    syntax enable
+    " But only if it wasn't already active. Prevents breaking the syntax
+    " coloring when reloading the vimrc. Thanks to johnLate for the idea.
+    if !exists('g:syntax_on')
+        syntax enable
+    endif
 
 " Don't highlight more than 500 columns as I normally don't have that long
 " lines and they slow down syntax coloring. Thanks to Derek Wyatt
@@ -782,9 +835,9 @@ if has('syntax')
 
         if exists('*matchadd')
 " Highlight some important keywords in all documents.
-            let l:todos = ['TODO', 'XXX', 'FIXME',
+            let l:todos = ['TODO', 'XXX', 'FIXME', 'NOTE',
                          \ 'CHANGED', 'REMOVED', 'DELETED']
-            " Compatibility fix for Vim 6.4 which can't handle for in function
+            " Compatibility fix for Vim 6.4 which can't parse for in functions
             " (without function it's ignored).
             execute '  for l:x in l:todos'
                   \ '|     call matchadd("Todo", l:x)'
@@ -821,32 +874,32 @@ if has('syntax')
 
     " C
     let g:c_no_if0_fold = 1 " fix weird double fold in #if0 in recent versions
-    " Haskell.
+    " Haskell
     let g:hs_highlight_delimiters = 1
     let g:hs_highlight_boolean = 1
     let g:hs_highlight_types = 1
     let g:hs_highlight_more_types = 1
-    " Java.
+    " Java
     let g:java_highlight_java_lang_ids = 1 " color java.lang.* identifiers
-    " Perl.
+    " Perl
     let g:perl_fold = 1
     let g:perl_fold_blocks = 1
     let g:perl_nofold_packages = 1
     let g:perl_include_pod = 1 " syntax coloring for PODs
-    " PHP.
+    " PHP
     let g:php_folding = 3    " fold functions
     let g:php_short_tags = 0 " no short tags (<? .. ?>), not always usable
     let g:php_sql_query = 1  " highlight SQL queries in strings
-    " Python.
+    " Python
     let g:python_highlight_all = 1
-    " Shell.
+    " Shell
     let g:sh_noisk = 1        " don't add . to 'iskeyword'
     let g:sh_is_posix = 1     " POSIX shell (e.g. dash) is compatible enough
     let g:sh_fold_enabled = 7 " functions (1), heredoc (2) and if/do/for (4)
-    " Vim.
+    " Vim
     let g:vimsyn_embed = 0      " don't highlight embedded languages
     let g:vimsyn_folding = 'af' " folding for autogroups (a) and functions (f)
-    " XML.
+    " XML
     let g:xml_syntax_folding = 1
 endif
 
@@ -888,14 +941,20 @@ if has('eval')
     " Don't manage the working directory (the default setting is too slow for
     " me).
     let g:ctrlp_working_path_mode = 0
+
     " Path to cache directory. I prefer to keep generated files as local as
     " possible.
     let g:ctrlp_cache_dir = $HOME . '/.vim/cache/ctrlp'
-    " Permanent cache, cleared by a crontab entry.
+    " Permanent cache, cleared by a crontab entry. Use <F5> to update the
+    " cache manually.
     let g:ctrlp_clear_cache_on_exit = 0
 
+    " Don't switch the window if the selected buffer is already open. I want
+    " to open another view on this buffer in most cases.
+    let g:ctrlp_switch_buffer = 0
+
 " FSWitch settings.
-    " Default don't work well for my projects.
+    " Defaults don't work well for my projects.
     augroup vimrc
         autocmd BufEnter *.cc let b:fswitchdst  = 'h'
                           \ | let b:fswitchlocs = './'
@@ -905,13 +964,17 @@ if has('eval')
 
     " Switch to corresponding header/source file.
     nnoremap <silent> <Leader>h :FSHere<CR>
+
+" netrw settings.
+    " Don't create ~/.vim/.netrwhist history file.
+    let g:netrw_dirhistmax = 0
 endif
 
 
 " AUTO COMMANDS
 
 " Use a custom auto group to prevent problems when the vimrc files is sourced
-" twice.
+" multiple times.
 if has('autocmd')
     augroup vimrc
 
@@ -937,7 +1000,8 @@ if has('autocmd')
 " Automatically disable 'paste' mode when leaving insert mode. Thanks to
 " Raimondi in #vim on Freenode (2010-08-14 23:01 CEST). Very useful as I only
 " want to paste once and then 'paste' gets automatically unset. InsertLeave
-" doesn't exist in older Vims.
+" doesn't exist in older Vims. Use "*p to paste X11's selection, no need for
+" 'paste' in this case.
         if exists('##InsertLeave')
             autocmd InsertLeave * set nopaste
         endif
@@ -958,13 +1022,18 @@ if has('autocmd')
         endif
 
 " Display a warning when editing a file which contains "do not edit" (ignoring
-" the case, \c), for example template files which were preprocessed or
-" auto-generated files. Especially useful when the header is not displayed on
-" the first screen, e.g. when the old position is restored. Not for vimrc
-" though.
+" the case) and similar messages in the first lines of the file, for example
+" template files which were preprocessed or auto-generated files. Especially
+" useful when the header is not displayed on the first screen, e.g. when the
+" old position is restored.
         function! s:SearchForDoNotEditHeader()
-            if search('\cdo not edit', 'n') == 0
-                    \ || expand('<afile>:t') =~# '^.\?vimrc$'
+            " Only search the first 20 lines to prevent false positives, e.g.
+            " in scripts which write files containing this warning and ignore
+            " the case (\c). (Can't use search()'s {stopline} as we might not
+            " start searching from the top.)
+            let l:search = '\c\(do not \(edit\|modify\)\|autogenerated by\)'
+            let l:match = search(l:search, 'n')
+            if l:match == 0 || l:match > 20
                 return
             endif
 
@@ -987,6 +1056,9 @@ if has('autocmd')
 " the recommendation for git commit messages (http://tpope.net/node/106).
         autocmd FileType gitcommit let g:secure_modelines_allowed_items = [] |
                                  \ setlocal textwidth=72
+" Fix 'include' setting for shell files to recognize '.' and 'source'
+" commands.
+        autocmd FileType sh let &l:include = '^\s*\(\.\|source\)\s\+'
 " Use the same comment string as for Vim files in Vimperator files.
         autocmd FileType vimperator setlocal commentstring=\"%s
 " Use TeX compiler for (La)TeX files.
@@ -1018,7 +1090,7 @@ if has('eval')
 " Convenient command to see the difference between the current buffer and the
 " file it was loaded from, thus the changes you made. Thanks to the
 " vimrc_example.vim file in Vim's source. Modified to use the same filetype
-" for the diffed file than the filetype for the original file.
+" for the diffed file as the filetype for the original file.
     if !exists(':DiffOrig')
         command DiffOrig
             \ let s:diff_orig_filetype = &filetype