前一文写到了使用VIM进行项目开发的准备工作,之后进入春节假期,文章也就停了两个礼拜。今天开始正式上班,继续写VIM使用系列的文章,本文主要是贴出本人简陋的.vimrc配置文件和项目管理脚本,以做参考
前一文写到了使用VIM进行项目开发的准备工作,之后进入春节假期,文章也就停了两个礼拜。今天开始正式上班,继续写VIM使用系列的文章,本文主要是贴出本人简陋的.vimrc配置文件和项目管理脚本,以做参考,抛砖引玉。
一、.vimrc配置文件
前面说道vim强大的个性定制依赖于它的配置文件和插件机制,而配置文件是保证插件高效使用的基础,因此非常重要。vim的配置文件通常为.vimrc,放置于用户的$HOME主目录下,它可以很简单,甚至没有(使用默认),也可以很复杂,上百行的设置,让人眼花缭乱。下面先贴上本人的.vimrc文件:
<!-- lang: shell -->set nu "打开行号显示set ts=4 "设置tabstop,即tab键占用的空格数,:help tabstopset sw=4 "设置shiftwidth,即>>一次移动多少空格, :help shiftwidthset cindent "C语言智能缩进set textwidth=80 "设置一行字符宽度set comments=sl:/*,mb:**,elx:* "自动补全注释符号filetype plugin indent on "开启文件类型自动检测set completeopt=longest,menu "设置单词自动补全选项set autoindent "设置自动缩进set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936 "设置编码,正确的编码才可以显示中文set fdm=indent "设置折叠模式为依据缩进自动折叠,:help fdmset hlsearch "设置搜索时高亮显示搜索字,:help hlsearchset tags+=~/.vim/systags" Always show the status lineset laststatus=2" Status line format:" {buffer number}: {file name, relative path to the current working directory}{modified flag}{readonly flag}" {help flag}{preview flag} [file type, encoding, format] [current line-total lines, current column][position percentage in file]set statusline=%n:/ %f%m%r%h%w/ [%Y,%{&fileencoding},%{&fileformat}]/ [%l-%L,%v][%p%%]" change commennt color to baby bluehi Comment ctermfg=6"====================================================================="taglist option,设置taglist插件的选项,进行定制"=====================================================================let Tlist_Show_One_File=1 "只显示一个文件的tagslet Tlist_Exit_OnlyWindow=1 "当taglist窗口是最后一个窗口时,退出vimlet Tlist_Use_Right_Window=1 "taglist窗口显示在右侧let mapleader = "," "修改引导符为",",默认为"/",后面都使用修改后的值noremap <silent> <F6> :TlistToggle<CR> "相当于定义快捷键noremap <silent> <Leader>tt :TlistToggle<CR> "定义第二个快捷键"=========================================================================="BufExplore setting,设置bufexplorer插件的选项,进行定制"==========================================================================let g:BufExplorerShowRelativePath=1let g:BufExplorerSplitRight=0let g:BufExplorerSplitVertical=1let g:BufExplorerSplitBelow=0noremap <silent> <Leader>be :BufExplorer<CR>noremap <silent> <Leader>bs :BufExplorerHorizontalSplit<CR>noremap <silent> <Leader>bv :BufExplorerVerticalSplit<CR>"=============================================================================="csope settings,设置cscope的参数内容,实现启动自动添加数据库"==============================================================================if has("cscope") set csprg=/usr/local/bin/cscope set csto=0 set cst set nocsverb " add any database in current directory if filereadable("cscope.out") cs add cscope.out " else add database pointed to by environment elseif $CSCOPE_DB != "" cs add $CSCOPE_DB endif set csverbendifnmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR>nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR>nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR>nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR>nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR>"========================================="NERDTree settings"=========================================noremap <Leader>nt :NERDTree"===================================================================" lookupfile setting"=================================================================== let g:LookupFile_MinPatLength = 2 "最少输入2个字符才开始查找 let g:LookupFile_PreserveLastPattern = 0 "不保存上次查找的字符串 let g:LookupFile_PreservePatternHistory = 1 "保存查找历史 let g:LookupFile_AlwaysAcceptFirst = 1 "回车打开第一个匹配项目 let g:LookupFile_AllowNewFiles = 0 "不允许创建不存在的文件 if filereadable("./lookup.files") "设置tag文件的名字 let g:LookupFile_TagExpr = '"./lookup.files"' endif nmap <silent> <Leader>lf <Plug>LookupFile<CR> nnoremap <silent> <Leader>lb :LUBufs<CR> nnoremap <silent> <Leader>lw :LUWalk<CR> nnoremap <silent> <Leader>lt :LUTags<CR>"======================================"quickfix setting"======================================noremap <silent> <Leader>cn :cn<CR>noremap <silent> <Leader>cp :cp<CR>noremap <silent> <Leader>cw :cw<CR>noremap <silent> <Leader>cc :cc<CR>noremap <silent> <Leader>co :copen<CR>noremap <silent> <Leader>ce :cclose<CR>"======================================"project manager"======================================noremap <silent> <Leader>pj :!~/opt/scripts/project<CR>if filereadable("./cscope.files") "silent exec '!ls' "exec '!project' silent exec '!~/opt/scripts/project'endif
此配置文件算有点复杂了,75行,还好没到百行。其实配置文件中主要的内容是插件的选项设置和快捷键的定义(命令的重映射),这些内容正是体现个性定制的根本,把他们设置修改成你喜欢、熟悉,使用效率高的内容。
vim自身的选项参数有很多,多到让我觉得也许只有作者才知道所有的选项~,但是我们只需取所需的就好了,而且所有的选项都可以通过在线帮助去理解使用,正如上面注释中写到的:help fdm。而插件的选项、参数、映射,如果你已经做好了前文的准备工作,那么也可以直接通过:help命令去查找和了解其详细的内容。如果大家完全参照前文的步骤进行使用,那么此配置文件可以完全复制使用。
二、项目管理脚本
前文提到cscope工具需要通过索引源文件来建立tag的数据库,ctags工具也需要进行源文件的索引关系,还有lookupfile插件需要进行项目中所有文件的查找,所有这些都需要我们提取项目的文件列表,以作为工具、插件的输入源,来得到需要的输出内容。
还有一个重要的点就是,在进行项目开发时,文件的数量和内容肯定是不断增加和修改的,这也就意味着需要不断地进行相关数据、tags的同步更新,以保证能索引到添加的符号和文件,能进行正确的跳转等。这些工作通过编写一个简单的脚本显然可以更好的胜任,下面是我的脚本project.sh:
<!-- lang: shell -->#! /bin/bashcscope_file="cscope.files" #cscope的输入源,文件列表,名字可自定义lookup_file="lookup.files" #lookupfile插件的索引文件列表,名字可自定义,但在.vimrc中用到了,需要保持一致,见上面内容#C语言项目的源文件列表find . -name /*.c -o -name /*.h > $cscope_file#cscope通过文件列表建立数据库cscope -bRq -i $cscope_file 2&>/dev/null#ctags工具递归建立整个项目的tags文件,默认文件名为tagsctags -R * 2&>/dev/null#建立lookupfile插件的文件索引列表,以下内容可以在帮助文档中找到,:help lookupfile-tags#(echo "!_TAG_FILE_SORTED 2 /2=foldcase/";(find . -type f -printf "%f/t%p/t1/n" | /# sort -f)) > ./filenametagsecho "!_TAG_FILE_SORTED 2 /2=foldcase/" > $lookup_filefind . /( -name .git -o -name .svn -o -path ./classes /) -prune -o -not -iregex '.*/./(jar/|gif/|jpg/|class/|exe/|dll/|pdd/|sw[op]/|xls/|doc/|pdf/|zip/|tar/|ico/|ear/|war/|dat/).*' -type f -printf "%f/t%p/t1/n"| sort -f >> $lookup_file
我的项目只用到了C语言进行开发,因此源文件会相对简单,如果项目使用别的开发语言,需要对脚本进行相应的修改。在每次开发过程结束后或中间,手动运行脚本来保证数据库、tags文件的一致,从而保证开发工作高效正确的进行。