代码之家  ›  专栏  ›  技术社区  ›  Sasha

VIM和CTAG提示和技巧[关闭]

  •  485
  • Sasha  · 技术社区  · 15 年前

    我刚安装好 Ctags (有助于C++开发)与我的VIM(或更确切地说,GVIM),并想找出你喜欢的命令,宏,快捷方式,提示与它一起去…

    分享你最好的武器。对于VIM开发,你会推荐什么其他的VIM插件呢?

    编辑 与CTAG结合使用的其他附加组件是什么?

    编辑2 什么版本的gvim你使用标签?有什么区别吗?

    编辑3 如何提高大项目和小项目的编程经验?

    15 回复  |  直到 15 年前
        1
  •  394
  •   Olivier Pons    10 年前

    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键 + \ -在新选项卡中打开定义
    中高音 + ] -在垂直拆分中打开定义

    在生成标签之后。您可以使用以下键标记函数和标记函数:

    Ctrl键 + Left MouseClick -转到定义
    Ctrl键 + Right MouseClick -从定义跳回来

        2
  •  177
  •   Conspicuous Compiler    13 年前

    我的.vimrc中总是有一行:

    set tags=./tags;/
    

    这将在当前目录中查找“tags”,并向上搜索树,直到找到根目录为止。看,你可以在你的源代码树中的任何地方,而不仅仅是它的根。

        3
  •  45
  •   nimrodm    15 年前

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

        4
  •  27
  •   strager    15 年前

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

    set tags+=/usr/local/share/ctags/qt4
    
        5
  •  23
  •   Johan    13 年前

    以上所有的和…

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

    Vistm:源代码浏览器(支持C/C++,Java,Perl,Python,TCL,SQL,PHP等)

        6
  •  16
  •   strager    15 年前

    我使用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> 相反。

        7
  •  10
  •   Heikki Naski    14 年前

    同一名称的几个定义

    <C-w>g<C-]> 在拆分中打开定义,但也要打开 :tjump 它要么指向定义,要么如果有多个定义,则会向您提供一个定义列表,供您选择。

        8
  •  8
  •   raimue    15 年前

    我使用最多的命令是C-]跳转到光标下函数的定义。您可以更频繁地使用它来跟踪更多的呼叫。在那之后,C-O会把你带回到一个水平,C-I会再深入一步。

        9
  •  6
  •   Walter    15 年前

    我找到了 taglist 必须具备的插件。它在一个单独的窗口中列出它知道的所有标记(您打开的文件),使导航较大的文件变得非常容易。

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

        10
  •  5
  •   Community skywinder    7 年前

    我已经将标签操作封装在 experimental plugin 我的。

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

        11
  •  5
  •   Jens    11 年前

    我已经调整了我的VIM插件两年来支持足够大的C++项目。你可以看看它们。

    他们使用ctags和cssope。

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

        12
  •  4
  •   alanwj    15 年前

    我将以下内容放入.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 -
    
        13
  •  2
  •   Zhenyu Li    14 年前

    我在MacOS中使用VIM,而原来的CTags不能很好地工作,所以我下载最新的并配置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 <M-j> <C-]>
    map <M-k> <C-T>
    
        14
  •  1
  •   dergachev    13 年前

    我修改了上面的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()
    
        15
  •  1
  •   saoret.one    13 年前

    上面的setcscope()函数的另一个迭代。设置cscope pre-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
    
    推荐文章