Чому я повинен використовувати augroup?


31

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