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