Vim和Ctags提示和技巧

时间:2009-02-19 01:37:11

标签: vim ctags vim-macros

我刚刚使用我的Vim(或者更确切地说是gVim)安装了Ctags(以帮助进行C ++开发),并希望找到您最喜欢的命令,宏,快捷方式,以及随之而来的提示。

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

编辑您将与Ctags一起使用的其他附加组件是什么?

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

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

15 个答案:

答案 0 :(得分: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 - 从定义

跳回

答案 1 :(得分:177)

我的.vimrc中总会出现一行:

set tags=./tags;/

这将在当前目录中查找“tags”,并将树向root处理,直到找到一个。 IOW,你可以在源代码树的任何地方而不仅仅是它的根目录。

答案 2 :(得分: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和头文件列表的脚本。这样我只索引项目实际使用的文件。

答案 3 :(得分:27)

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

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

答案 4 :(得分:23)

以上所有和......

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

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

答案 5 :(得分: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>

答案 6 :(得分:10)

同名的几个定义

<C-w>g<C-]>在拆分中打开定义,但也可以:tjump执行定义,或者,如果有多个定义,则会显示可供选择的定义列表。

答案 7 :(得分:8)

我最常使用的命令是C-],它跳转到光标下函数的定义。您可以更频繁地使用它来跟随更多呼叫。在那之后,C-o将带你回到一个级别,C-i再次深入。

答案 8 :(得分:6)

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

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

答案 9 :(得分:5)

我在我的experimental plugin中封装了标签操作。

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

答案 10 :(得分: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

答案 11 :(得分: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 -

答案 12 :(得分:2)

我在macos中使用vim,而原来的ctags效果不好,所以我下载最新版并配置make make install it。 我在/ 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>

答案 13 :(得分: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()

答案 14 :(得分: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