" .vimrc " " Noah Spurrier $Id: .vimrc 253 2008-05-12 22:30:19Z root $ " add the following to .profile or .bashrc "export EDITOR=vim "export VISUAL=vim "export PAGER="col -b | view -c 'set ft=man nomod nolist nonumber' -" "export MANPAGER="col -b | view -c 'set ft=man nomod nolist nonumber' -" set nocompatible " use vim defaults (this should be first in .vimrc) filetype plugin on " load ftplugin.vim filetype indent on " load indent.vim set history=1000 " number of commands and search patterns to save if version >= 630 set viminfo=!,%,'20,/100,:100,s100,n~/.viminfo " options for .viminfo else set viminfo=!,%,'20,/100,:100,n~/.viminfo " options for .viminfo endif "set paste " ignore autoindent and formatoptions while pasting. does not hurt gvim. set binary " show control characters (ignore 'fileformat') set noautoindent " do not auto indent set shiftround " align to standard indent when shifting with < and > set formatoptions+=r " auto-format comments while typing " t_Co=16 is good on OSX, but not on Linux (leave unset for default) "set t_Co=16 " assume we have more colors to work with for highlighting set background=dark " set terminal background (see F11) colorscheme native "set guifont=Lucida_Console:h8 " set gvim font on Windows syntax on " use syntax color highlighting "colo ps_color " color scheme in ~/.vim/colors "set visualbell " flash instead of beep -- this can be annoying "set visualbell t_vb= " no beep or flash "set mouse=a " enable VIM mouse (see map for F12) set ttyfast " smoother display on fast network connections set whichwrap=b,s,<,>,[,],~ " allow most motion keys to wrap set backspace=indent,eol,start " allow bs over EOL, indent, and start of insert set incsearch " incremental search set nojoinspaces " use only one space when using join set matchpairs+=<:> " add < > to chars that form pairs (see % command) set showmatch " show matching brackets by flickering cursor set matchtime=1 " show matching brackets quicker than default set autoread " automatically read file changed outside of Vim set autowrite " automatically save before commands like :next and :make set splitbelow " open new split windows below the current one set winminheight=0 " This makes more sense than the default of 1 set noequalalways " do not resize windows on split/close "set shortmess="" " long messages -- does not seem to work set showcmd " show partial command in status line set suffixes+=.class,.pyc " skip bytecode files for filename completion set suffixes-=.h " do not skip C header files for filename completion set wrap " wrap long lines set sidescroll=1 " smooth scroll if set nowrap. for slow terminals set to 0. "set showbreak=>>>> " string to print before wrapped lines if version >= 700 set listchars=eol:$,tab:>-,trail:.,extends:>,precedes:<,nbsp:% " used when set list else set listchars=eol:$,tab:>-,trail:.,extends:>,precedes:< " used when set list endif " set backup " backup files before editing " set backupdir=~/tmp,.,/tmp,/var/tmp " backup locations set dir=~/tmp,.,/tmp,/var/tmp " swap file locations set virtualedit=block " allow Visual block select anywhere set laststatus=2 " always show statusline set statusline=%n\ %1*%h%f%*\ %=%<[%3lL,%2cC]\ %2p%%\ 0x%02B%r%m set ruler " show ruler, but only shown if laststatus is off set rulerformat=%h%r%m%=%f " sane value in case laststatus is off set nonumber " don't show line numbers "set printoptions=number:y " put line numbers on hardcopy " this turns on hlsearch, but clears the highlighting when Enter is hit set wildmenu " show a menu of matches when doing completion set hlsearch " highlight the current search pattern set title " shows the current filename and path in the term title. nnoremap :nohlsearch " in normal mode enter clears search highlight if version >= 700 "set cusorline " highlight the line with the cursor set numberwidth=4 " width of line numbers endif " " tab settings " set tabstop=4|set shiftwidth=4|set expandtab " default autocmd FileType python set tabstop=4|set shiftwidth=4|set expandtab " Python autocmd FileType make set tabstop=8|set shiftwidth=8|set noexpandtab " Makefile autocmd FileType man set tabstop=8|set shiftwidth=8|set noexpandtab " Man page (also used by psql to edit or view) autocmd FileType calendar set tabstop=8|set shiftwidth=8|set noexpandtab " This was just too clever and never worked quite right. " I still want something like this, so I keep it here in case " I ever figure out a smarter way of doing this. " use magictab "inoremap =MagicTabWrapper("forward") "inoremap =MagicTabWrapper("backward") " This highlights suspicious whitespace. "autocmd FileType * :call HighlightBadWS() " These are used by the DirDiff plugin. " DirDiff rules! let g:DirDiffExcludes = ".svn,*.jpg,*.png,*.gif,*.swp,*.a,*.so,*.o,*.pyc,*.exe,*.class,CVS,core,a.out" let g:DirDiffIgnore = "Id:,Revision:,Date:" " Make backups when using openssl plugin. let g:openssl_backup = 1 " Automatically load templates for new files. Silent if the template for the " extension does not exist. Virtually all template plugins I have seen for Vim " are too complicated. This just loads what extension matches in " $VIMHOME/templates/. For example the contents of html.tpl would be loaded " for new html documents. augroup BufNewFileFromTemplate au! autocmd BufNewFile * silent! 0r $HOME/.vim/templates/%:e.tpl autocmd BufNewFile * normal! G"_dd1G autocmd BufNewFile * silent! match Todo /TODO/ augroup BufNewFileFromTemplate " " maps " " This one is major. In insert mode backspace becomes the same as " (delete word). You will easier see the benefit of this or " it will drive you nuts. This is an experiment to train myself that " is better than reaching for the backspace. "imap " map Q as @q (replay the recording named q). I always use q as my throw-away " recording name, so I start recording with "qq" then reply the recording with " "Q". I never found a use for interactive ex-mode so I don't miss the " original definition of Q. nnoremap Q @q " easy indentation in visual mode " This keeps the visual selection active after indenting. " Usually the visual selection is lost after you indent it. vmap > >gv vmap < gk imap gj nmap gk nmap gj vmap gk vmap gj " This maps \y so that it will yank the visual selection, but also quote the " regex metacharacters, so you can then paste into a search pattern. For " example, use v to select some text. Press \y. Then start a search with /. " Type CTRL-R" to insert the yanked selection. The last two mappings allow you " to visual select an area and then search for other matches by typing * or #. vmap y y:let @"=substitute(escape(@",'.$*[^\/~'),'\n','\\n','g') vmap * y:let @/=substitute(escape(@",'.$*[^\/~'),'\n','\\n','g')n vmap # y:let @/=substitute(escape(@",'.$*[^\/~'),'\n','\\n','g')N vnoremap * : \let old_reg=getreg('"') \let old_regmode=getregtype('"') \gvy/=substitute(substitute( \escape(@", '\\/.*$^~[]' ), "\n$", "", ""), \"\n", '\\_[[:return:]]', "g") \:call setreg('"', old_reg, old_regmode) vnoremap # : \let old_reg=getreg('"') \let old_regmode=getregtype('"') \gvy?=substitute(substitute( \escape(@", '\\/.*$^~[]' ), "\n$", "", ""), \"\n", '\\_[[:return:]]', "g") \:call setreg('"', old_reg, old_regmode) " echo the date and time "map d :echo strftime("%Y-%m-%d %H:%M:%S") " spell check " or \s if version >= 700 map :set spell! map s :set spell! "setlocal spell spelllang=en_us else " older versions use external aspell map :!aspell -c "%":edit! "%" map s :!aspell -c "%":edit! "%" endif " tab support if version >= 700 map :tabp map :tabn endif " redraw window " map :redraw! " This runs the current buffer in an X terminal that disappears after 5 minutes. " This needs the env var $TERM set to xterm or some compatible X11 terminal. " This does not save first! " or \r function RunBufferInTerm () if &filetype == 'python' silent !$TERM -bg black -fg green -e bash -c "python %; sleep 300" & elseif &filetype == 'sh' silent !$TERM -bg black -fg green -e bash -c "./%; sleep 300" & elseif &filetype == 'php' silent !$TERM -bg black -fg green -e bash -c "php %; sleep 300" & elseif &filetype == 'perl' silent !$TERM -bg black -fg green -e bash -c "perl %; sleep 300" & endif sleep 1 redraw! endfunction map :call RunBufferInTerm() map r :call RunBufferInTerm() " yank all lines " or \a map gg"+yG map a gg"+yG " toggle line numbers " or \n map :set number! map n :set number! " toggle between dark and light backgrounds " map :let &background=(&background == "dark"?"light":"dark") " toggle mouse mode between VIM and xterm " function ShowMouseMode() if (&mouse == 'a') echo "MOUSE VIM" else echo "MOUSE X11" endif endfunction map :let &mouse=(&mouse == "a"?"":"a"):call ShowMouseMode() " This is now covered by the DirDiff plugin. " extra diff support " "map dp :diffput "map dg :diffget " run Vim diff on HEAD copy in SVN. map ds :call SVNDiff() function! SVNDiff() let fn = bufname("%") let newfn = fn . ".HEAD" let catstat = system("svn cat " . fn . " > " . newfn) if catstat == 0 execute 'vert diffsplit ' . newfn else echo "*** ERROR: svn cat failed for " . fn . " (as " . newfn . ")" endif endfunction " " folding using the current /search/ pattern -- very handy! " " \z " This folds every line that does not contain the search pattern. " So the end result is that you only see lines with the pattern " see vimtip #282 and vimtip #108 "map z :set foldexpr=getline(v:lnum)!~@/ foldlevel=0 foldcolumn=0 foldmethod=expr map z :set foldexpr=(getline(v:lnum)=~@/)?\">1\":\"=\" foldlevel=0 foldcolumn=0 foldmethod=expr foldtext=getline(v:foldstart) " space toggles the fold state under the cursor. nnoremap :exe 'silent! normal! za'.(foldlevel('.')?'':'l') " this folds all classes and functions -- mnemonic: think 'function fold' map zff :set foldexpr=UniversalFoldExpression(v:lnum) foldmethod=expr foldlevel=0 foldcolumn=0 foldtext=getline(v:foldstart) function UniversalFoldExpression(lnum) if a:lnum == 1 return ">1" endif return (getline(a:lnum)=~"^\\s*public function\\s\\|^\\s*private function\\s\\|^\\s*function\\s\\|^\\s*class\\s\\|^\\s*def\\s") ? ">1" : "=" endfunction " This doesn't work quite right: "if &filetype == 'php' " if getline(a:lnum) =~ '/\*\*' " call cursor(a:lnum,1) " let sp = searchpair ('/\*\*','','\*/') " call cursor(sp,1) " let ax = search ('\n*\s*function','cW') " if ax != 0 " return ">1" " endif " endif " return "=" "endif " @/ is the register that holds the last search pattern. " plugins runtime ftplugin/man.vim " allow vim to read man pages " " type \doc to insert PHPdocs " see vimtip #1355 " augroup php_doc au! "autocmd BufReadPost *.php,*.inc source ~/.vim/php-doc.vim autocmd BufReadPost *.php,*.inc nnoremap doc :call PhpDocSingle() autocmd BufReadPost *.php,*.inc vnoremap doc :call PhpDocRange() augroup END " " This sets mouse support for editing XPM images in gvim. " see h: xpm " function! GetPixel() let c = getline(".")[col(".") - 1] echo c exe "noremap r".c exe "noremap r".c endfunction autocmd BufReadPre *.xpm noremap :call GetPixel() autocmd BufReadPre *.xpm set guicursor=n:hor20 " to see the color under cursor " " Experimental stuff " " visually select lines and turn them into an HTML table. vmap ht :s/\(\S\+\)/ \1<\/td>:'<,'>s/^\s*$/<\/tr>'>o' function! AppendUnnamedReg() let old=@" yank let @" = old . @" endfun " online doc search " TODO This needs some work. map :call OnlineDoc() function! OnlineDoc() if &ft =~ "cpp" let s:urlTemplate = "http://doc.trolltech.com/4.1/%.html" elseif &ft =~ "ruby" let s:urlTemplate = "http://www.ruby-doc.org/core/classes/%.html" elseif &ft =~ "php" let s:urlTemplate = "http://www.php.net/%" elseif &ft =~ "perl" let s:urlTemplate = "http://perldoc.perl.org/functions/%.html" elseif &ft =~ "python" let s:urlTemplate = "http://starship.python.net/crew/theller/pyhelp.cgi?keyword=%" else return endif let s:browser = "firefox" let s:wordUnderCursor = expand("") let s:url = substitute(s:urlTemplate, "%", s:wordUnderCursor, "g") let s:cmd = "silent !" . s:browser . " " . s:url execute s:cmd redraw! endfunction " another online doc search " TODO This also needs some work. " vimtip #1354 function! OnlineDoc() let s:browser = "firefox" let s:wordUnderCursor = expand("") if &ft == "cpp" || &ft == "c" || &ft == "ruby" || &ft == "php" || &ft == "python" let s:url = "http://www.google.com/codesearch?q=".s:wordUnderCursor."+lang:".&ft elseif &ft == "vim" let s:url = "http://www.google.com/codesearch?q=".s:wordUnderCursor else return endif let s:cmd = "silent !" . s:browser . " " . s:url "echo s:cmd execute s:cmd endfunction " online doc search map k :call OnlineDoc() " simple calculator based loosely on vimtip #1349 " control the precision with this variable let g:MyCalcPresition = 2 function MyCalc(str) return system("echo 'scale=" . g:MyCalcPresition . " ; print " . a:str . "' | bc -l") endfunction " Use \C to replace a math expression by the value of its computation vmap C :s/.*/\=MyCalc(submatch(0))// vmap C= :B s/.*/\=submatch(0) . " = " . MyCalc(submatch(0))// " Python command Calc based on vimtip #1235 " does NOT use built-in vim python command! -nargs=+ Calc :r! python -c "from math import *; print " " allow reading of PDF text documents " On Ubuntu install the xpdf-utils deb package. autocmd BufReadPre *.pdf set ro autocmd BufReadPost *.pdf silent %!pdftotext -nopgbrk "%" - |fmt -csw78 " allow reading of MS Word doc documents " on Ubuntu install the antiword deb package. autocmd BufReadPre *.doc set ro autocmd BufReadPost *.doc silent %!antiword -i 1 -s -f "%" - |fmt -csw78 " jump to the last known position in a file autocmd BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal g'\"" | endif