谁能为我建议一个更好的ctags解决方案?

时间:2014-02-09 13:19:47

标签: vim ctags cscope

我一直在使用ctags和下面的vim脚本,并且做我自己的小项目没有问题。但是当我进入一些大项目时,在用c ++编写的游戏中,ctags和cscope的递归命令似乎比我想象的要慢得多。我实际上设法在后台运行它,但看起来我的笔记本电脑正忙着做标签。

我听说有一个解决方案,在每个子目录中,你创建一个标签,当你在一个特定的子目录中工作时,你可以查询根目录中的标签以获取其他子目录标签。这可能吗?如果有人能用这种方法给我具体的HOW-TOS,我将非常感激。

或者如果有更好的解决方案,我非常渴望了解它。

这是我的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

1 个答案:

答案 0 :(得分:1)

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

如果您不想离开vim,可以使用shellscript来调用带有所需参数的Ctags。 I.E.使用以下行在git项目的根目录中创建文件autotags.sh

#!/bin/bash

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


ctags -L cscope.files

不要忘记给它执行权限。获得shellcript后,您的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默认使用的名称。您应该阅读http://cscope.sourceforge.net/large_projects.html

然而,生成文件列表并不像您想要的那么快,并且代码需要一些调整来在不需要时跳过该步骤但通常这比使用ctags或{{的递归扫描更快1}}。