Vim 有谁能为我推荐一个更好的ctags解决方案吗?

Vim 有谁能为我推荐一个更好的ctags解决方案吗?,vim,ctags,cscope,Vim,Ctags,Cscope,我在下面的vim脚本中使用了ctags,并且在自己的小项目中没有遇到任何问题。但是当我进入一些大型项目,在C++编写的游戏中,CTAGS和CcScript的递归命令似乎比我想象的慢很多。实际上我现在已经在后台运行了,但我的笔记本电脑似乎正忙着做标记 我听说有一种解决方案,在每个子目录中,您制作一个标记,当您在一个特定的子目录中工作时,您可以参考根目录中的标记以获得其他子目录标记。这可能吗?如果有人能给我这个方法的具体操作方法,我将非常感激 或者,如果有更好的解决方案,我很想知道 下面是我的vim

我在下面的vim脚本中使用了ctags,并且在自己的小项目中没有遇到任何问题。但是当我进入一些大型项目,在C++编写的游戏中,CTAGS和CcScript的递归命令似乎比我想象的慢很多。实际上我现在已经在后台运行了,但我的笔记本电脑似乎正忙着做标记

我听说有一种解决方案,在每个子目录中,您制作一个标记,当您在一个特定的子目录中工作时,您可以参考根目录中的标记以获得其他子目录标记。这可能吗?如果有人能给我这个方法的具体操作方法,我将非常感激

或者,如果有更好的解决方案,我很想知道

下面是我的vim脚本代码

function! UpdateTags()
    let curdir = getcwd()
    let gitdir = finddir('.git', '.;/')

    if isdirectory(gitdir)
        let l:rootdir = fnamemodify(gitdir, ':h')
        execute 'silent cd ' . l:rootdir
        execute 'silent !ctags -R --c++-kinds=+p --fields=+iaS --extra=+q &'
        if has("cscope")
            execute 'silent !cscope -Rbkq &'
            execute 'silent cs reset'
        endif " has("cscope") 
        execute 'silent cd ' . curdir
    endif
endfunction

我发现使用
ctags-R
比使用像
ctags-L input
这样的文件的ctags要慢,所以我在当前包含3000个文件的java项目中所做的是让git给我文件路径,并在存档中收集它们(例如,javafiles.txt)然后在编辑器外执行
ctags-L javafiles.txt

如果不想离开vim,可以使用shell脚本调用带有所需参数的ctag。即,在git项目的根目录中创建文件
autotags.sh
,并使用以下行:

#!/bin/bash

set -e
git ls-files | sed "/\.cpp$/!d" >> cscope.files


ctags -L cscope.files
别忘了给它执行权限。拥有shellscript后,vimscript代码将如下所示:

function! UpdateTags()
    let curdir = getcwd()
    let gitdir = finddir('.git', '.;/')

    if isdirectory(gitdir)
        let l:rootdir = fnamemodify(gitdir, ':h')
        execute 'silent cd ' . l:rootdir
        execute 'silent !./autotags.sh &'
        if has("cscope")
            execute 'silent !cscope -bkq &'
            execute 'silent cs reset'
        endif " has("cscope") 
        execute 'silent cd ' . curdir
    endif
endfunction
文件名为cscope.files,因为它是cscope默认使用的名称。你应该读书


但是,生成文件列表的速度并没有您想要的那么快,代码需要一些调整才能在不需要时跳过该步骤,但一般来说,这比使用
ctags
cscope
递归扫描要快。一个可能的解决方案:您能告诉我们
标记
选项的值吗ctags主页上解释了您提到的多个标记文件的方法:-但我不确定您是否能更快地找到根标记文件的更新。@Romaill我使用set tags=。/tags,tags;看来我找不到更好的解决办法了。。。。