Vim和Ctags提示和技巧

我刚刚用我的Vim(或者说gVim)安装了Ctags (用于帮助C ++开发),并且希望find你喜欢的命令,macros,快捷方式以及随之而来的提示。

分享你最好的武器。 还有哪些Vim附加组件可以推荐用于Vim开发的C ++?

编辑还有什么其他的附加组件可以和Ctags一起使用?

EDIT2你使用哪个版本的gVim标签? 这有什么不同吗?

EDIT3如何提高大型和小型项目的编程经验?

Ctrl + ] – 进入定义
Ctrl + T – 从定义跳回。
Ctrl + W Ctrl + ] – 在水平分割中打开定义

在vimrc中添加这些行
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>

Ctrl + \ – 在新选项卡中打开定义
Alt + ] – 在垂直分割中打开定义

标签生成后。 您可以使用以下键来标记和标记function:

Ctrl + Left MouseClick – 进入定义
Ctrl + Right MouseClick – 从定义中跳回

一行总是在我的.vimrc:

 set tags=./tags;/ 

这将在当前目录中查找“标签”,并对树进行处理,直到find一个为止。 IOW,你可以在你的源码树中的任何地方,而不只是它的根。

C开发的另一个有用的插件是cscope正如Ctags让你跳到定义,Cscope跳转到调用函数。

如果你在〜/ bin /目录下有cscope,在你的.vimrc文件中添加以下内容,并使用g ^]去调用函数(参见:help cscope)。

 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 – 你必须生成(并定期更新)数据库。 我使用下面的脚本

 select_files > cscope.files ctags -L cscope.files ctags -e -L cscope.files cscope -ub -i cscope.files 

其中“select_files”是从Makefile中提取C和头文件列表的另一个脚本。 这样我只索引项目实际使用的文件。

你可以添加目录到你的ctags查找。 例如,我有一个为Qt4构build的ctags索引,并在我的.vimrc中有这个:

 set tags+=/usr/local/share/ctags/qt4 

以上所有和…

code_complete:函数参数完整,代码片段,等等。

taglist.vim:源代码浏览器(支持C / C ++,Java,Perl,Python,tcl,sql,php等)

我使用ALT左和ALT右popup/推/从标签堆栈。

 " Alt-right/left to navigate forward/backward in the tags stack map <M-Left> <CT> map <M-Right> <C-]> 

如果使用hjkl进行移动,则可以映射<Mh><Ml>

几个同名的定义

<Cw>g<C-]>在拆分中打开定义,但是也要这样做:tjump将转到定义,或者如果有几个定义,则向您提供可供select的定义列表。

我最常用的命令是C-],它跳转到光标下的函数定义。 你可以更频繁地使用它来跟随更多的电话。 之后,Co会带你回到一个层次,Ci再深入。

我发现了一个必备的taglist插件。 它在单独的窗口中列出了它所知道的所有标签(已经打开的文件),并且可以很容易地浏览较大的文件。

我主要用它来开发Python,但只能用于C / C ++。

我已经在我的一个实验性插件中封装了标签操作。

关于vim中的C ++开发,我已经在那里回答了:我使用自己的套件和一些其他的插件。

我一直在适应我的vim插件两年,以支持足够大的c + +项目。 你可以看看他们。

他们使用ctags和cscsope。

http://www.vim.org/scripts/script.php?script_id=1638
http://www.vim.org/scripts/script.php?script_id=2507

我在.gvimrc文件中添加以下内容,当gvim启动时,该文件从任意点search树的标签文件:

 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() 

然后,我使用一个如下所示的脚本定期重新生成源代码树顶部的标记文件:

 #!/bin/bash find . -regex ".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L - 

我在macos中使用vim,并且原始的ctags不能正常工作,所以我下载了最新的并且configuration了make make来安装它。 我在/ usr / local / bin / ctags中安装ctgas(保留原来的一个)

 "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 <Mj> <C-]> map <Mk> <CT> 

我调整了上面的SetTags()search函数(应该用等效的set tags+=./tags;/来替代)来为cscope工作。 似乎工作!

 "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() 

上面的SetCscope()函数的另一个迭代。 这设置cscope预path获取匹配,而不是在“cscope.out”的目录是:

 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