我使用Ctrl-]使用vim C++标记文件进行导航.问题是每当某个文件被修改,链接不再有效,我必须重新运行ctags并更新标记文件.我们的代码库很庞大,生成标记文件需要很长时间.
有没有工具在后台定期更新标签文件?我可以配置VIM来做同样的事情吗?
我在Windows下使用gvim.
继Blixtor的回答之后,你需要仔细考虑一下脚本的设计.我建议隔离设计,使自动命令使用Windows"启动"命令或类似命令在后台运行外部脚本:从而防止Vim在生成标记文件时无响应.
然后该脚本可以使用不同的文件名生成标记文件(即不是"标记" ctags -R -o newtags .
:),tags
并且当ctags完成时,删除并重命名newtags
为tags
.这将防止标记文件在生成完成时在Vim中不可用.
我写了vim-easytags插件来做到这一点.我通过扫描整个项目(:UpdateTags **/*.[hc]
例如使用命令)初始化我的标签文件一次,然后插件将在我编辑时自动更新标签文件,并:update
在Vim中自动更新源代码文件.虽然它更新了标签文件,但它会阻止Vim,但因为它只扫描当前文件所以它不需要很长时间.
更新(2014-07-30):仍在使用vim-easytags插件:-).现在它支持异步模式以避免阻塞Vim.在我写这个时,异步模式还不是默认模式,但经过一些反馈之后,我可能会切换默认模式.
我已经用ctags编写了一个插件来完成所有艰苦的工作:Indexer.
它为整个项目提供无痛自动标签生成,并使标签保持最新.标签是在后台生成的,因此,您不必等待ctags生成标签.您可以单独使用它,也可以作为另一个插件project.tar.gz的附加组件使用它.
在第一种方式中,您可以~/.indexer_files
像这样声明项目:
[CoolProject] /home/user/cool_project [AnotherProject] option:ctags_params = "--languages=c++" /home/user/another_project/src /home/user/another_project/lib
然后,当您打开任何文件时/home/user/cool_project
,所有这个项目都将被ctags索引.当您从另一个项目打开标签时,也会为其生成标签.来自不同项目的标签永远不会混合.从项目中保存文件时,标记会以静默方式更新.你不必关心它,它只是有效.
有关详细信息,请参阅文章:Vim:项目的方便代码导航,它完全解释了Indexer + Vimprj的用法.
它已在Vim 7.3上成功通过以下系统测试:
的Archlinux
Ubuntu 10.4
Windows XP
Mac OS X Lion
一个主意:
每次使用BufWritePost事件保存缓冲区时,使用Vim自动命令(:help autocommand)来触发脚本的运行.
此脚本启动ctags生成并包含一些额外的小逻辑,以便在它已经运行时运行(或者最多每10分钟运行一次等).
编辑:
事先在这里询问了类似的事情,请参阅Vim自动生成ctags