Pourquoi devrais-je utiliser augroup?

31

Je comprends comment les commandes automatiques fonctionnent et comment les utiliser, mais je suis un peu sûr de ce à quoi sert augroup. J'ai lu: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.

Cela n'explique pas vraiment pourquoi ils sont utiles, ou pourquoi je voudrais jamais créer un nom de groupe de commandes automatiques plutôt que de définir un groupe d'autocommandes côte à côte.

Par exemple, si les autocommandes fooet barsont liées, pourquoi voudrais-je faire

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

quand je pourrais juste faire

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

À moins que je ne comprenne mal à quoi servent vraiment les Augroups. Alors pourquoi sont-ils utiles?

DJMcMayhem
la source

Réponses:

30

La principale raison d'utiliser augroups est de permettre un meilleur contrôle sur les plages de commandes automatiques, par exemple pour supprimer un groupe de commandes automatiques en une seule fois. Un modèle courant consiste à utiliser le au!comme première partie d'un groupe. Cela supprime toutes les commandes automatiques existantes dans le groupe et permet de recommencer à zéro. Si vous n'avez pas utilisé de groupe, vous au!supprimeriez alors toutes / plusieurs commandes automatiques que vous ne vouliez pas supprimer.

La suppression des autocommandes est en fait assez courante, par exemple dans les plugins, car cela permet de source un plugin / ftplugin plusieurs fois. Si vous n'avez pas supprimé les autocommandes, chaque fois que vous vous procurez le plugin / ftplugin, vous ajoutez une nouvelle copie de la même autocommande. Cela vaut également pour votre vimrcfichier. En utilisant un groupe dans votre fichier vimrc, il devient sûr de le recharger.

Pour plus d'informations, voir :h 40.3.

Karl Yngve Lervåg
la source
19

Les groupes de commandes automatiques vous donnent la possibilité d'organiser vos commandes automatiques, ce qui est une fonctionnalité très utile en soi.

Supposons que vous écrivez un plugin. Grouper les autocommandes de votre plugin sous votre propre espace de noms est logique, ne serait-ce que parce qu'il vous permet d'activer / désactiver vos autocommandes à volonté.

Votre vimrcn'est pas fondamentalement différent d'un plugin/foo.vimdonc, tout ce que vous obtenez avec les groupes de commandes automatiques est fondamentalement plus de contrôle sur votre configuration.

En pratique…

Si vous ne les affectez pas à un groupe, les commandes automatiques sont "installées" dans le groupe global par défaut. L'installation des autocommandes associées dans leur propre groupe non seulement rend les choses plus claires, mais vous permet également d'éviter l'effet redouté de "pile-up" très facilement et avec un seul !:

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

À gauche, l'ensemble du groupe est désinstallé en une seule fois, avant que chaque autocommande de ce groupe soit correctement installée. Soigné.

À droite, Vim exécutera inutilement la même routine de «désinstallation / installation» pour chaque autocommande. Sale.

Mais vous n'avez pas besoin d'écrire tout ce bloc à chaque fois si vous ne le souhaitez pas. Les autocommandes peuvent être attribuées directement à un groupe afin que vous puissiez définir un groupe quelque part:

augroup spam
    autocmd!
augroup END

et placez vos autocommandes où vous voulez, même dans un autre script:

autocmd spam Foo * foo
autocmd spam Bar * bar

Cela vous donnerait:

  • espace de noms
  • prévention de l'empilement
  • ordre
  • souplesse
romainl
la source
15

Mis à part les autres réponses, je trouve que l'avantage pratique le plus immédiat est qu'il facilite le rechargement des fichiers vimscript.

Par exemple, collez ceci dans votre vimrc:

autocmd BufCreate * echom "New buffer!"

Quittez, redémarrez, créez un nouveau tampon. vous voyez New buffer!, que vous pouvez vérifier avec :messages.

Rechargez maintenant votre vimrc:, :source $MYVIMRCet faites à nouveau un nouveau tampon.

Que voyez-vous maintenant?


Si j'avais utilisé ceci à la place:

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

Alors j'aurais été bien. Je fais un groupe de autocmd!commandes automatiques, la commande efface toutes les commandes automatiques définies dans ce groupe . C'est important, car:

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

Je voudrais simplement l' ajouter au même augroup.


En d'autres termes, c'est la même raison pour laquelle nous tapons tous fun!et command!, plutôt que les versions sans le !qui ne permettent pas de remplacer.

Martin Tournoij
la source
Il est très utile de souligner la signification "sémantique" de !:)
llinfeng