[经验总结]我的VIM配置文件
http://blog.csdn.net/ThinkHY/archive/2008/12/31/3663195.aspx
"************************************************************************
"* filename: .vimrc
"* brief: Happy VIMMING!
"* creator: thinkhy
"* date: 2008年 09月 10日 星期三 22:23:30 CST
"* modify: 2010年 01月 02日 星期六 20:00:59 CST
"************************************************************************
set fileencodings =ucs-bom , utf-8 , chinese
set fileencoding =utf-8
set gfn =FreeMono/ 14
set awa " 自动保存
set ai " 自动缩进
set expandtab
set shiftwidth =4
set tabstop =4
filetype plugin on
syntax enable " 语法高亮
set ai " Auto indent
set si " Smart indent
set cindent " C缩进
set cino =g0 " public private friend 顶格写
set nocompatible " 不与VI兼容
set ruler " 显示光标位置
set nobackup " ~文件烦人
set ve =all " 逍遥游
"set iskeyword=@,48-57,192-255 "把默认keyword中的_去掉 还是用默认的吧
"不然Ctags不好使
set acd " autochangedir
set statusline =[%{strftime('%y-%m-%d/ %a')}][%{&ff}][%Y]%k[%{(&fenc==/"/")?&enc : &fenc}%{(&bomb?/" , BOM/" : /"/")}]%=[Line : %l/%L , Column : %c%V]/ %P
" ===========================================================================================
" Key map
" <C-q> 粘贴系统剪贴板的内容
nmap < C-q > "+p
imap < C-q > < ESC > "+p
" Enter 代替 ESC
inoremap < CR > < ESC >
" F2 保存文件
nmap < F2 > :w < CR >
imap < F2 > < ESC > :w < CR >
" F3 切换窗口
nmap < F3 > < C-w > w
imap < F3 > < ESC >< C-w > w
" F4 关闭窗口
nmap < F4 > < C-w > c
imap < F4 > < ESC >< C-w > c
" F5 Make
nmap < F5 > :copen < CR > :make! < CR >
imap < F5 > < ESC > :copen < CR > :make! < CR >
" F7 调整格式 用得太少 改作ptag
"nmap <F7> :%!indent -kr<CR>
"imap <F7> <ESC>:%!indent -kr<CR>
nmap < F7 > < C-w > } < CR >
imap < F7 > < ESC >< C-w > } < CR >
" F8 打开taglist
nmap < F8 > :TlistToggle < CR >
imap < F8 > < ESC > :TlistToggle < CR >
" F9 编译链接C/C++文件
nmap < F9 > :!g++ % -o %< < CR >
imap < F9 > < ESC > :!g++ % -o %< < CR >
" F11 打开Winmanager
nmap < F11 > :WManager < CR >
imap < F11 > < ESC > :WManager < CR >
" F12 建立Tag文件
nmap < F12 > :!ctags -R --c-kinds=+p --fields=+S < CR >
imap < F12 > < ESC > :!ctags -R --c-kinds=+p --fields=+S < CR >
" <space> 空格
nmap < space > o < Esc >
" 调整窗口大小
map < Up > < Esc > :winc+ < CR >
map < Down > < Esc > :winc- < CR >
map < Left > < Esc > :winc> < CR >
map < Right > < Esc > :winc< < CR >
nmap F :BufExplorer < CR >
" 水木中收的技巧
" 设置多文件搜索快捷键,搜索完毕后不自动跳转
" 这个在GVIM与GUI的局快捷键冲突,在终端中与终端窗口的快捷键冲突
"nmap <M-f> *:vimgrep //<<c-r><c-w>/>/j **/*.[ch] **/*.txt **/*.cpp<cr>
" 顺序或倒序遍历quickfix中列出的item
nnoremap < F9 > :cp < cr >
inoremap < F9 > < c-o > :cp < cr >
nnoremap < F10 > :cn < cr >
inoremap < F10 > < c-o > :cn < cr >
"
" For C/C++ file
" Proposed by winmanager plugin
map < c-w >< c-f > :FirstExplorerWindow < cr >
map < c-w >< c-b > :BottomExplorerWindow < cr >
map < c-w >< c-t > :WMToggle < cr >
"=========================================================================================
"技巧
"
" 水木中介绍解决输入法切换的问题
autocmd InsertEnter * set noimdisable
autocmd InsertLeave * set imdisable
au BufRead , BufNew /home/thinkhy/work/apue.2e/* set tags +=/home/thinkhy/work/apue.2e/tags
au BufRead , BufNew /home/thinkhy/work/wine/* set tags +=/home/thinkhy/work/wine/wine-1.1.35/tags
au BufRead , BufNew Makefile set noexpandtab
au BufRead , BufNew makefile set noexpandtab
" 这个技巧看上去很好,但和我的习惯不符,还是^O和Tab搭配着好用。
" smth VIM版flw 介绍的 Tab用法
" if version >= 700
" nmap <silent> <TAB> <C-W>w:set cursorline<CR>:200sl m<CR>:set nocursorline<CR>
" nmap <silent> <S-TAB> <C-W>p:set cursorline<CR>:200sl m<CR>:set nocursorline<CR>
" else
" nmap <silent> <TAB> <C-W>w
" nmap <silent> <S-TAB> <C-W>p
" endif
"autocmd CmdWinEnter * inoremap <buffer> <Esc> <C-o>:exit<CR><Esc> /| /
"set noimdisable|set insertmode
"autocmd CmdWinLeave * set imdisable | set noinsertmode
"cnoremap <C-space> <C-f>
"imap <Tab> <Space><Space><Space><Space><Space><Space><Space><Space
"===========================================================
" For xml file
"===========================================================
"so ~/vimfiles/plugin/xml.vi
autocmd FileType xml,xsd,xsl : set tabstop = 4 expandtab
let g:ChineseIMESpaceToggle = 1
"let g:ChineseIMEMappingCtrl6=1
setlocal pumheight =1
setlocal completeopt =menu , preview , longest
"nmap <F12> :w&&%!xmllint % --format<CR
"imap <F12> <ESC>:%!xmllint % --format<CR
" for C++ tags [09/11/30 thinkhy]
map < C-F12 > :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . < CR >
">=================================================
">=================================================
" [ Added by thinkhy 2010年 01月 02日 星期六 19:54:24 CST]
" 水木VIM版 15322贴
"发信人: flw (梨花小蓓蕾), 信区: VIM
"标 题: 分享几个我自认为比较得意的自定义快捷键
"发信站: 水木社区 (Mon Dec 28 10:34:46 2009), 站内
" 换标签页
nmap < C-N > :tabnext < CR >
nmap < C-P > :tabprev < CR >
" 换窗口
nmap < silent > < TAB > < c-w > w:set cursorline < CR > :100sl m < CR > :set nocursorline < CR >
nmap < silent > < S-TAB > < c-w > p:set cursorline < CR > :100sl m < CR > :set nocursorline < CR >
function ! HelpHelper ( where )
" 先拿下光标下的文字
let l:word = expand ( "<cWORD>" )
" 再取出疑似函数名/模块名的部分和疑似方法的部分
" /([_a-zA-Z0-9:]/+/)/(->/([_a-zA-Z0-9]/+/)/)/?
let l:lists = matchlist ( l:word, " // ([_a-zA-Z0-9:] // + // ) // (-> // ([_a-zA-Z0-9] // + // ) // ) // ?" )
let l:name = l:lists[ 1 ]
let l:method = l:lists[ 3 ]
let l:progList = []
if &ft == "perl"
if match ( l:name, "::" ) != - 1
" 函数里是不可能有 :: 的,不用想了,一定是模块
let l:progList += [ [ "perldoc -u " , "pod" ] ]
elseif strlen ( l:method )
" 有方法的,一定是模块了
let l:progList += [ [ "perldoc -u " , "pod" ] ]
elseif match ( l:name, "[A-Z]" ) != - 1
" 有大写字母,那一定是模块了,Perl buildin 函数的名称全都是小写字母的
let l:progList += [ [ "perldoc -u " , "pod" ] ]
else
" 剩下的,有可能是函数,也有可能是模块,
" 但是考虑到这样的模块较少,因此先优先查函数
let l:progList += [ [ "perldoc -u -f " , "pod" ], [ "perldoc -u " , "pod" ] ]
endif
endif
if &ft == "python"
let l:progList += [ [ "python -c /"import sys; a = sys.argv[-1]; b = a.find('.') > -1 and 1 or 0; m = b == 1 and '.'.join(a.split('.')[:-1]) or a; exec( 'import '+m+';help('+a+')' )/" " , "man" ] ]
endif
if &ft == "erlang"
if match ( l:name, ":" ) != - 1
" erlang 的模块方法
let l:lists = matchlist ( l:name, " // ([_a-zA-Z0-9:] // + // ): // ([_a-zA-Z0-9] // + // )" )
let l:name = l:lists[ 1 ]
let l:method = l:lists[ 2 ]
endif
let l:progList += [ [ "PAGER=/"col -b/" erl -man " , "man" ] ]
endif
let l:progList += [ [ "PAGER=/"col -b/" man 3 " , "man" ] ]
let l:progList += [ [ "PAGER=/"col -b/" man 2 " , "man" ] ]
let l:progList += [ [ "PAGER=/"col -b/" man " , "man" ] ]
let l:found = 0
" 下面调用外部命令,取帮助信息
" [Added by thinkhy 10/01/02]
if &ft == "vim"
echomsg "I am vim "
try
execute " h " . l:word
catch /foo/
endtry
execute "wincmd p"
return
endif
" [End thinkhy]
for l:prog in l:progList
let l:progName = l:prog[ 0 ]
let l:fileType = l:prog[ 1 ]
let l:cmd = l:progName . l:name
let l:lines = system ( l:cmd )
if !v:shell_error
if a:where ==? "inNewTab"
tabe
elseif a:where ==? "Vertical"
rightbelow new
else
above new
endif
set buftype = nofile
set ts = 8
execute "set ft=" . l:fileType
call append ( 0 , split ( l:lines, "/n" ) )
normal gg
if strlen ( l:method ) " 跳转到方法
if l:fileType == "pod"
" regex: /(=item/d*/s/+/)/@<= />
call search ( " // (=item // d* // s // + // ) // @<=" . l:method . " // >" )
elseif l:fileType == "man"
" regex: /(^/s/+/)/@<=l:method/>
call search ( " // (^ // s // + // ) // @<=" . l:method . " // >" )
endif
endif
let l:found = 1
break
endif
endfor
if !l:found
echohl ErrorMsg | echomsg "^_^ 没有帮助信息。" | echohl None
endif
endfunction
" vim 内打开 man/perldoc/erl -man/python help
autocmd FileType c,perl,erlang,python,vim nmap < silent > K :call HelpHelper( "" ) < CR >
autocmd FileType c,perl,erlang,python,vim nmap < silent > gK :call HelpHelper( "InNewTab" ) < CR >
">==========================================================================
"发信人: Dieken (风催草低 - 明月何尝不照人), 信区: VIM
"标 题: Re: 分享几个我自认为比较得意的自定义快捷键
"发信站: 水木社区 (Mon Dec 28 12:00:38 2009), 站内
" 我也来:
" Press v in quickfix window to preview
" 虽然没看懂zz:的意思,好使
au FileType qf : nnoremap < buffer > v <Enter>zz:wincmd p<Enter>
" for gf command to open java source file at import clause
au FileType java : set suffixesadd +=. java
"
" nnoremap <c-m> :redir @a<CR>:g//<CR>:redir END<CR>:new<CR>:put! a<CR><CR>
" 将搜索结果放在copen窗口
" ----------------------------------------------------------------------------
" * :lop[en] [height] 打开一个窗口显示当前窗口的位置列表。只有当前窗口有位置
" * 列表的情况才能用。你可以同时打开多于一个的位置列表窗
" * 口。除此以外,和 ":copen" 相同。
" ----------------------------------------------------------------------------
nnoremap < c-m > :g//laddexpr expand("%") . ":" . line(".") . ":" . getline(".") < CR > :lopen < CR >< CR >