每当我在 vim 中更改源文件时,如何自动运行 vim 脚本?



我写了一个(perl(脚本,它从标签文件(由ctags生成(生成语法高亮vim脚本(tags.vim(。但是,当我打开文件时,我必须手动加载它。我可以通过使用正确的命令行启动 vim 来解决这个问题,但是每次切换源文件(例如按 ^] 跳转到另一个文件中的定义(进入 vim 后,语法突出显示就会丢失,我需要重新获取我生成的 tags.vim。

有没有办法在当前源文件更改时自动执行命令(:so tags.vim(或获取脚本等(按:n,:N,^]或:tnext等(?

这就是自动命令的用途,请参阅:h autocommand

在这种情况下,您可能希望 BufEnter 自动命令,每当 vim 转到不同的文件(:h BufEnter(时触发。大概是这样的:

augroup UpdatePerlSyntax  " :h autocmd-group
autocmd!  " Clear autocommands for this group - prevents defining the same
" autocommand multiple times
autocmd BufEnter * source /path/to/tags.vim  " Or whatever action you want
"       |        | |
"       |        | +- Command to execute
"       |        +- Pattern (:h autocmd-patterns), * matches everything
"       +- :h autocmd-events
augroup END

除了BufEnter之外,还有FileType自动命令,它可能更适合您需要更好的(:h filetype(。

要在自动命令中使用当前文件的名称,请查看:h <afile>


另一个(可能更优雅(解决方案是为您关注的文件类型编写一个语法文件,该文件使用生成的语法(:h mysyntaxfile)

在 lh 标签中,我在自动命令上更新标签数据库BufWritePostFileWritePost.在途中,我更新了当前缓冲区的语法突出显示。

我还应该做的(但完全忘记了(是更新已打开的缓冲区中的突出显示。但请注意,此突出显示更新不应每次我们输入缓冲区时完成(:h BufEnter(,而只有在尚未完成的情况下。IOW,如果您获取文件,则需要检查其时间戳(:h getftime()

(事实上,我在更新 ctags 数据库时进行了语法更新。较慢的部分不是获取所有标签,而是实际调用syn keyword(这是最快的(,100,000 次(在真实项目中(。

最新更新