Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在vim中自动更新标记文件? 我使用VIM C++标签文件进行导航,使用CTRL-]。问题是,每当某个文件被修改时,链接就不再有效,我必须重新运行CTAG并更新标记文件。我们的代码库很大,生成标记文件需要相当长的时间_Vim_Ctags - Fatal编程技术网

如何在vim中自动更新标记文件? 我使用VIM C++标签文件进行导航,使用CTRL-]。问题是,每当某个文件被修改时,链接就不再有效,我必须重新运行CTAG并更新标记文件。我们的代码库很大,生成标记文件需要相当长的时间

如何在vim中自动更新标记文件? 我使用VIM C++标签文件进行导航,使用CTRL-]。问题是,每当某个文件被修改时,链接就不再有效,我必须重新运行CTAG并更新标记文件。我们的代码库很大,生成标记文件需要相当长的时间,vim,ctags,Vim,Ctags,是否有任何工具可以在后台定期更新标记文件?我可以将VIM配置为执行相同的操作吗 我在Windows下使用gvim。一个想法: 每次使用BufWritePost事件保存缓冲区时,使用Vim自动命令(:help autocommand)触发脚本的运行 该脚本启动ctags生成,并包含一些附加的小逻辑,在它已经运行时不运行(或者最多每10分钟运行一次,等等) 编辑: 类似的问题在这里被预先询问过,请参见关于Blixtor的回答,您需要仔细考虑一下脚本的设计。我建议对设计进行隔离,以便autocomma

是否有任何工具可以在后台定期更新标记文件?我可以将VIM配置为执行相同的操作吗

我在Windows下使用gvim。

一个想法:

每次使用BufWritePost事件保存缓冲区时,使用Vim自动命令(:help autocommand)触发脚本的运行

该脚本启动ctags生成,并包含一些附加的小逻辑,在它已经运行时不运行(或者最多每10分钟运行一次,等等)

编辑:


类似的问题在这里被预先询问过,请参见

关于Blixtor的回答,您需要仔细考虑一下脚本的设计。我建议对设计进行隔离,以便autocommand使用Windows“start”命令或类似命令在后台运行外部脚本:从而防止Vim在生成标记文件时没有响应


然后,该脚本可以使用不同的文件名(即不是“标记”)生成标记文件:
ctags-R-o newtags.
),当ctags完成时,删除
tags
,并将
newtags
重命名为
tags
。这将防止标记文件在生成完成时在Vim中不可用。

此逻辑适用于大多数情况:在Vim中打开新文件时,更改到该文件的目录,并在其中生成标记文件(如果该文件不存在)。保存更改的缓冲区时,在要保存的文件目录中生成标记文件:


我编写插件就是为了做到这一点。通过扫描整个项目(例如使用命令
:UpdateTags**/*.[hc]
),我初始化了一次标记文件,之后插件将在我编辑和
:更新我在Vim中的源代码文件时自动更新标记文件。虽然它会更新标记文件,但它会阻止Vim,但因为它只扫描当前文件,所以不会花费很长时间


更新(2014-07-30):仍在使用vim easytags插件:-)。现在,它支持异步模式以避免阻塞Vim。在我写这篇文章的时候,异步模式还不是默认模式,但是在更多的反馈之后,我可能会切换默认模式。

我已经编写了一个插件来完成CTAG的所有艰苦工作:

它为整个项目提供无痛的自动标记生成,并使标记保持最新。标签是在后台生成的,因此您不必等待CTAG生成标签。您可以单独使用它,也可以将其作为其他插件的附加组件使用

第一种方法是,您可以在
~/.indexer\u文件中声明项目,如下所示:

[CoolProject]

/home/user/cool_project

[AnotherProject]
option:ctags_params = "--languages=c++"

/home/user/another_project/src
/home/user/another_project/lib 
然后,当您打开
/home/user/cool\u project
中的任何文件时,所有项目都将由CTAG索引。从另一个项目打开标记时,也会为其生成标记。来自不同项目的标记从不混合。当您从project保存文件时,标记会自动更新。你不必在意它,它只是起作用

有关详细信息,请参阅文章:,该文章详细解释了Indexer+Vimprj的用法

已在Vim 7.3的以下系统上成功测试:

  • Archlinux

  • Ubuntu 10.4

  • 视窗XP

  • MacOSX狮子


从它的存储库:
vim gutentags
是一个插件,负责管理vim中急需的标记文件。它将(重新)生成标签文件,而你的工作,而完全远离你的方式。它甚至会尽最大努力让那些标签文件远离你。它没有依赖性,只起作用


你可以试试。

@AI,有没有类似的Linux解决方案?!对于Linux,我想您可以运行命令&将其推送到后台,不是吗?事实上,标记列表插件已经具备了在文件更改时自动更新其标记列表的功能。我唯一找不到的是该插件如何与普通标签集成,以便^]使用该列表。也许有这样的解决方案(我对此很感兴趣)。我的两分钱:)嗯,编辑来自未来。(当我在这里时…)这与@FDinoff:AutoTag相比如何?@FDinoff:AutoTag似乎简单得多,所以一个区别因素是完整性/可配置性/复杂性。另一个区别是vim easytags可以更新和突出显示标记,而AutoTag似乎只关注更新部分。此外,AutoTag需要Python,而vim easytags可以在没有Python的情况下工作。“此插件自动创建一个全局标记文件,并在您在vim中编辑文件时使其保持最新。”如何为不同的项目保留单独的标记,而不是单个全局标记@xolox@xterm:支持特定于项目的标记文件,请检查主页/自述。@xolox是否可以同步执行项目的第一次扫描,然后执行异步更新?谢谢你的插件!您可能希望改用:call system(),这样它将是可移植的,您可以通过'let l:lines=system(“cmdline”)'获得任何输出,并且返回代码在v:shell\u error中返回。
[CoolProject]

/home/user/cool_project

[AnotherProject]
option:ctags_params = "--languages=c++"

/home/user/another_project/src
/home/user/another_project/lib 
function! DelTagOfFile(file)
  let fullpath = a:file
  let cwd = getcwd()
  let tagfilename = cwd . "/tags"
  let f = substitute(fullpath, cwd . "/", "", "")
  let f = escape(f, './')
  let cmd = 'sed -i "/' . f . '/d" "' . tagfilename . '"'
  let resp = system(cmd)
endfunction

function! UpdateTags()
  let f = expand("%:p")
  let cwd = getcwd()
  let tagfilename = cwd . "/tags"
  let cmd = 'ctags -a -f ' . tagfilename . ' --c++-kinds=+p --fields=+iaS --extra=+q ' . '"' . f . '"'
  call DelTagOfFile(f)
  let resp = system(cmd)
endfunction
autocmd BufWritePost *.cpp,*.h,*.c call UpdateTags()