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

Vim和Ctags提示和技巧[关闭]

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

    我刚刚安装 Ctags

    编辑

    你如何增强你对大型和小型项目的编程经验?

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

    + -转到定义
    控制键 + T
    控制键 + W 控制键 + -在水平分割中打开定义

    在vimrc中添加这些行
    map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
    map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>

    控制键 + -在新选项卡中打开定义
    +

    控制键 + Left MouseClick -转到定义
    控制键 + Right MouseClick

        2
  •  177
  •   Conspicuous Compiler    13 年前

    我的.vimrc中总是有一行:

    set tags=./tags;/
    

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

        3
  •  45
  •   nimrodm    16 年前

    另一个有用的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
    

        4
  •  27
  •   strager    16 年前

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

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

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

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

        6
  •  16
  •   strager    16 年前

    " 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    15 年前

    同一名称的几个定义

    <C-w>g<C-]> 在拆分中打开定义,但也要这样做 :tjump 它要么转到定义,要么如果有几个定义,则向您提供一个可供选择的定义列表。

        8
  •  8
  •   raimue    16 年前

        9
  •  6
  •   Walter    16 年前

    我找到了 taglist

        10
  •  5
  •   Community CDub    8 年前

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

    there :我使用自己的套件和其他一些插件。

        12
  •  4
  •   alanwj    16 年前

    我将以下内容放入我的.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 install。

    "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    14 年前

    我修改了上面的SetTag()搜索函数(应该替换为等效的 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    14 年前

    上面的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
    
    推荐文章