Vim:如何组合使用autocmd?

6

我需要在vim中对两个autocmd事件执行逻辑与操作。基本上,在FileType为tex时,该命令必须在InsertLeave上运行。这似乎应该可以在.vimrc文件中实现:

autocmd FileType tex :autocmd InsertLeave :w

但它并没有起到作用。即使手册中指示应该这样做,嵌套选项似乎也没有帮助。
很容易进行逻辑或操作:
autocmd BufEnter,BufLeave ...

做逻辑与操作不应该太难。


您应该采纳ZyX的解决方案作为答案,因为它解决了Eevee的本地缓冲问题。 - Profpatsch
完成了,但我得相信你的话。我好像记得当地缓冲区的问题,但我已经好几年没写latex了,两年前转用emacs了。 - Paul Biggar
3个回答

9

我对@Eevee的回答有一个更正:要使自动命令只对一个缓冲区起作用,你应该使用以下方法:

augroup TexAutoWrite
    autocmd FileType tex :autocmd! TexAutoWrite InsertLeave <buffer> :update
augroup END

请参见`:h autocmd-buflocal`。

太棒了!现在我可以在切换到浏览器时重新渲染asciidoc文档。 - Profpatsch
1
哎呀。问题:每次切换到 tex 文件时,第二个自动命令都会被添加上所有次数。不久之后,Vim 开始在你离开插入模式后连续保存很多次。 - Profpatsch
哇,这么容易就能防止它吗?好的... - Profpatsch

4
您可以使用autocmd的pattern选项。
autocmd InsertLeave *.tex w

当文件扩展名与文件类型不匹配或不存在时,这种方法就无法正常工作。这通常发生在与备份/临时文件进行比较时,或者如果文件的类型取决于其位置,例如系统配置文件。 - Walf

4

InsertLeave仍需要一个参数。

这对我有效:

autocmd FileType tex :autocmd InsertLeave * :w

请注意,如果您稍后在同一缓冲区中编辑非tex文件,则此行为将保留。我不确定是否有一种简单的方法来删除它,除非编辑某种类型的文件。

冒号并不是必须的。例如:au FileType go au VimLeave * call system("killall gocode") - Meow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接