我写了一个(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 标签中,我在自动命令上更新标签数据库BufWritePost
和FileWritePost
.在途中,我更新了当前缓冲区的语法突出显示。
我还应该做的(但完全忘记了(是更新已打开的缓冲区中的突出显示。但请注意,此突出显示更新不应每次我们输入缓冲区时完成(:h BufEnter
(,而只有在尚未完成的情况下。IOW,如果您获取文件,则需要检查其时间戳(:h getftime()
(事实上,我在更新 ctags 数据库时进行了语法更新。较慢的部分不是获取所有标签,而是实际调用syn keyword
(这是最快的(,100,000 次(在真实项目中(。