打造C程序员专用vim

  • 格式:pdf
  • 大小:564.22 KB
  • 文档页数:23

打造C程序员专用VIM//作者:荒野无灯 //时间:2010年8月18日 //homepage: 内容目录一,安装VIM (1)1.1从二进制包安装(以ubuntu为例) (1)1.2从源码安装(以ubuntu为例) (2)二,配置VIM (4)2.1 个性化配置 (4)2.2 插件安装 (12)2.2.1 安装Exuberant Ctags + taglist (12)2.2.2 安装cscope + cscope_maps.vim (15)2.2.3 cscope 在大型项目上的应用 (以linux kernel为例 ) (18)2.2.3.1 决定cscope数据库的存放位置 (18)2.2.3.2 生成cscope.files文件 (18)2.2.3.4 生成cscope数据库 (19)2.2.3.5 更新数据库 (20)2.2.4使用c-support 插件加速代码开发 (20)2.2.4.1 安装c-support插件 (20)2.2.4.2常用 c-support 热键 (hotkey ) (21)一,安装VIM1.1从二进制包安装(以ubuntu为例)在terminal中输入:sudo suapt-get install vim-gtk vim1.2从源码安装(以ubuntu为例)首先到下载vim 的UNIX版本。

我这里用的是最新的7.3版本,文件名是vim-7.3.tar.bz2把源代码放到/usr/local/src 吧,个人习惯(试想,如果我们把该源码放在/tmp下面,然后我们编译安装完VIM后就删除掉这个,以后我们要升级VIM,必须先卸载掉老版本的VIM,到那时,卸载起来就没有那么方便了(我们不得不手动卸载之).如果我们保留了这个目录,我们以后随时都可以到这里运行sudo make uninstall卸载VIM)。

注意一定要先安装ncurses库(apt-get install libncurses5-dev libncursesw5-dev ),不然会出现如下错误:##############################################checking --with-tlib argument... empty: automatic terminal library selectionchecking for tgetent in -lncurses... nochecking for tgetent in -ltermlib... nochecking for tgetent in -ltermcap... nochecking for tgetent in -lcurses... nono terminal library foundchecking for tgetent()... configure: error: NOT FOUND!You need to install a terminal library; for example ncurses.Or specify the name of the library with –with-tlib.##############################################解压:tar -xvjf vim-7.3.tar.bz2然后,进入src目录,配置vim ,可以用 ./configure –help 查看配置选项:cd vim73/src./configure \--prefix=/usr/local \--enable-cscope \--enable-multibyte \--enable-xim \--enable-fontset \--with-features=huge \--enable-gui=gtk2 \--with-x \--with-compiledby="HuangYeWuDeng <admin@>"这里注意,--prefix=/usr/local是设置安装目录,这里是设为/usr/local (实际上如果不加这个选项,默认也是安装到这里的),这样安装到系统里后,实际vim 的路径为:/usr/local/share/vim/vim73/ 。

--enable-cscope 是启用VIM内置的cscope功能,关于cscope后面会讲到。

一定要注意记得加—enable-multibyte,不然中文会乱码的。

--enable-xim和--enable-fontset只有在--enable-gui成功的情况下才会生效。

(我这里明明加了--enable-gui ,配置时却提示无法启用GUI: “no GUI support”) --with-features=huge 启用几乎所有功能,呵呵,功能当然是多多益善. --with-compiledby 是编译者信息,通过vim --version 会显示此信息的。

接下来我们编译:make如果编译不成功,有error提示,注意根据提示解决问题。

编译成功后,保险起见,可以测试一下安装是否正确,功能是否都能用:make test如果测试全部通过,会有如下提示:Test results:ALL DONEmake[1]:正在离开目录 `/usr/local/src/vim73/src/testdir`然后就可以安装了:make install貌似这样自己编译安装的 /usr/bin/view 没有指向vim ,这里我们给它做个链接:因为/usr/bin/view 实际上是指向/etc/alternatives/view的,而/etc/alternatives/view又是一个链接,这里我就修改/etc下面这个链接吧.rm -f /etc/alternatives/viewln -s /usr/local/bin/vim /etc/alternatives/view#貌似手动安装没有建立vi的链接,为后面能正常使用cscope,这里做个符号链接:sudo ln -s /usr/local/bin/vim /usr/local/bin/vi不知为什么,我zh_CN.UTF-8的环境,打开vimtutor默认是繁体字,呃...还是简体字看起来快一点:rm /usr/local/share/vim/vim73/tutor/tutor.zh.utf-8iconv -f cp936 -t utf-8 /usr/local/share/vim/vim73/tutor/tutor.zh.euc -o /usr/local/share/vim/vim73/tutor/tutor.zh.utf-8现在你可以输入vim试一下功能是否正常?打开VIM教程练习一下吧:vimtutor二,配置VIM2.1 个性化配置开始个性化了,在当前目录建立配置文件.vimrc:cd ~/touch .vimrc然后开始配置了,下面是我的配置:" 禁用vi兼容模式,这个一般来说是必须的set nocompatible" Don't use Ex mode, use Q for formattingmap Q gq" CTRL-U in insert mode deletes a lot. Use CTRL-G u to first break undo," so that you can undo CTRL-U after inserting a line break.inoremap <C-U> <C-G>u<C-U>“启用鼠标支持set mouse=a" Only do this part when compiled with support for autocommands.if has("autocmd")" Enable file type detection." 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" Put these in an autocmd group, so that we can delete them easily.augroup vimrcExau!" For all text files set 'textwidth' to 78 characters.autocmd FileType text setlocal textwidth=78" 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)." Also don't do it when the mark is in the first line, that is the default" position when opening a file.autocmd BufReadPost *\ if line("'\"") > 1 && line("'\"") <= line("$") |\ exe "normal! g`\"" |\ endifaugroup ENDelseset autoindent" always set autoindenting onendif " has("autocmd")" Convenient command to see the difference between the current buffer and the" file it was loaded from, thus the changes you made." Only define it when not defined already.if !exists(":DiffOrig")command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis \ | wincmd p | diffthisendifset ruler" 总是显示光标位置set showcmd" display incomplete commandsau FileType html,python,vim,javascript setl shiftwidth=2 au FileType html,python,vim,javascript setl tabstop=2au FileType java,php setl shiftwidth=4au FileType java,php setl tabstop=4" 智能tabset smarttab" 打开linebreak ,光标将不能左右移动到各行set lbr" textwidthset tw=0"设置自动缩进 Auto indent 上面(if语句里)设置了,这里取消"set ai" Smart indent设置智能缩进"set smartindent"还是用cindent ,它更聪明些(设置了cindent ,smartindent 无效) " C-style indetingset cindent" Wrap lines 超过窗口宽度的行自动回绕set wrap"jquery 语法高亮( 要将jquery.vim 放置在 ~/.vim/syntax/下 )au BufRead,BufNewFile *.js set syntax=jquery" Sets how many lines of history VIM har to rememberset history=50" Set to auto read when a file is changed from the outsideset autoread" Do not redraw, when running macros.. lazyredrawset lz" set 7 lines to the curors - when moving vertical.." scrolloff 光标上下两侧最少保留的屏幕行数,使得总有一些可见的上下文set so=7" The commandbar is 2 highset cmdheight=2" Change buffer - without savingset hid" Ignore case when searching 搜索时忽略大小写,这个按个人需求吧,我这里不启用" set ignorecase" do incremental searchingset incsearch" Set magic on 魔术匹配模式(默认打开)set magic" How many tenths of a second to blink (matchtime)" 配对闪动时间,多少个十分之一秒set mat=4" Highlight search thingsset hlsearch" Turn backup off 两个都设置,完全关掉" nobakcupset nobackup" nowritebackupset nowb"缓冲区不使用交换文件,而使用内存.安全起见还是使用下为好"set noswapfile" allow backspacing over everything in insert mode set backspace=indent,eol,start" switch buffers with Tabmap <C-Tab> :bn<CR>map <S-Tab> :bp<CR>" 我这里的dawn2 是由dawn 转换的在term 下使用的配色方案“不可否认, monaco 的确是一种非常好的编程字体if has("gui_running")set guifont=monaco\ 11" set color schemacolor dawnwinpos 172 103elsecolor dawn2"color luciusendif" 以下为debian 特别优化的" debian start" Suffixes that get lower priority when doing tab completion for filenames." These are files we are not likely to want to edit or read.setsuffixes=.bak,~,.swp,.o,.info,.aux,.log,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.i lg,.inx,.out,.toc" Set paper size from /etc/papersize if available (Debian-specific)if filereadable("/etc/papersize")let s:papersize = matchstr(readfile('/etc/papersize', '', 1), '\p*') if strlen(s:papersize)exe "set printoptions+=paper:" . s:papersizeendifendif" debian end" csupport pluginmap <silent> <F9> <Esc>:cprevious<CR>map <silent> <F10> <Esc>:cnext<CR>"for taglist pluginnnoremap <silent> <F8> :TlistToggle<CR>2.2 插件安装2.2.1 安装Exuberant Ctags + taglist要使用taglist插件,先要安装Exuberant Ctags.Exuberant Ctags可到 下载. 目前我下载的版本是5.8的,把下载的ctags-5.8.tar.gz放到 /usr/local/src 目录下:cd /usr/local/srctar -xvzf ctags-5.8.tar.gzcd ctags-5.8./configuremakemake install安装完成后,ctags程序应该在/usr/local/bin/ctags然后可到源码目录,用以下命令生成名为 tags 的索引文件:ctags -R关于ctags更详细的用法,可ctags --help 或者 man ctags这样以后,在该目录,可以这样使用vim :vim −t tag # 启动vim 并把光标定位到 标签tag 定义处.:ta tag #查找标签tagCtrl-]#查找光标下的标签Ctrl-t#返回跳转到标签文件前的上一个地方这样是不是很方便啊?接下来安装taglist插件,我下载到的zip包名称为:taglist_45.zip把它copy到 ~/.vim/下面,如果没有 ~/.vim目录,可以自己新建一个: mkdir -p ~/.vim/plugincd ~/.vimmkdir aftermkdir colorsmkdir docmkdir ftpluginmkdir pluginmkdir syntax然后 :unzip taglist_45.zip这样文档和插件就都安装好了.如我上面的配置文件一样,加上:"for taglist pluginnnoremap <silent> <F8> :TlistToggle<CR>这样,我们只需按下F8功能键即可打开或者关闭taglist窗口.当然,如果你愿意,也可以手动敲命令::TlistToggle下面列出在Taglist 窗口中可用的快捷键(特别注意:以下快捷键只能在taglist 窗口中使用!):快捷键功能描述<CR>跳转到光标下的标签定义处o(小写)打开一个新窗口,跳转到光标下的标记定义处P(大写)跳转到前一个(Ctrl-W_p)窗口中的标记处p在文件窗口中显示标记的定义且保持光标处在taglist窗口中t新建一tab窗口,打开文件并跳转到标记处,如文件已在某一tab被打开,则只跳转.Ctrl-t新建一tab窗口,打开文件并跳转到标记处<Space>显示当前光标下的标记的原型(prototype)u更新taglist 窗口中的标记s标记排序(按名字还是按标记在文件中出现的自然顺序<从上至下> ) d删除光标下的标记x放大或缩小taglist 窗口+展开一个折叠(fold)-收缩一个折叠*展开所有折叠=收缩所有折叠[[跳转到上一个文件的开头<Backspace>跳转到上一个文件的开头]]跳转到下一个文件的开头<Tab>跳转到下一个文件的开头q关闭taglist 窗口<F1>显示帮助信息更多信息请查看taglist.txt ( view ~/.vim/doc/taglist.txt )有了taglist 这个插件,是不是更方便查找标记了啊?2.2.2 安装cscope + cscope_maps.vim到下载源码,我这里是cscope-15.7a.tar.bz2还是将源码包放到 /usr/local/src/安装 cscope :cd /usr/local/src/tar -xvjf cscope-15.7a.tar.bz2cd cscope-15.7a./configuremakemake install成功安装后,到存放源码的目录,执行:cscope -R会进入 cscope 基于curses的GUI界面,它下面问你要查找什么 东东?这个界面可用的一些快捷键:ctrl+d 退出tab 在结果与搜索菜单之间移动ctrl+p 前一项(对搜索结果和菜单项都适用)ctrl+n 后一项(对搜索结果和菜单项都适用)按enter搜索,显示出搜索结果:移动到相应的结果项,按enter即会自动调用 vi 编辑器编辑.(还记得前面我安装vim后做了一个符号链接吗?).现在你会发现一个,当你要搜索一个新东东时,你不得不退出VIM再回到cscope的界面来搜索.现在按Ctrl-d (真不明白为什么是Ctrl-d ,我第一次打开时折腾了老半天不知道怎么退出来)退出cscope ,把可爱的cscope_maps.vim放进 ~/.vim/plugin/ .再重新打开 VIM,打开一个C源码程序,把光标移到一个C标识符上, 按CTRL-\ s( 先ctrl-\ ,再按s 键 ,速度不能太慢) ,如果有结果显示,可用以下快捷键移动:下翻: 空格/d/j (屏幕/页/行)上翻: b/u/k(同上)要进入相关文件标记处,键入数字然后回车.还记得吗?上面说过,ctags查找是Ctrl-] . ] 与\ 是邻居哦. CTRL-\ s 是cscope_maps.vim插件的功能.如果要用VIM内置的cscope功能来查找也可以::cscope find symbol foo或:cs f s foof 即是find , s 是symbol ,符号,意为 查找本C符号.此外,还有:g 查找本定义d查找本函数调用的函数c查找调用本函数的函数t查找本字符串e查找本egrep 模式f查找本文件I查找包含本文件的文件更多用法可见VIM帮助文档(:h cs).Cscope 默认只支持C, lex, 和 yacc 文件 (.c, .h, .l, .y) ,如果还要它索引其它类型的怎么办? 有 cscope.files 帮忙.在当前目录创建一个名为cscope.files 的文件,把要cscope索引的文件都写入该文件.此时可以通过cscope -bR 重建cscope索引数据库.此外,如果我们设置了$CSCOPE_DB这个环境变量的话,我们就不必在与cscope索引数据库所在的同一个目录运行VIM了(也就是说我们在任何地方运行VIM都能够查找标记),这种方法特别适合于当项目文件分散在几个子目录中时的情况.(注:要想它正常工作 , cscope.files中必须要用绝对路径 ):#跳转到根目录cd /#生成cscope.files文件,这里只需要对.c 和 .h 文件产生索引数据库find /my/project/dir -name '*.c' -o -name '*.h' > /foo/cscope.files#跳转到cscope.files文件所在目录cd /foo#重建或者新建索引数据库cscope -b#设置CSCOPE_DB环境变量的值为 cscope.out文件所在路径(绝对路径)CSCOPE_DB=/foo/cscope.out; export CSCOPE_DB2.2.3 cscope 在大型项目上的应用(以linux kernel为例)对于大型代码库,cscope是个特别有用的工具,它可以帮助你做快速且有针对性的搜索从而比你手动用grep搜索要节省很多时间,这里以linux kernel 为例说明将cscope用于大型项目的步骤,虽然这里只讲了将它用于linux kernel ,其实它也适用于大型的C++ 或者 Java项目.2.2.3.1 决定cscope数据库的存放位置首先我们可以从/获得内核源代码,这里假设你下载了Linux 2.4.18 并且把它解压在/home/hacklog/linux-2.4.18注意:linux内核的tarball 大概是30MB,解压后有150MB,我们产生的cscope数据库大概要20-100+MB (实际大小取决于你要在cscope数据库中包含多少内核源码),如果有需要,你可以把cscope数据库文件放在一个不同的磁盘分区.我们这里假设把cscope数据库文件和相关文件放在/home/hacklog/cscope2.2.3.2 生成cscope.files文件对某些项目,你可能需要将项目代码目录中的每个C源代码文件都包含进cscope数据库,如果是这种情况,你可以跳过这一步,直接在项目顶层目录执行cscope -R.但是如果其中你有一些源文件要排除的,或者你的项目包含C++ 或者Java源文件 (默认情况下,cscope只解析.c,.h,.y, 或.l 后缀的文件),这时你就需要生成一个名为cscope.files的文件,这个文件应当包含你要cscope搜索的所有源码文件(每行一个文件名).你可能需要使用绝对路径,这样你就可以在非cscope数据库目录中使用cscope数据库了,下面的命令先跳转到根目录,所以find输出的文件名是绝对路径的.对于绝大多数项目,你的find命令可能像下面这样简单:cd /find /my/project/dir -name '*.java' >/my/cscope/dir/cscope.files对于Linux kernel, it's a little trickier, 因为我们要排除docs和scripts目录中的所有文件, 加上除Intel x86 之外的所有其它架构及其汇编代码 (我想这是你感兴趣的架构).另外,在这里我还排除了所有内核驱动代码(它们会加倍cscope 要解析的代码数量,增加cscope 数据库的大小,并且它们包含很多重复的定义会导致我们搜索上的困难.LNX=/home/hacklog/linux-2.4.18cd /find $LNX \ -path "$LNX/arch/*" ! -path "$LNX/arch/i386*" -prune -o \ -path "$LNX/include/asm-*" ! -path "$LNX/include/asm-i386*" -prune -o \ -path "$LNX/tmp*" -prune -o \ -path "$LNX/Documentation*" -prune -o \ -path "$LNX/scripts*" -prune -o \ -path "$LNX/drivers*" -prune -o \ -name "*.[chxsS]" -print >/home/jru/cscope/cscope.files2.2.3.4 生成cscope数据库cd /home/hacklog/cscope # cscope.files 文件所在目录cscope -b -q -k-b 参数告诉cscope只生成数据库,不进入cscope GUI, -q 参数告诉cscope要生成一个inverted index 文件,它将使得对大弄数据库的搜索变得更快一些.最后 -k 参数告诉cscope要工作于内核模式———此时它不会到/usr/include 查找你源码中包含(#included )的 任何头文件.这样将生成3个文件:cscope.in.out cscope.out cscope.po.out .生成的速度是相当快的,在一台900 MHz ,带标准IDE磁盘的 Pentium III机器上,产生这25MB的文件只花了12秒.关于使用生成的cscope数据库,上一小节已经讲了.如果你想直接使用cscope来查找也可以,注意用以下方式运行cscope :cscope -d这告诉cscope不要重新生成数据库,如果你直接运行cscope不加任何参数,同样会重新生成数据库,这样,如果源码数量众多,将浪费一些时间启动cscope.2.2.3.5 更新数据库如果你的项目中有新文件加入,你得返回find 命令去更新cscope.files文件.然后再重复上面的步骤即可.2.2.4使用c-support 插件加速代码开发Csupport (cvim) 可以让你以一种比较连续的编码风格来加速代码的编写,使用csupport可以快速插入函数,包含库文件,添加注释.使用它,语法检查,编译,运行,这些你都可以用vim来搞定了.关于它的全部功能,请:h csupport 自行阅读.2.2.4.1 安装c-support插件安装是非常的方便,解压一下即可:cd ~/.vimunzip cvim.zip(如果不是第一次装,可unzip cvim.zip -x *Templates *.template 避免覆盖模板)安装完后,可在~/.vimrc 添加快捷键映射(如我上面的配置文件中示,下面这两个快捷键是用于快速定位错误的):" csupport pluginmap <silent> <F9> <Esc>:cprevious<CR>map <silent> <F10> <Esc>:cnext<CR>然后我们更新一下帮助文档::helptags $VIMRUNTIME/doc:helptags ~/.vim/doc2.2.4.2常用 c-support 热键 (hotkey )全部hotkey可用 evince ~/.vim/c-support/doc/c-hotkeys.pdf 打开查看.insert mode, (n) normal mode, (v) visual modeComments 注释(c开头)\cl添加 end-of-line 注释(n,v,i)\cj调整end-of-line 注释(n,v,i) \cs设置end-of-line 注释的列数 (n)\c*用/* */注释掉一个代码块code comment /* */ (n,v)⇒\cc用//注释掉一个代码块code comment // (n,v)⇒\co取消注释comment code (n,v)⇒\cfr frame comment (n,i) \cfu function comment (n,i) \cfdh file description (header) (n,i) \chs H–file sections (tab compl.) (n,i) \ckc keyword comment (tab compl.) (n,i) \csc special comment (tab compl.) (n,i) \cd Date (n,v,i) \ct date & time (n,v,i)Preprocessor 预处理指令(p开头)\ps choose a Std. Lib. Include (n,i)\pc choose a C99 include (n,i)\p< #include<...> (n,i)\p" #include"..." (n,i)\pd #define (n,i)\pu #undef (n,i)\pie #if #else #endif (n,v,i) \pid #ifdef #else #endif (n,v,i) \pin #ifndef #else #endif (n,v,i) \pind #ifndef #def #endif (n,v,i) \pe #error (n,i) \pl #line (n,i)Idioms (i开头)\if Function (n,v,i) \isf static function (n,v,i) \im Main() (n,v,i) \ie enum + typedef (n,v,i) \is struct + typedef (n,v,i) \iu union + typedef (n,v,i) \ip Printf() (n,i)\isc Scanf() (n,i)Run 运行编译(r开头)\rc save and compile (n,i)\rl Link (n,i)\rr Run (n,i)\ra set comand line arguments (n,i)\rm run make (n,i)\rma cmd. line arg. for make (n,i)\rp run splint1 1 (n,i) \rpa cmd. line arg. for splint (n,i) \rd run indent (n,i)1可到 下载安装参考文档:The Vim/Cscope tutorialUsing Cscope on large projects (example the Linux kernel)。