Vim and Ctags tips and tricks
我刚刚安装了Ctags(以帮助C++开发)与我的VIM(或更确切地说GVIM),并想找出你喜欢的命令,宏,快捷方式,提示与它一起去…
分享你最好的武器。对于VIM开发,你会推荐什么其他的VIM插件呢?
编辑与ctags一起使用的其他附加组件?
edit2什么版本的gvim与标签一起使用?有什么区别吗?
edit3如何提高大项目和小项目的编程经验?
ctrl+]-转到定义ctrl+t-从定义跳回来。ctrl+w ctrl+]-在水平拆分中打开定义
在VIMRC中添加这些行
ctrl+-在新选项卡中打开定义alt+]-以垂直拆分方式打开定义
在生成标签之后。您可以使用以下键标记函数和标记函数:
ctrl+
我的.vimrc中总是有一行:
1 | set tags=./tags;/ |
这将在当前目录中查找"tags",并向上搜索树,直到找到根目录为止。看,你可以在你的源代码树中的任何地方,而不仅仅是它的根。
C开发的另一个有用的插件是CScope正如ctags允许您跳到定义,cscope跳到调用函数。
如果您的~/bin/目录中有cscope,请将以下内容添加到.vimrc中,并使用g^]转到调用函数(请参见:help cscope)。
1 2 3 4 5 6 7 8 9 10 11 12 13 | if has("cscope") set csprg=~/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 endif |
差点忘了…就像ctags一样-您必须生成(并定期更新)数据库。我用下面的脚本
1 2 3 4 | select_files > cscope.files ctags -L cscope.files ctags -e -L cscope.files cscope -ub -i cscope.files |
其中"select_files"是从makefile中提取c和头文件列表的另一个脚本。这样,我只索引项目实际使用的文件。
您可以将目录添加到CTags查找中。例如,我为qt4构建了一个ctags索引,并在我的.vimrc中有这个索引:
1 | set tags+=/usr/local/share/ctags/qt4 |
以上所有的和…
代码完成:函数参数完成,代码片段等等。
- http://www.vim.org/scripts/script.php?Script PTId=1764
Vistm:源代码浏览器(支持C/C++,Java,Perl,Python,TCL,SQL,PHP等)
- http://www.vim.org/scripts/script.php?Script PTId=273
我使用alt-left和alt-right来弹出/推送标签堆栈。
1 2 3 | " Alt-right/left to navigate forward/backward in the tags stack map <M-Left> <C-T> map <M-Right> <C-]> |
如果使用
同一名称的几个定义
我使用最多的命令是C-]跳转到光标下函数的定义。您可以更频繁地使用它来跟踪更多的呼叫。在那之后,C-O会把你带回到一个水平,C-I会再深入一步。
我发现了一个必备的标签列表插件。它在一个单独的窗口中列出它知道的所有标记(您打开的文件),使导航较大的文件变得非常容易。
我主要使用它来进行Python开发,但是它只能对C/C++更好。
我已经调整了我的VIM插件两年来支持足够大的C++项目。你可以看看它们。
他们使用ctags和cssope。
http://www.vim.org/scripts/script.php?Script PTId=1638http://www.vim.org/scripts/script.php?Script PTId=2507
我已经在我的一个实验插件中封装了标签操作。
关于VIM中的C++开发,我已经回答了:我使用我自己的套件和一些其他插件。
我将以下内容放入.gvimrc文件中,该文件在gvim启动时从任意点搜索树中的标记文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function SetTags() let curdir = getcwd() while !filereadable("tags") && getcwd() !="/" cd .. endwhile if filereadable("tags") execute"set tags=" . getcwd() ."/tags" endif execute"cd" . curdir endfunction call SetTags() |
然后,我会定期在源代码树顶部重新生成一个标记文件,脚本如下:
1 2 3 | #!/bin/bash find . -regex".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L - |
我在MacOS中使用VIM,而原来的CTags不能很好地工作,所以我下载最新的并配置make make安装它。我在/usr/local/bin/ctags中安装ctgas(保留原始版本)
1 2 3 4 5 6 7 8 | "taglist let Tlist_Ctags_Cmd ="/usr/local/bin/ctags" let Tlist_WinWidth = 50 map <leader>ta :TlistToggle<cr> map <leader>bta :!/usr/local/bin/ctags -R .<CR> set tags=tags;/ map <M-j> <C-]> map <M-k> <C-T> |
上面的setcscope()函数的另一个迭代。设置cscope pre-path以获取匹配,而不在目录中,其中"cscope.out"是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function s:FindFile(file) let curdir = getcwd() let found = curdir while !filereadable(a:file) && found !="/" cd .. let found = getcwd() endwhile execute"cd" . curdir return found endfunction if has('cscope') let $CSCOPE_DIR=s:FindFile("cscope.out") let $CSCOPE_DB=$CSCOPE_DIR."/cscope.out" if filereadable($CSCOPE_DB) cscope add $CSCOPE_DB $CSCOPE_DIR endif command -nargs=0 Cscope !cscope -ub -R & endif |
我修改了上面的settags()搜索函数(应该用等效的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | "cscope file-searching alternative function SetCscope() let curdir = getcwd() while !filereadable("cscope.out") && getcwd() !="/" cd .. endwhile if filereadable("cscope.out") execute"cs add" . getcwd() ."/cscope.out" endif execute"cd" . curdir endfunction call SetCscope() |