← Все статьи
TOOLS

Vi/Vim: продвинутая работа с макросами, буферами и окнами

Продвинутые возможности vi и Vim для работы с несколькими файлами: метки, макросы, буферы, окна, вкладки, диапазоны команд и настройка редактора.

Содержание статьи
  1. Когда базовых команд уже мало
  2. Метки для быстрых переходов
  3. Макросы
  4. Буферы
  5. Окна и разделение экрана
  6. Вкладки
  7. Команды диапазонов
  8. Выполнение команд оболочки
  9. Настройка `.vimrc`
  10. Восстановление после сбоя
  11. Практическая задача
  12. Шпаргалка
  13. Итог

Когда базовых команд уже мало

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

В этой статье разберём инструменты продвинутого уровня: метки, макросы, буферы, окна, вкладки, команды диапазонов и базовую настройку. Они особенно полезны при работе по SSH и редактировании конфигураций на сервере.

Метки для быстрых переходов

Метка запоминает позицию в файле. Чтобы установить локальную метку a, поставьте курсор в нужное место и нажмите:

ma

Перейти к ней можно командой:

'a

Апостроф переводит курсор в начало строки с меткой. Для возврата точно к символу используется обратный апостроф:

`a

Посмотреть установленные метки:

:marks

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

Специальные метки:

  • `. — позиция последнего изменения;
  • `^ — место последней вставки;
  • `[ и `] — начало и конец последнего изменённого или вставленного текста;
  • `< и `> — границы последнего визуального выделения.

Макросы

Макрос записывает последовательность действий и позволяет повторить её несколько раз. Для записи в регистр q:

qa

Выполните необходимые действия, затем нажмите:

q

Воспроизвести макрос можно командой:

@a

Повторить его несколько раз:

10@a

Простой пример — добавить точку с запятой в конец нескольких строк:

  1. поставьте курсор на первую строку;
  2. нажмите qa;
  3. нажмите A, затем ;, затем Esc;
  4. перейдите на следующую строку клавишей j;
  5. завершите запись клавишей q;
  6. вернитесь на первую строку и нажмите @a;
  7. повторяйте через @@ или с множителем 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

Выполните последовательно:

  1. установите метку ma на первой строке;
  2. запишите макрос, который меняет old.example на new.example через ciw;
  3. повторите макрос на втором совпадении;
  4. откройте /etc/hosts в вертикальном окне только для просмотра;
  5. вернитесь к учебному файлу через :buffer;
  6. замените old-backend на new-backend командой с подтверждением;
  7. проверьте список буферов через :ls;
  8. сохраните только учебный файл.

После этого закройте окно просмотра и выйдите из Vim. Не экспериментируйте с системными файлами, если не уверены, какой буфер сейчас активен.

Шпаргалка

Задача Команда
Установить метку ma
Перейти к метке `a
Начать запись макроса qa
Остановить запись q
Запустить макрос @a
Повторить последний макрос @@
Список буферов :ls
Перейти к буферу :buffer N
Вертикальное окно :vsplit файл
Горизонтальное окно :split файл
Следующее окно Ctrl-w w
Новая вкладка :tabedit файл
Весь файл %
Удалить диапазон :10,20d
Команда по шаблону :g/шаблон/команда
Выполнить shell-команду :!команда
Перечитать настройки :source ~/.vimrc

Итог

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

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

Материал подготовил Злой админ