为什么要使用augroup?


31

我了解自动命令的工作原理以及如何使用它们,但是我有点确定augroup的用途。我读了:help augroup

                                                    *:aug* *:augroup*
:aug[roup] {name}               Define the autocmd group name for the
                                following ":autocmd" commands.  The name "end"
                                or "END" selects the default group.
                                To avoid confusion, the name should be
                                different from existing {event} names, as this
                                most likely will not do what you intended.

这并不能真正解释它们为什么有用,或者为什么我只想在彼此之间定义一堆自动命令,而不是一个自动命令组名。

例如,如果foo与和自动命令bar相关,我为什么要这样做

augroup spam
  au!
  au foo * foo
  au bar * bar
augroup END

当我可以做的时候

"Autocommands for spam
au foo * foo
au bar * bar

除非我误会了互惠生的真正用途。那么为什么它们有用呢?

Answers:


30

使用augroups的主要原因是为了更好地控制自动命令的范围,例如一次性删除一堆自动命令。常见的模式是将au!用作组的第一部分。这将删除组中所有现有的自动命令,并允许重新启动。如果不使用组,au!则将删除所有不想删除的自动命令。

实际上,删除自动命令非常普遍,例如在插件中,因为这样可以使一个插件/ ftplugin多次获得源代码。如果您没有删除自动命令,那么每次您获取插件/ ftplugin的源代码时,您都将添加同一自动命令的新副本。您的vimrc文件也是如此。通过在vimrc文件中使用组,可以安全地重新加载它。

有关更多信息,请参见:h 40.3


19

自动命令组使您有机会组织自动命令,这本身就是一个非常有用的功能。

假设您正在编写插件。将插件的自动命令分组在您自己的名称空间下是有意义的,即使仅仅是因为它允许您随意启用/禁用自动命令。

您的vimrc操作与从根本上没有什么不同,plugin/foo.vim因此,使用自动命令组获得的所有操作基本上是对设置的更多控制。

在实践中…

如果不将它们分配给组,则默认情况下,自动命令会“安装”在全局组中。在他们自己的组中安装相关的自动命令不仅使事情变得更清楚,而且还使您可以很容易地通过一个命令来防止可怕的“堆积”效应!

augroup spam             versus    autocmd! Foo * foo
    autocmd!                       autocmd! Bar * bar
    autocmd Foo * foo
    autocmd Bar * bar
augroup END

在左侧,将在适当安装该组的每个自动命令之前立即卸载整个组。整齐。

在右侧,Vim会浪费地为每个自动命令运行相同的“卸载/安装”例程。脏。

但是,如果您不想这样做,则不必每次都写整个块。可以将自动命令直接分配给组,因此您可以在以下位置定义组:

augroup spam
    autocmd!
augroup END

并将自动命令放在所需的位置,甚至在另一个脚本中:

autocmd spam Foo * foo
autocmd spam Bar * bar

这将为您提供:

  • 命名空间
  • 防止堆积
  • 订购
  • 灵活性

15

除了其他答案,我发现最直接的实际好处是它使重新加载vimscript文件变得容易。

例如,将其粘贴在您的vimrc中:

autocmd BufCreate * echom "New buffer!"

退出,重新启动,创建一个新的缓冲区。您会看到New buffer!,可以使用进行验证:messages

现在重新加载vimrc:,:source $MYVIMRC然后再次创建一个新缓冲区。

您现在看到什么?


如果我改用这个:

augroup inform_new_buffer
    autocmd!
    autocmd BufCreate * echom "New buffer!"
augroup end

那我会没事的。我制作了一组自动命令,该autocmd!命令清除了该组中所有已定义的自动命令。这很重要,因为:

augroup inform_new_buffer
    autocmd BufCreate * echom "New buffer!"
augroup end

只需添加到相同的augroup。


换句话说,这是我们都输入fun!和的同一原因command!,而不是!没有覆盖的版本是不允许覆盖的。


突出他的“语义”含义非常有帮助!:)
llinfeng
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.