X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=vimrc;h=fb56e0cf08f2f61314aa5881e37e4bbbfb07d60d;hb=d103b2a72ed0152303f381ab91ea7b2a3721591b;hp=3a48b1e0d4fad2dbfe32059eea07fa29ff907577;hpb=3a241c3323be2dac75d0d28cd3360d99bfb56ff0;p=config%2Fdotfiles.git diff --git a/vimrc b/vimrc index 3a48b1e..fb56e0c 100644 --- 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-=. @@ -65,14 +66,37 @@ set nomodeline " matches after another (full). Thanks to pbrisbin " (http://pbrisbin.com:8080/dotfiles/vimrc). set wildmode=list:longest,full +" Ignore case when completing files/directories. +if exists('+wildignorecase') + set wildignorecase +endif + +" 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 (:). +" 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 @@ -83,7 +107,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! @@ -114,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. @@ -157,7 +190,7 @@ set formatoptions+=ro " started. set formatoptions+=l " Remove comment leader when joining lines where it makes sense. -if HasVersionAndPatch(703, 541) +if s:HasVersionAndPatch(703, 541) set formatoptions+=j endif @@ -166,7 +199,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. @@ -179,6 +212,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. @@ -194,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. +" (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 @@ -266,7 +306,7 @@ if has('statusline') " If there's more than one buffer return "/" (e.g. "/05") where " 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 = '/' @@ -289,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') @@ -348,22 +388,83 @@ 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! 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 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') - set statusline+=%{StatuslineRelativeFilename()} " path to current file - set statusline+=\ " space after path + 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+=%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 @@ -382,13 +483,16 @@ endif " modified by a plugin or other settings. Except for which isn't " affected by mappings. -" Easy way to exit insert mode. jk is preferred because it's faster. -inoremap jj +" Easy way to exit insert mode (jj is too slow). inoremap jk " Also for command mode, thanks to http://github.com/mitechie/pyvim " (2010-10-15). -cnoremap jj cnoremap jk +" And fix my typos ... +inoremap JK +inoremap Jk +cnoremap JK +cnoremap Jk " Disable arrow keys for all modes except command modes. Thanks to James Vega " (http://git.jamessan.com/?p=etc/vim.git;a=summary). @@ -439,6 +543,10 @@ if has('eval') \ :call TemporaryNostartofline("C-U>") 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. " Only the current buffer is written, thus switching to another buffer works @@ -498,6 +606,19 @@ nnoremap 8 :8buffer nnoremap 9 :9buffer nnoremap 0 :10buffer +" 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 t :call UseTabs() +endif +" Enable "verbatim" mode. Used to view files with long lines or without syntax +" coloring. +nnoremap v :set nolist nowrap nospell synmaxcol=0 + \ :2match + " Make last active window the only window. Similar to o. nnoremap O po @@ -507,19 +628,19 @@ if exists('+spell') nnoremap sn :set nospell nnoremap se :set spell spelllang=en_us nnoremap sd :set spell spelllang=de_de +" If no spell support is available, these mappings do nothing. +else + nmap sn + nmap se + nmap sd 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 ; :call setline(line('.'), getline('.') . ';') - +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. @@ -528,6 +649,16 @@ if has('eval') endfunction vnoremap * :call VSetSearch()// vnoremap # :call VSetSearch()?? + +" 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('') + let l:regex = substitute(escape(l:cword, '\'), '\n', '\\n', 'g') + let @/ = '\C\V'. '\<' . l:regex . '\>' + endfunction + nnoremap * :call NSetSearch()// + nnoremap # :call NSetSearch()?? endif " I often type "W" instead of "w" when trying to save a file. Fix my mistake. @@ -561,7 +692,7 @@ endif " In case 'hlsearch' is used disable it with . Thanks to frogonwheels and " vimgor (bot) in #vim on Freenode (2010-03-30 05:58 CEST). -noremap :nohlsearch +nnoremap :nohlsearch " 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 @@ -667,7 +798,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 && HasSyntaxGroup('ColorColumn') + if &t_Co == 256 && s:HasSyntaxGroup('ColorColumn') 2match ColorColumn /\%>78v./ else 2match Todo /\%>78v./ @@ -699,17 +830,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 && 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 CustomSyntaxHighlights() + call s:CustomSyntaxHighlights() if has('autocmd') augroup vimrc - autocmd WinEnter * call CustomSyntaxHighlights() + autocmd WinEnter * call s:CustomSyntaxHighlights() augroup END endif @@ -722,11 +853,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. @@ -754,8 +891,10 @@ if has('eval') " Settings for securemodelines. " Only allow items I need (also includes spl which is not enabled by " default). - let g:secure_modelines_allowed_items = ['ft', 'spl', 'fdm', - \ 'sw', 'sts', 'noet'] + if v:version >= 700 " need lists + let g:secure_modelines_allowed_items = ['ft', 'spl', 'fdm', + \ 'sw', 'sts', 'noet'] + endif " Settings for the NERD commenter. " Don't create any mappings I don't want to use. @@ -771,6 +910,38 @@ 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. Use 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. + " Defaults 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 h :FSHere + +" netrw settings. + " Don't create ~/.vim/.netrwhist history file. + let g:netrw_dirhistmax = 0 endif @@ -803,15 +974,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. @@ -823,6 +995,26 @@ if has('autocmd') autocmd InsertLeave * set ignorecase endif +" Display a warning when editing a file which contains "do not edit" (ignoring +" 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() + " 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 + + echoerr 'Do not edit this file! (Maybe a template file.)' + endfunction + autocmd BufRead * call s:SearchForDoNotEditHeader() + " AFTER/FTPLUGIN AUTO COMMANDS " Disable spell checking for files which don't need it. @@ -838,6 +1030,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. @@ -869,7 +1065,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