现在我有以下内容.vimrc
:
au BufWritePost *.c,*.cpp,*.h !ctags -R
这有一些问题:
它很慢 - 为自上次标记生成以来未更改的文件重新生成标记.
由于不可避免的"按Enter或键入命令继续",我必须在写入文件后再次按下输入按钮.
当你将这两个问题结合起来时,我最终推迟了额外的输入(在ctags -R
完成之前),然后看到恼人的错误信息,并且必须再次按回车键.
我知道这听起来不是什么大不了的事,但随着我在某一天所做的文件写入量的增加,它往往会变得非常烦人.必须有一个更好的方法来做到这一点!
au BufWritePost *.c,*.cpp,*.h silent! !ctags -R &
缺点是在完成之前你不会有一个有用的标签文件.只要您使用的是*nix系统,就可以在之前的ctags完成之前进行多次写入,但是您应该对其进行测试.在Windows系统上,它不会把它放在后台,它会抱怨文件被锁定,直到第一个ctags完成(这不应该导致vim出现问题,但你最终会得到一个稍微过时的标签文件).
请注意,您可以使用--append
tonylo建议的选项,但是您必须禁用tagbsearch
这可能意味着标记搜索需要更长时间,具体取决于标记文件的大小.
编辑:一个解决方案非常沿以下的线已经被张贴在AutoTag Vim脚本.但请注意,该脚本需要一个支持Python的vim.
我的解决方案改为使用awk,因此它应该可以在更多系统上运行.
au FileType {c,cpp} au BufWritePostsilent ! [ -e tags ] && \ ( awk -F'\t' '$2\!="%:gs/'/'\''/"{print}' tags ; ctags -f- '%:gs/'/'\''/' ) \ | sort -t$'\t' -k1,1 -o tags.new && mv tags.new tags
请注意,您只能在脚本中以这种方式编写它,否则它必须在一行上.
那里有很多事情:
当检测到文件为C或C++时,此自动命令会触发,并依次添加由BufWritePost
事件触发的缓冲区本地自动命令.
它使用%
占位符在执行时由缓冲区的文件名替换,以及:gs
用于shell引用文件名的修饰符(通过将任何嵌入的单引号转换为quote-escape-quote-quote).
这样它运行一个shell命令来检查tags
文件是否存在,在这种情况下,它的内容被打印,除了引用刚刚保存的文件的行,同时ctags
仅在刚刚保存的文件上调用,结果是sort
编辑并重新安装到位.
警告实现者:假设一切都在同一目录中,那也是缓冲区本地当前目录.我没有考虑过路径损坏.
我写了easytags.vim来做这件事:自动更新和突出显示标签.插件可以配置为仅更新正在编辑的文件或正在编辑的文件目录中的所有文件(递归).它可以使用全局标记文件,文件类型特定标记文件和项目特定标记文件.
我注意到这是一个旧线程,但是... 在支持inotify的环境中使用incron.只要目录中的文件发生更改,它就会始终启动命令.即
/home/me/Code/c/that_program IN_DELETE,IN_CLOSE_WRITE ctags --sort=yes *.c
而已.