我刚刚安装了Ctags(用于帮助C++开发),并希望了解您与其配套使用的最喜爱的命令、宏、快捷键和技巧……
分享你的最佳武器。你还推荐哪些Vim插件用于C++在Vim上开发?
编辑 添加到 Ctags 中的其他插件有哪些?
编辑2 你用的gVim版本带有标签吗?这会有影响吗?
编辑3 你如何提升你在大型和小型项目中的编程经验?
我刚刚安装了Ctags(用于帮助C++开发),并希望了解您与其配套使用的最喜爱的命令、宏、快捷键和技巧……
分享你的最佳武器。你还推荐哪些Vim插件用于C++在Vim上开发?
编辑 添加到 Ctags 中的其他插件有哪些?
编辑2 你用的gVim版本带有标签吗?这会有影响吗?
编辑3 你如何提升你在大型和小型项目中的编程经验?
Ctrl+] - go to definition
Ctrl+T - Jump back from the definition.
Ctrl+W Ctrl+] - Open the definition in a horizontal split
Add these lines in vimrc
map <C-> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>
Ctrl+ - Open the definition in a new tab
Alt+] - Open the definition in a vertical split
生成标签后,您可以使用以下键将其标记到函数中并退出函数:
Ctrl+Left MouseClick
- Go to definition
Ctrl+Right MouseClick
- Jump back from definition
一行总是写在我的 .vimrc 文件中:
set tags=./tags;/
这将在当前目录中查找“tags”,并向根目录方向工作,直到找到一个。 换句话说,您可以在源树中的任何位置,而不仅仅是在其根目录。
Another useful plugin for C development is cscope Just as Ctags lets you jump to definitions, Cscope jumps to the calling functions.
如果您的~/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构建了ctags索引,并在我的.vimrc文件中添加了以下内容:
set tags+=/usr/local/share/ctags/qt4
以上所有的以及...
代码完成:函数参数完整,代码片段等等。
taglist.vim:源代码浏览器(支持C/C ++、Java、Perl、Python、Tcl、SQL、PHP等)
我使用ALT+左箭头和ALT+右箭头来弹出/推入标签栈。
" Alt-right/left to navigate forward/backward in the tags stack
map <M-Left> <C-T>
map <M-Right> <C-]>
如果您使用 hjkl
进行移动,您可以将 <M-h>
和 <M-l>
进行映射代替。
相同名字的几个定义。
<C-w>g<C-]>
打开定义的拆分窗口,并执行 :tjump
,该命令要么跳转到定义,要么如果有多个定义,则呈现出可供选择的定义列表。
我经常使用的命令是C-],它可以跳转到游标下函数的定义处。您可以频繁使用它来跟进更多的调用。之后,C-o将会使您回到上一层,C-i则会再次深入。
我发现 taglist 插件是必不可少的。它在单独的窗口中列出了所有它知道的标签(您打开的文件),并且使得浏览更大的文件非常容易。
我主要用它进行Python开发,但对于C/C++开发也会更好。
我已经调整了我使用的Vim插件两年时间以支持足够大的C++项目,您可以看看它们。
他们使用ctags和cscope。
http://www.vim.org/scripts/script.php?script_id=1638
http://www.vim.org/scripts/script.php?script_id=2507
我将以下内容放入我的.gvimrc文件中,在gvim启动时从任何位置向上搜索标签文件:
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 -
I use vim in macos, and the original ctags doesn t work well, so I download newest and configure make make install it. I install ctgas in /usr/local/bin/ctags(to keep original one)
"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>
我改编了上面的SetTags()搜索函数(应该替换为等效的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预路径设置为在没有在“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