我刚刚用我的 Vim(或者更确切地说是 gVim)安装了Ctags(以帮助 C++ 开发),并想找出你最喜欢的命令、宏、快捷方式、伴随它的提示......
分享你最好的武器库。对于 Vim 开发中的 C++,您会推荐哪些其他 Vim 附加组件?
编辑您将与 Ctags 一起使用哪些其他附加组件?
EDIT2你使用什么版本的 gVim 和标签?这有什么不同吗?
EDIT3您如何增强您对大型和小型项目的编程体验?
我刚刚用我的 Vim(或者更确切地说是 gVim)安装了Ctags(以帮助 C++ 开发),并想找出你最喜欢的命令、宏、快捷方式、伴随它的提示......
分享你最好的武器库。对于 Vim 开发中的 C++,您会推荐哪些其他 Vim 附加组件?
编辑您将与 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+ ]- 在垂直拆分中打开定义
生成标签后。您可以使用以下键标记进入和标记出函数:
Ctrl+ Left MouseClick
- 转到定义
Ctrl+ Right MouseClick
- 从定义跳回
我的 .vimrc 中总是有一行:
set tags=./tags;/
这将在当前目录中查找“标签”,然后将树向上移动到根目录,直到找到一个。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 构建的 ctags 索引,并且在我的 .vimrc 中有这个:
set tags+=/usr/local/share/ctags/qt4
以上所有和...
code_complete :函数参数完成,代码片段等等。
taglist.vim : 源码浏览器 (支持 C/C++, java, perl, python, tcl, sql, php等)
我使用 ALT-left 和 ALT-right 从/向标签堆栈弹出/推送。
" 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-] ,它跳转到光标下函数的定义。您可以更频繁地使用它来跟踪更多电话。之后,Co会带你回到一个层次,Ci再更深。
我发现taglist插件是必备的。它在一个单独的窗口中列出了它知道的所有标签(您打开的文件),并且可以很容易地浏览更大的文件。
我主要将它用于 Python 开发,但它只能更好地用于 C/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 启动时从任意点向上搜索标签文件:
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不好用,所以我下载最新的并配置make make install。我在 /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 <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