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