Добавить в корзинуПозвонить
Найти в Дзене
Vim

VimScript 16 [группы автокоманд {autocmd}]

| ч15. Локальные буферы и сокращения{iabbrev} | Содержание | ч17. Сопоставление, оператор ожидания | Ранее мы уже изучали автокоманды, давайте вспомнит что то из этого. :autocmd BufWrite * :echom "Буфер записан!" Теперь сохраните текущий буфер с помощью :write и запустите :messages для просмотра журнала сообщений. В списке сообщений вы должны увидеть "Буфер записан!" Теперь снова сохраните текущий буфер и запустите :messages для просмотра журнала сообщений. Теперь вы должны увидеть в списке сообщений "Буфер записан!" дважды. Выполните ещё раз ту же команду: :autocmd BufWrite * :echom "Буфер записан!" Сохраните текущий буфер еще раз и запустите :messages. Вы увидите в списке сообщений что "Буфер записан!" написан четыре раза. Что же произошло? Когда мы создаем автокоманду, Vim не знает хотим ли мы заменить предыдущую или просто ее дополнить. Поэтому в нашем случаи Vim создал две отдельные автокоманды, каждая из которых выполняет одно и тоже действие. Проблема Теперь когда мы знаем что
Оглавление

| ч15. Локальные буферы и сокращения{iabbrev} | Содержание | ч17. Сопоставление, оператор ожидания |

Ранее мы уже изучали автокоманды, давайте вспомнит что то из этого.

:autocmd BufWrite * :echom "Буфер записан!"

Теперь сохраните текущий буфер с помощью :write и запустите :messages для просмотра журнала сообщений. В списке сообщений вы должны увидеть "Буфер записан!"

Теперь снова сохраните текущий буфер и запустите :messages для просмотра журнала сообщений. Теперь вы должны увидеть в списке сообщений "Буфер записан!" дважды.

Выполните ещё раз ту же команду:

:autocmd BufWrite * :echom "Буфер записан!"

Сохраните текущий буфер еще раз и запустите :messages. Вы увидите в списке сообщений что "Буфер записан!" написан четыре раза. Что же произошло?

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

Проблема

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

Но! Проблема в том что source ~/.vimrc перечитывает весь файл, включая автокоманды которые вы определили. Это означает, что каждый раз когда Vim выполняет source ~/.vimrc вы будете дублировать автокоманды, что приведет к замедлению работы Vim, поскольку он выполняет одни и те же команды снова и снова.

Для моделирования этой ситуации, выполните следующую команду:

:autocmd BufWrite * :sleep 200m

Сохраните текущий буфер. Вы можете заметить, а может и нет небольшую задержку во время записи. Теперь выполните эту же команду еще трижды

:autocmd BufWrite * :sleep 200m

:autocmd BufWrite * :sleep 200m

:autocmd BufWrite * :sleep 200m

Сохраните файл ещё раз, на этот раз задержка должна быть более очевидно.

Конечно у вас не будет автокоманд со sleep, но ~/.vimrc у опытного пользователя vim может состоять из тысяч строк часть из которых могут содержать autocmd. А объединение автокоманд, с автокомандами определенными в плагинах, могут значительно повлиять на производительность системы.

Группирование автокоманд

К счастью у Vim есть решение этой проблемы. И первый шаг к этому - создание именованной группы.

Откройте заново Vim, что бы удалить предыдущие автокоманды, затем выполните следующее:

:augroup testgroup
: autocmd BufWrite * :echom "Foo"
: autocmd BufWrite * :echom "Bar"
:augroup END

Сохраните буфер и проверьте :messages. Вы должны увидеть оба Foo и Bar. Теперь выполните следующие команды:

:augroup testgroup
: autocmd BufWrite * :echom "Baz"
:augroup END

Попробуйте догадаться что произойдет, когда вы снова запишете буфер. Как только ответите на этот вопрос, проверьте себя :messages, правы вы или нет.

Очистка групп

Что происходит когда вы сохраняете файл? Это было то, что вы ожидали?

Если вы думали, что Vim заменит группу, тот как вы уже могли убедиться это нет так. augroup при многократном использовании Vim, будет каждый раз объединять группы.

Если вы хотите очистить группу и затем заменить ее новым содержимым, то необходимо использовать для этого команду autocmd!

:augroup testgroup
: autocmd!
: autocmd BufWrite * :echom "Cats"
:augroup END

Теперь попробуйте сохранить свой файл и проверить :messages. На этот раз Vim вывел только одно сообщение "Cats".

Использование автокоманд в вашем Vimrc

Теперь, когда мы знаем, как группировать автокоманды и очищать эти группы, мы можем использовать это для добавления автокоманд в ~/.vimrc, которые не создают дубликат каждый раз, когда мы его запускаем.

Добавьте в свой ~/.vimrc файл следующее:

augroup filetype_html
autocmd!
autocmd FileType html nnoremap <buffer> <localleader>f Vatzf
augroup END

Мы вошли в группу filetype_html, первым делом очищаем ее, определяем автокоманду и покидаем группу. Если мы снова запустим source ~/.vimrc, предварительная очистка autocmd! запретит Vim добавление повторяющихся автокоманд.

Упражнения

Просмотрите в своём ~/.vimrc файле автокоманды и объедините их все в группы, подобные той что мы рассмотрели. Вы можете поместить несколько автокоманд в одну группу, если это имеет смысл для вас.

Попытайтесь выяснить, что делает сопоставление в последнем примере.

Прочти :help autocmd-groups.

| ч15. Локальные буферы и сокращения{iabbrev} | Содержание | ч17. Сопоставление, оператор ожидания |