我一直在使用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
答案 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}}。