Dlaczego warto korzystać z augroup?

31

Rozumiem, jak działają automatyczne polecenia i jak ich używać, ale jestem trochę pewien, do czego służy grupa. Przeczytał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.

To tak naprawdę nie wyjaśnia, dlaczego są one przydatne, ani dlaczego chciałbym kiedykolwiek nadać nazwę grupie poleceń automatycznych, po prostu definiując kilka poleceń automatycznych obok siebie.

Na przykład, jeśli automatyczne polecenia fooi barsą powiązane, dlaczego miałbym to zrobić

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

kiedy mogłem po prostu zrobić

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

Chyba, że ​​nie rozumiem, po co właściwie są grupy. Dlaczego są więc przydatne?

DJMcMayhem
źródło

Odpowiedzi:

30

Głównym powodem użycia augroups jest umożliwienie większej kontroli nad zakresami komend automatycznych, np. Usunięcie kilku komend automatycznych za jednym razem. Częstym wzorcem jest używanie au!jako pierwszej części grupy. To usuwa wszystkie istniejące polecenia automatyczne w grupie i pozwala rozpocząć od nowa. Jeśli nie użyjesz grupy, au!usuniesz wszystkie / wiele poleceń automatycznych, których nie chcesz usuwać.

Usuwanie poleceń automatycznych jest w rzeczywistości dość powszechne, na przykład we wtyczkach, ponieważ pozwala to na wielokrotne pobieranie wtyczki / ftplugin. Jeśli nie usunąłeś komend automatycznych, to za każdym razem, gdy pozyskiwałeś wtyczkę / ftplugin, dodawałeś nową kopię tej samej komendy automatycznej. Dotyczy to również twojego vimrcpliku. Korzystając z grupy w pliku vimrc, można bezpiecznie ją ponownie załadować.

Aby uzyskać więcej informacji, zobacz :h 40.3.

Karl Yngve Lervåg
źródło
19

Grupy poleceń automatycznych umożliwiają organizowanie poleceń automatycznych, co samo w sobie jest dość przydatną funkcją.

Powiedz, że piszesz wtyczkę. Grupowanie poleceń automatycznych wtyczki we własnej przestrzeni nazw ma sens, choćby dlatego, że pozwala na włączanie / wyłączanie poleceń automatycznych do woli.

Twoje vimrcnie różni się zasadniczo od plugin/foo.vimtak, więc wszystko, co zyskujesz z grupami komend automatycznych, to zasadniczo większa kontrola nad konfiguracją.

W praktyce…

Jeśli nie przypiszesz ich do grupy, polecenia automatyczne są domyślnie „instalowane” w grupie globalnej. Instalowanie powiązanych poleceń automatycznych w ich własnej grupie nie tylko sprawia, że ​​wszystko jest bardziej przejrzyste, ale także pozwala bardzo łatwo zapobiec przerażającemu efektowi „nakładania” !:

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

Po lewej stronie cała grupa jest odinstalowywana jednocześnie, zanim każda komenda automatyczna tej grupy zostanie poprawnie zainstalowana. Schludny.

Po prawej stronie Vim bezużytecznie uruchomi tę samą procedurę „odinstaluj / zainstaluj” dla każdej komendy automatycznej. Brudny.

Ale nie musisz za każdym razem pisać całego bloku, jeśli nie chcesz. Polecenia automatyczne można przypisać bezpośrednio do grupy, dzięki czemu można gdzieś zdefiniować grupę:

augroup spam
    autocmd!
augroup END

i umieść swoje komendy automatyczne w dowolnym miejscu, nawet w innym skrypcie:

autocmd spam Foo * foo
autocmd spam Bar * bar

To dałoby ci:

  • przestrzeń nazw
  • zapobieganie gromadzeniu się
  • zamówienie
  • elastyczność
romainl
źródło
15

Oprócz innych odpowiedzi uważam, że najbardziej bezpośrednią praktyczną korzyścią jest to, że ułatwia ponowne ładowanie plików vimscript.

Na przykład włóż to do swojego vimrc:

autocmd BufCreate * echom "New buffer!"

Wyjdź, uruchom ponownie, utwórz nowy bufor. widzisz New buffer!, co możesz zweryfikować :messages.

Teraz ponownie załaduj vimrc: :source $MYVIMRCi ponownie utwórz nowy bufor.

Co teraz widzisz


Czy zamiast tego użyłem tego:

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

Wtedy byłbym w porządku. Tworzę grupę automatycznych autocmd!poleceń , polecenie wyczyść wszystkie zdefiniowane automatyczne polecenia w tej grupie . Jest to ważne, ponieważ:

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

Po prostu dodałbym to do tej samej grupy.


Innymi słowy, to ten sam powód, dla którego wszyscy piszemy fun!i command!zamiast wersji bez tych !, które nie pozwalają na zastąpienie.

Martin Tournoij
źródło
Bardzo pomocne jest podkreślenie jego „semantycznego” znaczenia !:)
llinfeng