Почему я должен использовать augroup?


31

Я понимаю, как работают автоматические команды и как их использовать, но я немного уверен в том, для чего нужна группа augroup. Я читаю в: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.

Это на самом деле не объясняет, почему они полезны, или почему я бы хотел создать имя группы автокоманд вместо простого определения набора автокоманд рядом друг с другом.

Например, если автокоманды fooи barсвязаны, зачем мне это делать?

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

когда я мог просто сделать

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

Если только я неправильно понимаю, для чего на самом деле нужны группы. Так почему они полезны?

Ответы:


30

Основная причина использования augroups состоит в том, чтобы обеспечить больший контроль над диапазонами автокоманд, например, для удаления нескольких автокоманд за один раз. Распространенным шаблоном является использование в au!качестве первой части группы. Это удаляет все существующие автокоманды в группе и позволяет начинать заново. Если вы не используете группу, то au!удалите все / многие автокоманды, которые вы не хотите удалять.

Удаление автокоманд на самом деле довольно распространено, например, в плагинах, потому что это позволяет многократно использовать плагин / ftplugin. Если вы не удалили автокоманды, то каждый раз, когда вы использовали плагин / ftplugin, вы добавляете новую копию той же автокоманды. Это также верно для вашего vimrcфайла. Используя группу в вашем файле vimrc, можно безопасно перезагрузить ее.

Для получения дополнительной информации см :h 40.3.


19

Группы автокоманд дают вам возможность организовать свои автокоманды, что само по себе является весьма полезной функцией.

Скажем, вы пишете плагин. Группировка автокоманд вашего плагина под вашим собственным пространством имен имеет смысл, хотя бы потому, что он позволяет вам включать / отключать ваши автокоманды по желанию.

Ваш vimrcпринципиально не отличается от plugin/foo.vimтак, все, что вы получаете с группами автокоманд, это в основном больший контроль над вашей настройкой.

На практике…

Если вы не назначаете их группе, автокоманды по умолчанию «устанавливаются» в глобальной группе. Установка связанных автокоманд в их собственную группу не только делает вещи более понятными, но и позволяет очень легко и просто избежать страшного эффекта «накопления» !:

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

Слева вся группа удаляется сразу, прежде чем каждая автокоманда этой группы будет правильно установлена. Ухоженная.

Справа Vim будет выполнять одну и ту же процедуру «удаления / установки» для каждой автокоманды. Грязные.

Но вам не нужно каждый раз писать весь этот блок, если вы этого не хотите. Автокоманды могут быть назначены непосредственно группе, чтобы вы могли определить группу где-нибудь:

augroup spam
    autocmd!
augroup END

и поместите ваши автокоманды, где вы хотите, даже в другой скрипт:

autocmd spam Foo * foo
autocmd spam Bar * bar

Это даст вам:

  • Пространства имен
  • предотвращение накопления
  • приказ
  • гибкость

15

Помимо других ответов, я считаю, что самое непосредственное практическое преимущество заключается в том, что он позволяет легко перезагружать файлы vimscript.

Например, вставьте это в ваш vimrc:

autocmd BufCreate * echom "New buffer!"

Выйти, перезагрузить, создать новый буфер. Вы видите New buffer!, что вы можете проверить с :messages.

Теперь перезагрузите ваш vimrc: :source $MYVIMRCи снова создайте новый буфер.

Что ты видишь сейчас?


Если бы я использовал это вместо:

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

Тогда я был бы в порядке. Я делаю группу автокоманд, autocmd!команда очищает все определенные автокоманды в этой группе . Это важно, потому что:

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

Просто добавил бы его в ту же группу.


Другими словами, это та же самая причина , почему мы все типа fun!и command!, а не версии без кнопки , !которые не позволяют переопределение.


Очень полезно подчеркнуть его «семантическое» значение !:)
llinfeng
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.