Perché dovrei usare augroup?


31

Capisco come funzionano i comandi automatici e come usarli, ma sono un po 'sicuro di cosa serve Augroup. Ho letto: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.

Questo non spiega davvero perché siano utili o perché vorrei mai creare un nome di gruppo per i comandi automatici semplicemente definendo un gruppo di comandi automatici uno accanto all'altro.

Ad esempio, se i autocomandi fooe barsono correlati, perché dovrei voler fare

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

quando potrei semplicemente fare

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

A meno che non fraintenda a cosa servano davvero gli augroups. Quindi perché sono utili?

Risposte:


30

Il motivo principale per usare augroups è quello di consentire un maggiore controllo sugli intervalli di autocomandi, ad esempio per eliminare un gruppo di autocomandi in una volta sola. Un modello comune è quello di utilizzare au!la prima parte di un gruppo. Ciò rimuove tutti i comandi automatici esistenti nel gruppo e consente di ricominciare da capo. Se non hai usato un gruppo, au!rimuoveresti tutti / molti i autocomandi che non volevi rimuovere.

L'eliminazione dei autocomandi è in realtà abbastanza comune, ad esempio nei plug-in, poiché ciò consente di creare più volte un plug-in / ftplugin. Se non hai cancellato i autocomandi, ogni volta che hai acquistato il plugin / ftplugin aggiungi una nuova copia dello stesso autocomando. Questo vale anche per il tuo vimrcfile. Usando un gruppo nel tuo file vimrc, diventa sicuro ricaricarlo.

Per maggiori informazioni, vedi :h 40.3.


19

I gruppi di autocomando ti offrono l'opportunità di organizzare i tuoi autocomandi, che è una caratteristica abbastanza utile di per sé.

Supponiamo che tu stia scrivendo un plugin. Raggruppare i autocomandi del tuo plugin nel tuo spazio dei nomi ha senso, se non altro perché ti consente di abilitare / disabilitare i tuoi autocomandi a piacimento.

Il tuo vimrcnon è fondamentalmente diverso da un plugin/foo.vimcosì, tutto ciò che ottieni con i gruppi di autocommand è sostanzialmente un maggiore controllo sulla tua configurazione.

In pratica…

Se non li si assegna a un gruppo, i autocomandi vengono "installati" nel gruppo globale per impostazione predefinita. L'installazione dei relativi autocomandi nel proprio gruppo non solo rende le cose più chiare, ma consente anche di prevenire l'effetto temuto di "accumulo" molto facilmente e con un unico !:

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

A sinistra, l'intero gruppo viene disinstallato in una sola volta, prima che ciascun comando automatico di quel gruppo sia installato correttamente. Neat.

A destra, Vim eseguirà inutilmente la stessa procedura di "disinstallazione / installazione" per ciascun comando automatico. Sporco.

Ma non devi scrivere l'intero blocco ogni volta se non vuoi. I comandi automatici possono essere assegnati direttamente a un gruppo in modo da poter definire un gruppo da qualche parte:

augroup spam
    autocmd!
augroup END

e metti i tuoi autocomandi dove vuoi, anche in un altro script:

autocmd spam Foo * foo
autocmd spam Bar * bar

Questo ti darebbe:

  • namespacing
  • prevenzione di accumulo
  • ordine
  • flessibilità

15

A parte le altre risposte, trovo che il vantaggio pratico più immediato sia che semplifica il ricaricamento dei file di vimscript.

Ad esempio, aggiungi questo nel tuo vimrc:

autocmd BufCreate * echom "New buffer!"

Esci, riavvia, crea un nuovo buffer. vedi New buffer!, con cui puoi verificare :messages.

Ora ricarica il tuo vimrc:, :source $MYVIMRCe crea nuovamente un nuovo buffer.

Cosa vedi adesso?


Se avessi usato questo invece:

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

Quindi sarei andato bene. Faccio un gruppo di autocmd!comandi automatici , il comando cancella tutti i comandi automatici definiti in quel gruppo . Questo è importante perché:

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

Lo aggiungerei semplicemente allo stesso augroup.


In altre parole, è lo stesso motivo per cui tutti digitiamo fun!e command!, piuttosto che le versioni senza quelle !che non consentono l'override.


È molto utile evidenziare il significato "semantico" di !:)
llinfeng,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.