485

我刚刚用我的 Vim(或者更确切地说是 gVim)安装了Ctags(以帮助 C++ 开发),并想找出你最喜欢的命令、宏、快捷方式、伴随它的提示......

分享你最好的武器库。对于 Vim 开发中的 C++,您会推荐哪些其他 Vim 附加组件?

编辑您将与 Ctags 一起使用哪些其他附加组件?

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

EDIT3您如何增强您对大型和小型项目的编程体验?

4

15 回答 15

394

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- 从定义跳回

于 2009-02-19T04:54:36.517 回答
176

我的 .vimrc 中总是有一行:

set tags=./tags;/

这将在当前目录中查找“标签”,然后将树向上移动到根目录,直到找到一个。IOW,您可以在源代码树中的任何位置,而不仅仅是它的根。

于 2009-04-12T08:58:36.403 回答
45

另一个对 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 和头文件列表的脚本。这样我只索引项目实际使用的文件。

于 2009-02-19T15:40:48.993 回答
27

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

set tags+=/usr/local/share/ctags/qt4
于 2009-02-19T01:41:54.997 回答
23

以上所有和...

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

taglist.vim : 源码浏览器 (支持 C/C++, java, perl, python, tcl, sql, php等)

于 2009-03-05T19:45:51.550 回答
16

我使用 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>不是。

于 2009-02-19T01:40:35.063 回答
10

同名的几个定义

<C-w>g<C-]>在拆分中打开定义,但也:tjump可以转到定义,或者如果有多个定义,则为您提供一个可供选择的定义列表。

于 2010-04-22T19:06:43.110 回答
8

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

于 2009-02-19T01:45:25.083 回答
6

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

我主要将它用于 Python 开发,但它只能更好地用于 C/C++。

于 2009-02-21T09:52:25.367 回答
5

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

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

于 2009-02-19T15:03:22.667 回答
5

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

他们使用 ctags 和 cscsope。

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

于 2009-03-05T10:50:56.280 回答
4

我将以下内容放在我的 .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 -
于 2009-04-17T23:22:01.137 回答
2

我在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>
于 2010-12-27T06:11:09.170 回答
1

我调整了上面的 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()
于 2011-05-04T18:50:34.420 回答
1

上面的 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
于 2011-06-13T16:53:19.567 回答