工作中,我大部分时间都是和VIM打交道的,甚至Windows下的编程也开始完全用GVIM替代Editplus。这两天对自己的vimrc文件做了一下整理。同时给每一行的配置增加了注释。整理完成之后,好用多了,因为借鉴了很多网友的经验,所以本着分享的精神公布出来,希望有朋友能用上。 另外,我这份_vimrc配置使用的字体是:YaHei Mono,如果您没有此字体,可以到这里下载:(下载YaHei Mono字体)。下载后放到Windows文件夹下的fonts目录里即可。如果你不想用YaHei Mono字体,那么有一个替代方案就是用Courier_New字体,需要修改以下配置:
" 设置显示字体if has("win32") " set guifont=Courier_New:h11:cANSI set guifont=YaHei/ Mono:h11 "set guifontwide=Microsoft/ Yahei/ Monotype:h11 "set guifont=YaHei/ Consolas/ Hybrid:h12endif将“set guifont=YaHei/ Mono:h11”注掉,同时把“set guifont=Courier_New:h11:cANSI”项打开即可。
以下是配置文件全部内容:
" ***************Vimrc files for GVim *************" * CreateDate : Apr 20,2010" * LastModified : Apr 20,2010 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 全局设定 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 不要使用vi的键盘模式,而是vim自己的set nocompatible " 加载配置。behave mswin "设置快速编辑.vimrc文件 ,e 编辑.vimrcmap <silent> <leader>e :call SwitchToBuf("~/_vimrc")<cr> "保存.vimrc文件后会自动调用新的.vimrcautocmd! bufwritepost .vimrc source ~/_vimrc " 设定解码if has("multi_byte") " When 'fileencodings' starts with 'ucs-bom', don't do this manually "set bomb set fileencodings=ucs-bom,utf-8,chinese,taiwan,japan,korea,latin1 " CJK environment detection and corresponding setting if v:lang =~ "^zh_CN" " Simplified Chinese, on Unix euc-cn, on MS-Windows cp936 set encoding=utf-8 set termencoding=utf-8 if &fileencoding == '' set fileencoding=utf-8 endif elseif v:lang =~ "^zh_TW" " Traditional Chinese, on Unix euc-tw, on MS-Windows cp950 set encoding=euc-tw set termencoding=euc-tw if &fileencoding == '' set fileencoding=euc-tw endif elseif v:lang =~ "^ja_JP" " Japanese, on Unix euc-jp, on MS-Windows cp932 set encoding=euc-jp set termencoding=euc-jp if &fileencoding == '' set fileencoding=euc-jp endif elseif v:lang =~ "^ko" " Korean on Unix euc-kr, on MS-Windows cp949 set encoding=euc-kr set termencoding=euc-kr if &fileencoding == '' set fileencoding=ecu-kr endif endif " Detect UTF-8 locale, and override CJK setting if needed if v:lang =~ "utf8$" || v:lang =~ "UTF-8$" set encoding=utf-8 endifelse echoerr 'Sorry, this version of (g)Vim was not compiled with "multi_byte"'endif " browsedir设置set browsedir=buffer " 自动格式化设置filetype indent onset autoindentset smartindent " 设置备份及备份目录。set backspace=indent,eol,startset backupdir=D:/vim_back_filesset autochdir " history文件中需要记录的行数,恢复必须用到。set history=1024 " 窗口最大化autocmd GUIEnter * simalt ~x " 解决菜单乱码,先指定语言。set langmenu=zh_CN.UTF-8source $VIMRUNTIME/vimrc_example.vimsource $VIMRUNTIME/mswin.vimlanguage message zh_CN.UTF-8set fileencodings=utf-8,GB2312,cp936,gb18030,big5,euc-jp,euc-kr,latin1 " 在处理未保存或只读文件的时候,弹出确认set confirm " 共享外部剪贴板set clipboard+=unnamed " 显示未完成命令set showcmd" 侦测文件类型filetype on " 载入文件类型插件filetype plugin on " 为特定文件类型载入相关缩进文件filetype indent on " 保存全局变量set viminfo+=! " 带有如下符号的单词不要被换行分割set iskeyword+=_,$,@,%,#,- " 语法高亮syntax on " 设置不兼容模式set nocp " 设置鼠标支持set mouse=a " 不要生成swap文件setlocal noswapfile " 当buffer被丢弃时隐藏set bufhidden=hide " 保存窗口大小set sessionoptions+=resize " C++头文件识别au BufEnter /usr/include/c++/* setf cppau BufEnter /usr/include/g++-3/* setf cpp " GNU标准au BufEnter /usr/* call GnuIndent() " 显示行号set number " tab宽度set tabstop=4set cindent shiftwidth=4set autoindent shiftwidth=4 " C/C++注释set comments=:// " 修正自动C式样注释功能 <2005/07/16>set comments=s1:/*,mb:*,ex0:/ " 增强检索功能set tags=./tags,./../tags,./**/tags " 保存文件格式set fileformats=unix,dos " 文件被其他程序修改时自动载入set autoread " 高亮字符,让其不受100列限制:highlight OverLength ctermbg=red ctermfg=white guibg=red guifg=white:match OverLength '/1v.*' " 总是显示状态行set laststatus=2 " 状态行颜色" highlight StatusLine guifg=SlateBlue guibg=Yellowhighlight StatusLine guifg=SlateBlue guibg=Whitehighlight StatusLineNC guifg=Gray guibg=White " 我的状态行显示的内容(包括文件类型和解码)set statusline=[%n]%<%f%y%h%m%r%=[%b/ 0x%B]/ %l/ of/ %L,%c%V/ Page/ %N/ %P " 设置命令行高度为2行set cmdheight=1 " 命令行补全set wildmenu" 自动补全括号,包括大括号:inoremap ( ()<ESC>i:inoremap ) <c-r>=ClosePair(')')<CR>:inoremap { {}<ESC>i:inoremap } <c-r>=ClosePair('}')<CR>:inoremap [ []<ESC>i:inoremap ] <c-r>=ClosePair(']')<CR>:inoremap < <><ESC>i:inoremap > <c-r>=ClosePair('>')<CR> " 打开文件时,总是跳到退出之前的光标处autocmd BufReadPost */ if line("'/"") > 0 && line("'/"") <= line("$") |/ exe "normal! g`/"" |/ endif " 用浅色高亮当前行if has("gui_running") autocmd InsertLeave * se nocul autocmd InsertEnter * se culendif filetype plugin on "允许使用ftplugin目录下的文件类型特定脚本filetype indent on "允许使用indent目录下的文件类型缩进 " 设置自动粘贴功能。set pastetoggle=<F3> " 设置以缩进的方式自动折叠和设置快捷方式set foldmethod=indent " map <F3> zO " 打开折叠map <F4> zc " 关闭折叠map <F5> zR " 打开所有折叠map <F6> zM " 关闭所有折叠 " 保存代码文件前自动修改最后修改时间au BufWritePre *.sh call TimeStamp('#')au BufWritePre .vimrc,*.vim call TimeStamp('"')au BufWritePre *.c,*.h call TimeStamp('//')au BufWritePre *.cpp,*.hpp call TimeStamp('//')au BufWritePre *.cxx,*.hxx call TimeStamp('//')au BufWritePre *.java call TimeStamp('//')au BufWritePre *.rb call TimeStamp('#')au BufWritePre *.py call TimeStamp('#')au BufWritePre Makefile call TimeStamp('#')au BufWritePre *.php /call TimeStamp('<?php //', '?>')au BufWritePre *.html,*htm /call TimeStamp('<!--', '-->') " 更改Leader为","let g:C_MapLeader = ',' " 设置显示字体if has("win32") " set guifont=Courier_New:h11:cANSI set guifont=YaHei/ Mono:h11 "set guifontwide=Microsoft/ Yahei/ Monotype:h11 "set guifont=YaHei/ Consolas/ Hybrid:h12endif ab xmain int main(int argc, char *argv[])<cr>{<cr>}<up><cr>return " 使用 murphy 调色板colo murphy " 不要闪烁set novisualbell " 能够漂亮地显示.NFO文件set encoding=utf-8function! SetFileEncodings(encodings) let b:myfileencodingsbak=&fileencodings let &fileencodings=a:encodingsendfunctionfunction! RestoreFileEncodings() let &fileencodings=b:myfileencodingsbak unlet b:myfileencodingsbakendfunction au BufReadPre *.nfo call SetFileEncodings('cp437')|set ambiwidth=singleau BufReadPost *.nfo call RestoreFileEncodings() " 用空格键来开关折叠set foldenableset foldmethod=manualnnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR> " 隐藏掉菜单和工具条。set guioptions-=mset guioptions-=Tmap <silent> <F2> :if &guioptions =~# 'T' <Bar> /set guioptions-=T <Bar> /set guioptions-=m <bar> /else <Bar> /set guioptions+=T <Bar> /set guioptions+=m <Bar> /endif<CR> " 标签页设置if has("gui_running") set showtabline=2 map! tn tabnew nmap <C-c> :tabclose<CR>endif " 标签页只显示文件名function ShortTabLabel () let bufnrlist = tabpagebuflist (v:lnum) let label = bufname (bufnrlist[tabpagewinnr (v:lnum) -1]) let filename = fnamemodify (label, ':t') return filenameendfunction set guitablabel=%{ShortTabLabel()} " 使回格键(backspace)正常处理indent, eol, start等set backspace=eol,start,indent " 允许backspace和光标键跨越行边界" set whichwrap+=<,>,h,l " 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)set mouse=aset selection=exclusiveset selectmode=mouse,key " 启动的时候不显示那个援助索马里儿童的提示set shortmess=atI " 通过使用: commands命令,告诉我们文件的哪一行被改变过set report=0 " 不让vim发出讨厌的滴滴声set noerrorbells " 在被分割的窗口间显示空白,便于阅读set fillchars=vert:/ ,stl:/ ,stlnc:/ """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 搜索和匹配 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 高亮显示匹配的括号set showmatch " 匹配括号高亮的时间(单位是十分之一秒)set matchtime=3 " 在搜索的时候忽略大小写set ignorecase " 不要高亮被搜索的句子(phrases)" set nohlsearch " 在搜索时,输入的词句的逐字符高亮(类似firefox的搜索)set incsearch " 输入:set list命令是应该显示些啥?set listchars=tab:/|/ ,trail:.,extends:>,precedes:<,eol:$" Tab补全时忽略这些忽略这些set wildignore=*.o,*.obj,*.bak,*.exe" 光标移动到buffer的顶部和底部时保持3行距离set scrolloff=3 "搜索出之后高亮关键词set hlsearch nmap <silent> <leader><cr> :noh<cr> """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" CTags的设定 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""set tags=tags;" 按照名称排序let Tlist_Sort_Type = "name" " 在右侧显示窗口let Tlist_Use_Right_Window = 1 " 压缩方式let Tlist_Compart_Format = 1 " 如果只有一个buffer,kill窗口也kill掉bufferlet Tlist_Exist_OnlyWindow = 1 " 不要关闭其他文件的tagslet Tlist_File_Fold_Auto_Close = 0 " 不要显示折叠树let Tlist_Enable_Fold_Column = 0 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 快捷键映射 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""设置其他快捷键map <F7> :vsplit<ENTER>:edit `pwd`<ENTER>i"F7 打开左侧垂直窗口选择待编辑的文件 " 自动完成的缩进。if has("autocmd") if has("gui") autocmd WinLeave * set nocursorline nocursorcolumn autocmd WinEnter * set cursorline cursorcolumn else autocmd WinLeave * set nocursorline nocursorcolumn autocmd WinEnter * set cursorline nocursorcolumn endif " Enable file type detection. " load view saved by the mkview command autocmd FileType * loadview autocmd FileType * set noexpandtab autocmd BufWinEnter * loadview " Use the default filetype settings, so that mail gets 'tw' set to 72, " 'cindent' is on in C files, etc. " Also load indent files, to automatically do language-dependent indenting. filetype plugin indent on " In text files, always limit the width of text to 78 characters autocmd FileType text set textwidth=78 expandtab softtabstop=4 autocmd FileType sh set shiftwidth=4 expandtab softtabstop=4 autocmd FileType php set shiftwidth=4 expandtab softtabstop=4 autocmd FileType html set shiftwidth=4 expandtab softtabstop=4 autocmd FileType javascript set shiftwidth=4 expandtab softtabstop=4 autocmd FileType python set shiftwidth=4 expandtab softtabstop=4 autocmd FileType ruby set shiftwidth=4 expandtab softtabstop=4 autocmd FileType eruby set shiftwidth=4 expandtab softtabstop=4 autocmd FileType sql set shiftwidth=4 expandtab softtabstop=4 " When editing a file, always jump to the last known cursor position. " Don't do it when the position is invalid or when inside an event handler " (happens when dropping a file on gvim). autocmd BufReadPost * / if line("'/"") > 0 && line("'/"") <= line("$") | / execute "normal g`/"" | / endif augroup prog " Remove all cprog autocommands autocmd! " When starting to edit a file: " For C and C++ files set formatting of comments and set C-indenting on. " For other files switch it off. " Don't change the order, it's important that the line with * comes first. autocmd FileType * set formatoptions=tcoql nocindent comments& autocmd BufWinLeave *.sh,*.c,*.cpp,*.perl,*.py mkview autocmd BufWinEnter *.sh,*.c,*.cpp,*.perl,*.py silent loadview function! CleverTab() if strpart( getline('.'), 0, col('.')-1 ) =~ '^/s*$' return "/<Tab>" else return "/<C-N>" endfunction autocmd FileType c,cpp noremap! <S-Tab> <C-R>=CleverTab()<CR> autocmd FileType c,cpp noremap! <C-]> <C-X><C-]> autocmd FileType c,cpp noremap! <C-F> <C-X><C-F> autocmd FileType c,cpp noremap! <C-D> <C-X><C-D> autocmd FileType c,cpp noremap! <C-L> <C-X><C-L> autocmd FileType c,cpp,sh,perl,python set fileformat=unix autocmd FileType sh set formatoptions=croql cindent comments=b:# autocmd FileType c,cpp set expandtab shiftwidth=4 softtabstop=4 augroup ENDendif " has("autocmd") """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" PYTHON 相关的设置 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""Python 文件的一般设置,比如不要 tab 等"设置自动缩进为4,插入模式里: 插入 <Tab> 时使用合适数量的空格。"要插入实际的制表,可用 CTRL-V<Tab> autocmd FileType python setlocal expandtab | setlocal shiftwidth=4 | /setlocal softtabstop=4 | setlocal textwidth=76 | /tabstop=4 "pydiction插件设置(需要安装pydiction插件) "设置python的字典路径let g:pydiction_location = '~/.vim/skeleton/pydict/complete-dict' "设置pydict的菜单高度let g:pydiction_menu_height = 10 "Python Unittest 的一些设置"在编写 Python 代码及 unittest 测试时不需要离开 vim"键入 :make 或者点击 gvim 工具条上的 make 按钮就自动执行测试用例autocmd FileType python compiler pyunitautocmd FileType python setlocal makeprg=python/ ~/.vim/skeleton/alltests.pyautocmd BufNewFile,BufRead test*.py setlocal makeprg=python/ % "自动使用新文件模板(需要提前准备skeleton相关文件)autocmd BufNewFile test*.py 0r ~/.vim/skeleton/test.pyautocmd BufNewFile alltests.py 0r ~/.vim/skeleton/alltests.pyautocmd BufNewFile wx*.py 0r ~/.vim/skeleton/wxskeleton.pyautocmd BufNewFile *.py 0r ~/.vim/skeleton/skeleton.py "设置= + - * 前后自动空格"设置,后面自动添加空格au FileType python inoremap <buffer>= <c-r>=EqualSign('=')<CR>au FileType python inoremap <buffer>+ <c-r>=EqualSign('+')<CR>au FileType python inoremap <buffer>- <c-r>=EqualSign('-')<CR>au FileType python inoremap <buffer>* <c-r>=EqualSign('*')<CR>au FileType python inoremap <buffer>/ <c-r>=EqualSign('/')<CR>au FileType python inoremap <buffer>> <c-r>=EqualSign('>')<CR>au FileType python inoremap <buffer>< <c-r>=EqualSign('<')<CR>au FileType python inoremap <buffer>: <c-r>=Swap()<CR>au FileType python inoremap <buffer>, ,<space> """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 脚本内部用到的自定义函数 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""函数后面加上!是防止vimrc文件重新载入时报错"实现光标位置自动交换:) --> ):function! Swap() if getline('.')[col('.') - 1] =~ ")" return "/<ESC>la:" else return ":" endifendf """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""实现+-*/前后自动添加空格,逗号后面自动添加空格,适用python"支持+= -+ *= /+格式 function! EqualSign(char) if a:char =~ '=' && getline('.') =~ ".*(" return a:char endif let ex1 = getline('.')[col('.') - 3] let ex2 = getline('.')[col('.') - 2] if ex1 =~ "[-=+><>///*]" if ex2 !~ "/s" return "/<ESC>i".a:char."/<SPACE>" else return "/<ESC>xa".a:char."/<SPACE>" endif else if ex2 !~ "/s" return "/<SPACE>".a:char."/<SPACE>/<ESC>a" else return a:char."/<SPACE>/<ESC>a" endif endifendf """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""实现括号的自动配对后防止重复输入),适用pythonfunction! ClosePair(char) if getline('.')[col('.') - 1] == a:char return "/<Right>" else return a:char endifendf """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""SwitchToBuf()实现它在所有标签页的窗口中查找指定的文件名,如果找到这样一个窗口,"就跳到此窗口中;否则,它新建一个标签页来打开vimrc文件"上面自动编辑.vimrc文件用到的函数function! SwitchToBuf(filename) let bufwinnr = bufwinnr(a:filename) if bufwinnr != -1 exec bufwinnr . "wincmd w" return else " find in each tab tabfirst let tab = 1 while tab <= tabpagenr("$") let bufwinnr = bufwinnr(a:filename) if bufwinnr != -1 exec "normal " . tab . "gt" exec bufwinnr . "wincmd w" return endif tabnext let tab = tab + 1 endwhile " not exist, new tab exec "tabnew " . a:filename endifendfunction """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""Last change用到的函数,返回时间,能够自动调整位置function! TimeStamp(...) let sbegin = '' let send = '' if a:0 >= 1 let sbegin = a:1.'/s*' endif if a:0 >= 2 let send = ' '.a:2 endif let pattern = 'Last Change: ./+' /. send let pattern = '^/s*' . sbegin . pattern . '/s*$' let now = strftime('%Y-%m-%d %H:%M:%S', /localtime()) let row = search(pattern, 'n') if row == 0 let now = a:1 . ' Last Change: ' /. now . send call append(2, now) else let curstr = getline(row) let col = match( curstr , 'Last') let spacestr = repeat(' ',col - 1) let now = a:1 . spacestr . 'Last Change: ' /. now . send call setline(row, now) endifendfunction