]> ruderich.org/simon Gitweb - config/dotfiles.git/blobdiff - vimrc
vim/bundle/gundo: Add as submodule.
[config/dotfiles.git] / vimrc
diff --git a/vimrc b/vimrc
index 825aa4e33faab82ce710552c3e5b48cb1384ec51..39cadf0cc03a383c4b3d650d2ec4e113263005c4 100644 (file)
--- a/vimrc
+++ b/vimrc
@@ -1,6 +1,6 @@
 " Vim main configuration file.
 
-" Copyright (C) 2008-2012  Simon Ruderich
+" Copyright (C) 2008-2013  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
@@ -49,7 +50,7 @@ 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-=.
@@ -137,6 +138,15 @@ if has('eval')
 endif
 
 
+" TERMINAL SETTINGS
+
+" Also enable fast terminal mode in GNU screen and tmux, but not for SSH
+" connections.
+if &term =~# '^screen' && !exists('$SSH_CONNECTION')
+    set ttyfast
+endif
+
+
 " EDIT SETTINGS
 
 " Enable automatic file detection, plugin and indention support.
@@ -180,7 +190,7 @@ set formatoptions+=ro
 " started.
 set formatoptions+=l
 " Remove comment leader when joining lines where it makes sense.
-if <SID>HasVersionAndPatch(703, 541)
+if s:HasVersionAndPatch(703, 541)
     set formatoptions+=j
 endif
 
@@ -219,11 +229,16 @@ 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.
+if has('vertsplit')
+    set splitright
+endif
+
 
 " DISPLAY SETTINGS
 
@@ -291,7 +306,7 @@ if has('statusline')
     " If there's more than one buffer return "/<nr>" (e.g. "/05") where <nr>
     " is the highest buffer number, otherwise return nothing. Used in
     " 'statusline' to get an overview of available buffer numbers.
-    function! StatuslineBufferCount()
+    function! s:StatuslineBufferCount()
         let l:bufnr = bufnr('$')
         if l:bufnr > 1
             let l:result = '/'
@@ -314,7 +329,7 @@ if has('statusline')
     " Like %f but use relative filename if it's shorter than the absolute path
     " (e.g. '../../file' vs. '~/long/path/to/file'). fnamemodify()'s ':.' is
     " not enough because it doesn't create '../'s.
-    function! StatuslineRelativeFilename()
+    function! s:StatuslineRelativeFilename()
         " Display only filename for help files.
         if &buftype == 'help'
             return expand('%:t')
@@ -373,8 +388,32 @@ if has('statusline')
         endif
     endfunction
 
+    " Display unexpected 'fileformat', 'fileencoding' and 'bomb' settings.
+    function! s:StatuslineFileFormat()
+        if &fileformat != 'unix'
+            return '[' . &fileformat . ']'
+        else
+            return ''
+        endif
+    endfunction
+    function! s:StatuslineFileEncoding()
+        if &fileencoding != '' && &fileencoding != 'utf-8'
+                \ && &filetype != 'help'
+            return '[' . &fileencoding . ']'
+        else
+            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! StatuslineSyntaxGroup()
+    function! s:StatuslineSyntaxGroup()
         let l:group = synIDattr(synID(line('.'), col('.'), 1), 'name')
         if l:group != ''
             return '[' . l:group . '] '
@@ -383,22 +422,49 @@ if has('statusline')
         endif
     endfunction
 
+    " Short function names to make 'statusline' more readable.
+    function! SBC()
+        return s:StatuslineBufferCount()
+    endfunction
+    function! SRF()
+        return s:StatuslineRelativeFilename()
+    endfunction
+    function! SFF()
+        return s:StatuslineFileFormat()
+    endfunction
+    function! SFE()
+        return s:StatuslineFileEncoding()
+    endfunction
+    function! SFB()
+        return s:StatuslineFileBOMB()
+    endfunction
+    function! SSG()
+        return s:StatuslineSyntaxGroup()
+    endfunction
+
     set statusline=
     " on the left
-    set statusline+=%02n  " buffer number
-    set statusline+=%{StatuslineBufferCount()} " highest buffer number
+    set statusline+=%02n              " buffer number
+    set statusline+=%{SBC()}          " highest buffer number
     set statusline+=:
     if has('modify_fname') && v:version >= 700 " some functions need 7.0
-        set statusline+=%{StatuslineRelativeFilename()} " path to current file
-        set statusline+=\     " space after path
+        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+=%h                " [help] if buffer is help file
+    set statusline+=%w                " [Preview] if buffer is preview buffer
+    set statusline+=%m                " [+] if buffer was modified,
+                                      " [-] if 'modifiable' is off
+    set statusline+=%r                " [RO] if buffer is read only
+    if v:version >= 700               " %#..# needs 7.0
+        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
-    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,
-                          " [-] if 'modifiable' is off
-    set statusline+=%r    " [RO] if buffer is read only
 
     " on the right
     set statusline+=%=                " right align
@@ -554,12 +620,12 @@ endif
 " 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
 " and all nerds involved (godlygeek, strull in #vim on Freenode).
-if has('eval')
     function! s:VSetSearch()
-        let l:temp = @@
+        let l:temp = @@ " unnamed register
         normal! gvy
         " Added \C to force 'noignorecase' while searching the current visual
         " selection. I want to search for the exact string in this case.
@@ -568,6 +634,16 @@ if has('eval')
     endfunction
     vnoremap * :<C-U>call <SID>VSetSearch()<CR>//<CR>
     vnoremap # :<C-U>call <SID>VSetSearch()<CR>??<CR>
+
+" Use 'noignorecase' for * and #. See comment in s:VSetSearch() for details.
+" Thanks to the writers of s:VSetSearch(), see above.
+    function! s:NSetSearch()
+        let l:cword = expand('<cword>')
+        let l:regex = substitute(escape(l:cword, '\'), '\n', '\\n', 'g')
+        let @/ = '\C\V'. '\<' . l:regex . '\>'
+    endfunction
+    nnoremap * :call <SID>NSetSearch()<CR>//<CR>
+    nnoremap # :call <SID>NSetSearch()<CR>??<CR>
 endif
 
 " I often type "W" instead of "w" when trying to save a file. Fix my mistake.
@@ -707,7 +783,7 @@ if has('syntax')
         if !&diff && exists(':2match')
             " Use ColorColumn for overlong lines if available and my color
             " scheme is used.
-            if &t_Co == 256 && <SID>HasSyntaxGroup('ColorColumn')
+            if &t_Co == 256 && s:HasSyntaxGroup('ColorColumn')
                 2match ColorColumn /\%>78v./
             else
                 2match Todo /\%>78v./
@@ -739,17 +815,17 @@ if has('syntax')
 
 " Special highlight for tabs to reduce their visibility in contrast to other
 " SpecialKey characters (e.g. ^L).
-            if &t_Co == 256 && <SID>HasSyntaxGroup('specialKeyTab')
+            if &t_Co == 256 && s:HasSyntaxGroup('specialKeyTab')
                 call matchadd('specialKeyTab', '\t')
             endif
         endif
     endfunction
 " Enable highlights for the current and all new windows. Thanks to bairui in
 " #vim on Freenode (2012-04-01 00:22 CEST) for the WinEnter suggestion.
-    call <SID>CustomSyntaxHighlights()
+    call s:CustomSyntaxHighlights()
     if has('autocmd')
         augroup vimrc
-            autocmd WinEnter * call <SID>CustomSyntaxHighlights()
+            autocmd WinEnter * call s:CustomSyntaxHighlights()
         augroup END
     endif
 
@@ -762,11 +838,17 @@ if has('syntax')
     let g:hs_highlight_boolean = 1
     let g:hs_highlight_types = 1
     let g:hs_highlight_more_types = 1
+    " Java.
+    let g:java_highlight_java_lang_ids = 1 " color java.lang.* identifiers
     " 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.
+    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.
     let g:python_highlight_all = 1
     " Shell.
@@ -818,14 +900,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 = './'
@@ -835,6 +923,10 @@ 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
 
 
@@ -867,15 +959,16 @@ 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
 
-" Write file when running :mak[e] before 'makeprg' is called. QuickFixCmdPre
-" doesn't exist in older Vims.
+" Write all files when running :mak[e] before 'makeprg' is called.
+" QuickFixCmdPre doesn't exist in older Vims.
         if exists('##QuickFixCmdPre')
-            autocmd QuickFixCmdPre * write
+            autocmd QuickFixCmdPre * wall
         endif
 
 " Don't ignore case while in insert mode, but ignore case in all other modes.
@@ -898,11 +991,9 @@ if has('autocmd')
                 return
             endif
 
-            echohl WarningMsg
-            echo 'Do not edit this file! (Maybe a template file.)'
-            echohl None
+            echoerr 'Do not edit this file! (Maybe a template file.)'
         endfunction
-        autocmd BufRead * call <SID>SearchForDoNotEditHeader()
+        autocmd BufRead * call s:SearchForDoNotEditHeader()
 
 " AFTER/FTPLUGIN AUTO COMMANDS
 
@@ -919,6 +1010,10 @@ 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. Use &l:include instead of setlocal which requires excessive
+" escaping of \.
+        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.
@@ -950,7 +1045,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