Vi/Vim: продвинутая работа с макросами, буферами и окнами
Продвинутые возможности vi и Vim для работы с несколькими файлами: метки, макросы, буферы, окна, вкладки, диапазоны команд и настройка редактора.
Содержание статьи
Когда базовых команд уже мало
После освоения режимов, операторов и движений Vim хорошо подходит для повседневного редактирования. Но при работе с несколькими файлами и повторяющимися действиями появляются новые задачи: нужно быстро переходить между местами, повторять последовательность команд, держать открытыми несколько конфигураций и настроить редактор под себя.
В этой статье разберём инструменты продвинутого уровня: метки, макросы, буферы, окна, вкладки, команды диапазонов и базовую настройку. Они особенно полезны при работе по SSH и редактировании конфигураций на сервере.
Метки для быстрых переходов
Метка запоминает позицию в файле. Чтобы установить локальную метку a, поставьте курсор в нужное место и нажмите:
ma
Перейти к ней можно командой:
'a
Апостроф переводит курсор в начало строки с меткой. Для возврата точно к символу используется обратный апостроф:
`a
Посмотреть установленные метки:
:marks
Метки особенно удобны в длинной конфигурации: можно отметить блок ma, перейти в другое место, внести изменения и вернуться через `a.
Специальные метки:
`.— позиция последнего изменения;`^— место последней вставки;`[и`]— начало и конец последнего изменённого или вставленного текста;`<и`>— границы последнего визуального выделения.
Макросы
Макрос записывает последовательность действий и позволяет повторить её несколько раз. Для записи в регистр q:
qa
Выполните необходимые действия, затем нажмите:
q
Воспроизвести макрос можно командой:
@a
Повторить его несколько раз:
10@a
Простой пример — добавить точку с запятой в конец нескольких строк:
- поставьте курсор на первую строку;
- нажмите
qa; - нажмите
A, затем;, затемEsc; - перейдите на следующую строку клавишей
j; - завершите запись клавишей
q; - вернитесь на первую строку и нажмите
@a; - повторяйте через
@@или с множителем10@a.
Перед записью макроса выберите действие, которое одинаково работает на каждой строке. Если команда зависит от конкретной длины текста, макрос может остановиться не там, где ожидалось.
Посмотреть содержимое регистра макроса:
:reg a
Если макрос ошибся, нажмите u, измените его запись или заново запишите в тот же регистр.
Буферы
В Vim открытый файл называется буфером. Буфер может быть открыт, но не показан в текущем окне. Посмотреть список буферов:
:buffers
или:
:ls
Перейти к буферу по номеру:
:buffer 2
Открыть другой файл в новом буфере:
:edit /etc/hosts
Перейти к следующему или предыдущему буферу:
:bnext
:bprevious
Сокращённые варианты — :bn и :bp. Закрыть текущий буфер:
:bdelete
Если в буфере есть несохранённые изменения, Vim предупредит перед закрытием. Не используйте :bdelete! автоматически: восклицательный знак отбросит изменения.
Проверить, какие файлы изменены, можно через:
:ls!
При работе с системными файлами полезно явно сохранять каждый буфер через :write, а не надеяться, что переход к другому файлу всё сделает сам.
Окна и разделение экрана
Окно — это область, в которой отображается буфер. Один буфер можно показывать в нескольких окнах.
Открыть файл в вертикальном разделе:
:vsplit /etc/hosts
В горизонтальном:
:split /etc/hostname
Перемещаться между окнами можно комбинациями:
Ctrl-w h
Ctrl-w j
Ctrl-w k
Ctrl-w l
Также доступны команды Ctrl-w w для перехода к следующему окну и Ctrl-w q для закрытия текущего.
Изменить размер окна:
Ctrl-w = выровнять размеры
Ctrl-w + увеличить высоту
Ctrl-w - уменьшить высоту
Ctrl-w > увеличить ширину
Ctrl-w < уменьшить ширину
Окна удобны для сравнения конфигураций или переноса фрагмента между файлами. Если нужно работать с большим количеством файлов, сначала откройте их буферами, а окна используйте только для параллельного просмотра.
Вкладки
Вкладка объединяет одно или несколько окон. Создать вкладку с файлом:
:tabedit /etc/hosts
Перейти к следующей или предыдущей вкладке:
:tabnext
:tabprevious
Сокращённые формы — :tabn и :tabp. Показать список вкладок:
:tabs
Вкладки не являются заменой буферам: файл может существовать в буфере независимо от того, отображается ли он сейчас во вкладке. Практичное правило простое: буферы — для списка открытых файлов, окна — для одновременного просмотра, вкладки — для отдельных рабочих контекстов.
Команды диапазонов
Многие команды Vim можно применять не к текущей строке, а к диапазону. Формат:
:начало,конецкоманда
Примеры:
:10,20d удалить строки с 10 по 20
:10,20y скопировать строки с 10 по 20
:10,20s/old/new/g
Специальные обозначения:
.— текущая строка;$— последняя строка файла;%— весь файл;'<,'>— текущее визуальное выделение.
Поэтому после выделения блока и нажатия : Vim автоматически подставляет диапазон '<,'>. Можно выполнить замену только в выделенном фрагменте:
:'<,'>s/old/new/gc
Команда :global запускает действие на строках, соответствующих шаблону:
:g/^#/d
Она удалит все строки, начинающиеся с #. Перед использованием на важном файле лучше сначала выполнить только поиск и проверить совпадения через /^#/.
Инвертировать условие можно через :vglobal или :v:
:v/^#/d
Такая команда удалит строки, которые не начинаются с #. Это мощный инструмент, поэтому применять его стоит только после проверки шаблона и создания резервной копии.
Выполнение команд оболочки
Из Vim можно выполнить команду операционной системы:
:!ls -la
Вернуться в редактор после вывода можно нажатием Enter. Для передачи диапазона строк внешней команде используется :'<,'>!sort или другая команда вместо sort.
Текущий файл можно передать скрипту через %:
:!wc -l %
Не используйте :! для команд, которые изменяют файл, пока не понимаете, как они взаимодействуют с открытым буфером. После внешнего изменения файла Vim может показывать старую версию в памяти; в таком случае потребуется перечитать файл через :edit!, предварительно решив судьбу несохранённых изменений.
Настройка .vimrc
Постоянные настройки обычно размещают в ~/.vimrc. Системный администратор может начать с небольшого набора:
set number
set relativenumber
set hlsearch
set incsearch
set ignorecase
set smartcase
syntax on
Открыть файл настроек:
vi ~/.vimrc
После изменения перечитать его без перезапуска редактора:
:source ~/.vimrc
Проверить значение конкретной настройки:
:set number?
Не копируйте чужой большой .vimrc на сервер без проверки. Плагины, нестандартные команды и настройки терминала могут отсутствовать или сделать аварийный доступ неудобным. Для удалённого сервера лучше иметь минимальную конфигурацию, которая работает в обычном терминале.
Восстановление после сбоя
Vim создаёт swap-файлы, чтобы помочь восстановить изменения после сбоя. Если при открытии появляется предупреждение о swap-файле, сначала выясните:
- не открыт ли этот файл в другом сеансе;
- не работает ли ещё процесс Vim;
- когда swap-файл был изменён;
- есть ли в нём более свежие данные.
Вариант Recover может вернуть несохранённые изменения, а Delete удалит swap-файл. Удалять его безопасно только после проверки, что другой сеанс действительно закрыт и восстановление не требуется.
После аварийного восстановления проверьте файл, сохраните корректную версию и удалите устаревший swap-файл штатным способом.
Практическая задача
Создайте несколько учебных файлов:
mkdir -p ~/vi-advanced-lab
printf 'server_name old.example;\n' > ~/vi-advanced-lab/site.conf
printf 'proxy_pass http://old-backend:8080;\n' >> ~/vi-advanced-lab/site.conf
printf 'server_name old.example;\n' >> ~/vi-advanced-lab/site.conf
vi ~/vi-advanced-lab/site.conf
Выполните последовательно:
- установите метку
maна первой строке; - запишите макрос, который меняет
old.exampleнаnew.exampleчерезciw; - повторите макрос на втором совпадении;
- откройте
/etc/hostsв вертикальном окне только для просмотра; - вернитесь к учебному файлу через
:buffer; - замените
old-backendнаnew-backendкомандой с подтверждением; - проверьте список буферов через
:ls; - сохраните только учебный файл.
После этого закройте окно просмотра и выйдите из Vim. Не экспериментируйте с системными файлами, если не уверены, какой буфер сейчас активен.
Шпаргалка
| Задача | Команда |
|---|---|
| Установить метку | ma |
| Перейти к метке | `a |
| Начать запись макроса | qa |
| Остановить запись | q |
| Запустить макрос | @a |
| Повторить последний макрос | @@ |
| Список буферов | :ls |
| Перейти к буферу | :buffer N |
| Вертикальное окно | :vsplit файл |
| Горизонтальное окно | :split файл |
| Следующее окно | Ctrl-w w |
| Новая вкладка | :tabedit файл |
| Весь файл | % |
| Удалить диапазон | :10,20d |
| Команда по шаблону | :g/шаблон/команда |
| Выполнить shell-команду | :!команда |
| Перечитать настройки | :source ~/.vimrc |
Итог
Продвинутый Vim — это не набор магических комбинаций, а система рабочих контекстов. Метки ускоряют навигацию, макросы автоматизируют повторяющиеся изменения, буферы хранят открытые файлы, окна помогают сравнивать их, а команды диапазонов позволяют обрабатывать большие фрагменты сразу.
Используйте эти возможности постепенно. Сначала освойте один макрос и несколько буферов, затем добавляйте окна и настройки. Для серверной работы особенно важны осторожность, резервная копия и проверка конфигурации после сохранения.