| ч13. Локальные буферы и сопоставления | Содержание | ч15. Локальные буферы и сокращения{iabbrev}|
Теперь мы рассмотрим тему, такую же важную, как сопоставления: автокоманды.
Автокоманды - это способ дать определенные команды Vim при возникновении нужных нам событий. Давайте сразу перейдем к примеру.
Откройте новый файл с помощью [ :edit foo ] и сразу же закройте его [:quit]. Посмотрите, на диске файла нет. Это потому, что Vim не создает файл, пока вы не сохраните его.
Давайте изменим поведение Vim так, чтобы он создавал файлы сразу после их открытия. Выполним следующую команду:
:autocmd BufNewFile * :write
Давайте протестируем это. [ :edit foo ] [:quit] и убедимся что сейчас файл был создан.
Что бы удалить автокоманду нам нужно закрыть Vim. Как этого избежать?
Об этом мы поговорим следующей части.
Структура автокоманд
Давайте подробнее рассмотрим автокоманду, которую мы только что создали:
:autocmd ( 1 ) BufNewFile ( 2 ) * ( 3 ) :write
( 1 ) Это событие которые мы ожидаем ( BufNewFile )
( 2 ) Мы фильтруем события нашим "Шаблоном" ( * )
( 3 ) Запускаемая нами команда ( :write )
( 1 ) Первая часть команды - это тип события, за которым мы хотим следить. Vim предлагает множество событий для просмотра. Некоторые из них включают в себя:
- Начало редактирование файла, который еще не существует.
- Чтение файла, независимо от того, существует он или нет.
- Изменение настроек буфера.
- Переход в режим вставки.
- Выход из режима вставки. и т.д
Это всего лишь небольшая выборка доступных событий. В реальности их там за сотню. Выдержку из хелпа можно глянуть тут
( 2 ) Следующая часть команды - это "шаблон", который позволяет вам более точно определить, когда вы хотите запустить команду. Запустите новый экземпляр Vim и выполните следующую команду:
:autocmd BufNewFile *.txt :write
Это почти то же самое, что и предыдущая команда, но на этот раз она будет применяться только к файлам, имена которых заканчиваются на [.txt].
Протестируйте это выполнив [ :edit bar ][ :quit ], а затем [:edit bar.txt][:quit]. Вы увидите, что Vim записывает [ bar.txt ] автоматически, но не записывает [bar], потому что он не соответствует шаблону.
( 3 ) Заключительная часть команды - это команда, которую мы хотим запустить при наступлении события. Тут вроде все должно быть понятно. Но есть одна загвоздка: вы не можете использовать специальные символы, такие как <cr>в команде. О том, как обойти это ограничение, мы поговорим позже, а пока вам просто придется с этим смириться.
Другой пример
Давайте определим другую автокоманду, но на этот раз с используем другое событие. Выполните следующую команду:
:autocmd BufWritePre *.html :normal gg=G
Мы немного забегаем вперед, потому что мы собираемся поговорить об [normal] позже, но сейчас вам нужно потерпеть меня, потому что на этом этапе сложно придумать полезные примеры.
Создайте новый файл с именем [ foo.html ]. Отредактируйте его с помощью Vim и введите следующий текст, хаотично расставляя пробелы перед словами. На этой площадке пробелы все убираются, поэтому все выглядит не так как хотелось бы.
<html>
<body>
<p>Hello!</p>
</body>
</html>
Теперь сохраните этот файл с помощью < :w > . Что произошло? Vim, похоже, отформатировал файл под html стандарт, прежде чем сохранить его!
На данный момент я хочу, чтобы вы поверили мне, что запуск [ :normal gg=G] скажет Vim отформатировать текущий файл. Пока не беспокойтесь о том, как это работает.
На что мы действительно хотим обратить внимание, так это на автокоманду. Тип события - это BufWritePre, это означает, что событие будет проверяться непосредственно перед записью любого файла.
Мы использовали шаблон [ *.html ] , чтобы гарантировать, что эта команда будет запускаться только тогда, когда мы работаем с файлами, которые заканчиваются на [ .html ]. Это позволяет нам более точно использовать автокоманды, они является очень мощными инструментами, которые мы продолжим изучать позже.
Несколько событий
Вы можете создать одну автокоманду, привязанную к нескольким событиям, разделив события запятой. Выполните эту команду:
:autocmd BufWritePre,BufRead *.html :normal gg=G
Это почти тоже что и наша последняя команда, за исключением того, что она также будет форматировать код всякий раз, когда мы читаем HTML-файл, или когда мы его записываем. Это может быть полезно, если у вас криворукие коллеги, которые не могут настроить отступ в своем HTML файле.
Распространенной практикой в Vim-сценариях является объединение событий BufRead и BufNewFile для запуска команды всякий раз, когда вы открываете файл определенного типа, независимо от того, существует ли он или нет. Выполните следующую команду:
:autocmd BufNewFile,BufRead *.html setlocal nowrap
Это отключает перенос строк всякий раз, когда вы работаете с HTML-файлом.
События типов файлов
Одним из самых полезных событий является FileType . Это событие запускается всякий раз, когда Vim устанавливает значение буфера filetype. (что бы посмотреть его значение: [ :set filetype? ])
Давайте настроим несколько полезных сопоставлений для различных типов файлов. Выполните следующие команды:
:autocmd FileType cpp,javascript nnoremap <buffer> <localleader>c I//<esc>
:autocmd FileType python nnoremap <buffer> <localleader>c I#<esc>
Откройте файл Javascript или С++ (файлы, которые заканчивается на .js или .cpp или .h или .hpp), выберите строку и введите [ <localleader>c ]. Это закомментирует строку в стиле C++ .
Теперь откройте файл Python (файл, который заканчивается на .py), выберите строку и введите [ <localleader>c ]. Это закомментирует строку, но будет использовать стиль комментарий Python!
Используя автокоманды вместе с локальными сопоставлениями буфера, о которых мы узнали в ранее, мы можем создавать сопоставления, специфичные для типа файла, который мы редактируем.
Это уменьшает нагрузку на нашу память, когда мы программируем. Вместо того, чтобы думать о переходе к началу строки и добавлении символа комментария, мы можем просто подумать "Закомментировать эту строку".
Упражнения
Прочти :help autocmd-events список всех событий, к которые вы можете привязать к автокомандам. Вам не нужно запоминать каждый из них прямо сейчас. Просто попытайтесь понять, какие возможности у вас есть.
Создайте несколько FileType автокоманд, которые используют setlocal для настройки параметров для ваших файлов. Возможно вы захотите настроить параметры для каждого типа файла, (wrap, list, spell, и number.)
Создайте еще несколько автокоманд "прокомментировать эту строку" для типов файлов, с которыми вы часто работаете.
Добавьте все эти автокоманды в свой ~/.vimrc файл. Конечно, используйте свои сопоставления для быстрого перехода к ~/.vimrc
| ч13. Локальные буферы и сопоставления | Содержание | ч15. Локальные буферы и сокращения {iabbrev}|