Warum sollte ich Augroup verwenden?

30

Ich verstehe, wie Autobefehle funktionieren und wie man sie benutzt, aber ich bin mir ein bisschen sicher, wofür Augroup ist. Ich lese in: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.

Dies erklärt nicht wirklich, warum sie nützlich sind oder warum ich jemals einen Gruppennamen für automatische Befehle festlegen möchte, indem ich nur eine Reihe von automatischen Befehlen nebeneinander definiere.

Zum Beispiel, wenn Autobefehle foound barverwandt sind, warum sollte ich tun wollen

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

wenn ich nur tun könnte

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

Es sei denn, ich verstehe falsch, wofür Augroups wirklich sind. Warum sind sie also nützlich?

DJMcMayhem
quelle

Antworten:

29

Der Hauptgrund für die Verwendung von augroups besteht darin, eine bessere Kontrolle über Bereiche von Autobefehlen zu ermöglichen, z. B. um eine Reihe von Autobefehlen auf einmal zu löschen. Ein übliches Muster besteht darin, den au!als ersten Teil einer Gruppe zu verwenden. Dadurch werden alle in der Gruppe vorhandenen Autobefehle entfernt, und es kann ein Neustart durchgeführt werden. Wenn Sie keine Gruppe verwenden, werden au!alle / viele Autobefehle entfernt, die Sie nicht entfernen möchten.

Das Löschen von Autocommands ist zum Beispiel in Plugins durchaus üblich, da man so ein Plugin / ftplugin mehrmals ausgeben kann. Wenn Sie die Autobefehle nicht gelöscht haben, fügen Sie jedes Mal, wenn Sie das Plugin / ftplugin bezogen haben, eine neue Kopie desselben Autobefehls hinzu. Dies gilt auch für Ihre vimrcDatei. Durch die Verwendung einer Gruppe in Ihrer vimrc-Datei wird das erneute Laden sicherer.

Weitere Informationen finden Sie unter :h 40.3.

Karl Yngve Lervåg
quelle
18

Autocommand-Gruppen geben Ihnen die Möglichkeit, Ihre Autocommands zu organisieren, was an und für sich eine sehr nützliche Funktion ist.

Angenommen, Sie schreiben ein Plugin. Es ist sinnvoll, die Autobefehle Ihres Plugins unter Ihrem eigenen Namespace zu gruppieren, schon allein deshalb, weil Sie damit Ihre Autobefehle nach Belieben aktivieren / deaktivieren können.

Ihr unterscheidet vimrcsich nicht grundlegend von einem plugin/foo.vimso, alles, was Sie mit Autocommand-Gruppen erhalten, ist im Grunde mehr Kontrolle über Ihr Setup.

In der Praxis…

Wenn Sie sie keiner Gruppe zuweisen, werden Autobefehle standardmäßig in der globalen Gruppe "installiert". Das Installieren verwandter Autobefehle in einer eigenen Gruppe macht die Dinge nicht nur klarer, sondern ermöglicht es Ihnen, den gefürchteten "Stapel" -Effekt sehr einfach und mit einem einzigen Befehl zu verhindern !:

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

Auf der linken Seite wird die gesamte Gruppe sofort deinstalliert, bevor jeder automatische Befehl dieser Gruppe ordnungsgemäß installiert wird. Ordentlich.

Auf der rechten Seite wird Vim verschwenderisch dieselbe "Deinstallations- / Installations" -Routine für jeden automatischen Befehl ausführen. Dreckig.

Aber Sie müssen nicht jedes Mal den ganzen Block schreiben, wenn Sie nicht wollen. Autocommands können direkt einer Gruppe zugewiesen werden , so dass Sie eine Gruppe irgendwo definieren können:

augroup spam
    autocmd!
augroup END

und platzieren Sie Ihre Autobefehle, wo Sie wollen, auch in einem anderen Skript:

autocmd spam Foo * foo
autocmd spam Bar * bar

Dies würde Ihnen geben:

  • Namensraum
  • Vermeidung von Anhäufungen
  • bestellen
  • Flexibilität
romainl
quelle
14

Abgesehen von den anderen Antworten stelle ich fest, dass der unmittelbarste praktische Vorteil darin besteht, dass es einfach ist, Vimscript-Dateien neu zu laden.

Zum Beispiel stecke dies in dein vimrc:

autocmd BufCreate * echom "New buffer!"

Beenden Sie, starten Sie neu, erstellen Sie einen neuen Puffer. Sie sehen New buffer!, was Sie mit überprüfen können :messages.

Laden Sie nun Ihr vimrc: neu :source $MYVIMRCund erstellen Sie erneut einen neuen Puffer.

Was siehst du jetzt


Hätte ich das stattdessen benutzt:

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

Dann wäre es mir gut gegangen. Ich mache eine Gruppe von Autobefehlen, der autocmd!Befehl löscht alle definierten Autobefehle in dieser Gruppe . Das ist wichtig, weil:

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

Würde nur hinzufügen , um es in die gleiche augroup.


Mit anderen Worten, es ist der gleiche Grund , warum wir alle Art fun!und command!, anstatt die Versionen ohne die !das Überschreiben nicht zulassen.

Martin Tournoij
quelle
Es ist sehr hilfreich, die "semantische" Bedeutung von !:)
hervorzuheben