Por que devo usar o augroup?

31

Entendo como os comandos automáticos funcionam e como usá-los, mas tenho um pouco de certeza de que serve o augroup. Eu li em: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.

Isso realmente não explica por que eles são úteis ou por que eu desejaria criar um nome de grupo de comando automático apenas definindo um monte de comandos automáticos próximos um do outro.

Por exemplo, se os comandos automáticos fooe barestão relacionados, por que eu gostaria de fazer

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

quando eu poderia fazer

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

A menos que eu esteja entendendo mal para que servem os augroups. Então, por que eles são úteis?

DJMcMayhem
fonte

Respostas:

30

A principal razão para usar augroups é permitir maior controle sobre os intervalos de comandos automáticos, por exemplo, para excluir vários comandos automáticos de uma só vez. Um padrão comum é usar o au!como a primeira parte de um grupo. Isso remove todos os comandos automáticos existentes no grupo e permite iniciar novamente. Se você não usou um grupo, au!removeria todos / muitos comandos automáticos que não desejava remover.

A exclusão de comandos automáticos é realmente bastante comum, por exemplo, em plug-ins, porque isso permite que você obtenha um plug-in / ftplugin várias vezes. Se você não excluiu os comandos automáticos, toda vez que você originou o plug-in / ftplugin, adicionava uma nova cópia do mesmo comando automático. Isso também se aplica ao seu vimrcarquivo. Ao usar um grupo no seu arquivo vimrc, torna-se seguro recarregá-lo.

Para mais informações, consulte :h 40.3.

Karl Yngve Lervåg
fonte
19

Os grupos de comando automático oferecem a oportunidade de organizar seus comandos automáticos, o que é um recurso bastante útil por si só.

Digamos que você esteja escrevendo um plugin. Agrupar os comandos automáticos do seu plug-in em seu próprio espaço para nome faz sentido, apenas porque permite ativar / desativar os comandos automáticos à vontade.

Você vimrcnão é fundamentalmente diferente de plugin/foo.vimtudo, portanto, tudo o que você obtém com grupos de comando automático é basicamente mais controle sobre sua configuração.

Na prática…

Se você não os atribuir a um grupo, os comandos automáticos serão "instalados" no grupo global por padrão. A instalação de comandos automáticos relacionados em seu próprio grupo não apenas torna as coisas mais claras, mas permite evitar o temido efeito de "acumulação" com muita facilidade e com um único !:

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

À esquerda, o grupo inteiro é desinstalado de uma só vez, antes de cada comando automático desse grupo ser instalado corretamente. Arrumado.

À direita, o Vim executará com desperdício a mesma rotina de "desinstalação / instalação" para cada comando automático. Sujo.

Mas você não precisa escrever esse bloco todo o tempo todo, se não quiser. Os comandos automáticos podem ser atribuídos diretamente a um grupo para que você possa definir um grupo em algum lugar:

augroup spam
    autocmd!
augroup END

e coloque seus comandos automáticos onde quiser, mesmo em outro script:

autocmd spam Foo * foo
autocmd spam Bar * bar

Isso lhe daria:

  • namespacing
  • prevenção de acumulação
  • ordem
  • flexibilidade
romainl
fonte
15

Além das outras respostas, acho que o benefício prático mais imediato é que facilita o recarregamento de arquivos vimscript.

Por exemplo, coloque isso no seu vimrc:

autocmd BufCreate * echom "New buffer!"

Saia, reinicie, faça um novo buffer. você vê New buffer!, com o qual você pode verificar :messages.

Agora recarregue seu vimrc:, :source $MYVIMRCe faça novamente um novo buffer.

O que você vê agora?


Se eu tivesse usado isso:

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

Então eu estaria bem. Eu faço um grupo de autocmd!comandos automáticos, o comando limpa todos os comandos automáticos definidos nesse grupo . Isso é importante porque:

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

Basta adicioná- lo ao mesmo augroup.


Em outras palavras, é a mesma razão pela qual todos digitamos fun!e command!, em vez das versões sem a !que não permitem a substituição.

Martin Tournoij
fonte
É muito útil ressaltar o significado "semântico" de !:) #
1113 llinfeng