]> ruderich.org/simon Gitweb - config/dotfiles.git/blobdiff - vimrc
vimrc: Use 'noignorecase' for * and #.
[config/dotfiles.git] / vimrc
diff --git a/vimrc b/vimrc
index ed6ce3b1f7882d0b345eefc8749deccb879926d6..ccba733d753972c0521019fc8b367f09115cb35c 100644 (file)
--- a/vimrc
+++ b/vimrc
@@ -70,13 +70,32 @@ if exists('+wildignorecase')
     set wildignorecase
 endif
 
-" Increase history of executed commands (:).
+" Ignore files with the following extensions because I almost never want to
+" edit them in Vim (specifying them manually still works of course).
+set wildignore=
+" C
+set wildignore+=*.o,*.d,*.so
+" Java
+set wildignore+=*.class
+" LaTeX
+set wildignore+=*.aux,*.log,*.out,*.toc,*.pdf
+" Python
+set wildignore+=*.pyc
+
+" Show completion menu even if only one entry matches.
+if exists('+completeopt')
+    set completeopt+=menuone
+endif
+
+" Increase history of executed commands (:) and search patterns (/).
 set history=1000
 
 " Increase number of possible undos.
 set undolevels=1000
 
-" Remember marks (including the last cursor position) for more files.
+" Remember marks (including the last cursor position) for more files. ^= is
+" necessary because 'viminfo' is parsed from the beginning and the first match
+" is used.
 if has('viminfo')
     set viminfo^='1000
 endif
@@ -87,7 +106,7 @@ if exists('+cryptmethod')
 endif
 
 " Clear all vimrc-related autocmds. Has to be done here as the vimrc augroup
-" is used multiple times.
+" is used multiple times. Necessary to support reloading the vimrc.
 if has('autocmd')
     augroup vimrc
         autocmd!
@@ -118,6 +137,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.
@@ -170,7 +198,7 @@ endif
 set virtualedit=block
 
 " Already display matches while typing the search command. This makes spotting
-" errors easy.
+" typos easy and searching faster.
 set incsearch
 
 " Activate syntax folding.
@@ -183,6 +211,8 @@ if has('folding')
     endif
     set foldlevel=99 " no closed folds at default, 'foldenable' would disable
                      " folding which is not what I want
+    " Don't open folds for block movements like '(', '{', '[[', '[{', etc.
+    set foldopen-=block
 endif
 
 " Only check case if the searched word contains a capital character.
@@ -200,9 +230,14 @@ endif
 
 " Allow buffers with changes to be hidden. Very important for effective
 " editing with multiple buffers. Prevents the "E37: No write since last change
-" (add ! to override)" warning.
+" (add ! to override)" warning when switching buffers.
 set hidden
 
+" When splitting vertically put the new window right of the current one.
+if has('vertsplit')
+    set splitright
+endif
+
 
 " DISPLAY SETTINGS
 
@@ -270,7 +305,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 = '/'
@@ -293,7 +328,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')
@@ -352,22 +387,72 @@ if has('statusline')
         endif
     endfunction
 
+    " Display unexpected 'fileformat' and 'fileencoding' 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
+
+    " Return current syntax group in brackets or nothing if there's none.
+    function! s:StatuslineSyntaxGroup()
+        let l:group = synIDattr(synID(line('.'), col('.'), 1), 'name')
+        if l:group != ''
+            return '[' . l:group . '] '
+        else
+            return ''
+        endif
+    endfunction
+
+    " Short function names to make 'statusline' more readable.
+    function! SBC()
+        return <SID>StatuslineBufferCount()
+    endfunction
+    function! SRF()
+        return <SID>StatuslineRelativeFilename()
+    endfunction
+    function! SFF()
+        return <SID>StatuslineFileFormat()
+    endfunction
+    function! SFE()
+        return <SID>StatuslineFileEncoding()
+    endfunction
+    function! SSG()
+        return <SID>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+=%##           " 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
@@ -511,6 +596,11 @@ if exists('+spell')
     nnoremap <silent> <Leader>sn :set nospell<CR>
     nnoremap <silent> <Leader>se :set spell spelllang=en_us<CR>
     nnoremap <silent> <Leader>sd :set spell spelllang=de_de<CR>
+" If no spell support is available, these mappings do nothing.
+else
+    nmap <Leader>sn <Nop>
+    nmap <Leader>se <Nop>
+    nmap <Leader>sd <Nop>
 endif
 
 " Add semicolon to the end of the line. Thanks to
@@ -518,12 +608,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.
@@ -532,6 +622,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.
@@ -565,7 +665,7 @@ endif
 
 " In case 'hlsearch' is used disable it with <C-L>. Thanks to frogonwheels and
 " vimgor (bot) in #vim on Freenode (2010-03-30 05:58 CEST).
-noremap <silent> <C-L> :nohlsearch<CR><C-L>
+nnoremap <silent> <C-L> :nohlsearch<CR><C-L>
 
 " <C-U> in insert mode deletes a lot, break undo sequence before deleting the
 " line so the change can be undone. Thanks to the vimrc_example.vim file in
@@ -726,11 +826,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.
@@ -777,6 +883,28 @@ if has('eval')
     let g:xptemplate_brace_complete = 0
     " Only highlight the current placeholder.
     let g:xptemplate_highlight = 'current'
+
+" CtrlP settings.
+    " 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.
+    let g:ctrlp_clear_cache_on_exit = 0
+
+" FSWitch settings.
+    " Default don't work well for my projects.
+    augroup vimrc
+        autocmd BufEnter *.cc let b:fswitchdst  = 'h'
+                          \ | let b:fswitchlocs = './'
+        autocmd BufEnter *.h  let b:fswitchdst  = 'cc,c'
+                          \ | let b:fswitchlocs = './'
+    augroup END
+
+    " Switch to corresponding header/source file.
+    nnoremap <silent> <Leader>h :FSHere<CR>
 endif
 
 
@@ -814,10 +942,10 @@ if has('autocmd')
             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.
@@ -829,6 +957,21 @@ if has('autocmd')
             autocmd InsertLeave * set   ignorecase
         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.
+        function! s:SearchForDoNotEditHeader()
+            if search('\cdo not edit', 'n') == 0
+                    \ || expand('<afile>:t') =~# '^.\?vimrc$'
+                return
+            endif
+
+            echoerr 'Do not edit this file! (Maybe a template file.)'
+        endfunction
+        autocmd BufRead * call <SID>SearchForDoNotEditHeader()
+
 " AFTER/FTPLUGIN AUTO COMMANDS
 
 " Disable spell checking for files which don't need it.