← Все статьи
TOOLS

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

Как перейти от базовых команд vi к эффективному редактированию: операторы и движения, текстовые объекты, визуальный режим, поиск и замена, регистры и повтор команд.

Содержание статьи
  1. От базовых команд к быстрой работе
  2. Операторы и движения
  3. Движения по словам
  4. Операции внутри и вокруг объектов
  5. Команды `f`, `t` и повторение
  6. Визуальный режим
  7. Повтор последнего изменения
  8. Поиск и замена
  9. Регистры и копирование
  10. Отступы и форматирование
  11. Безопасная работа с массовыми изменениями
  12. Небольшая практическая задача
  13. Шпаргалка
  14. Что дальше

От базовых команд к быстрой работе

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

Сильная сторона vi и Vim — команды можно комбинировать. Оператор сообщает, что сделать, а движение — над какой частью текста. Например, dw означает «удалить до конца слова», а ci" — «изменить текст внутри кавычек».

Эта статья посвящена именно такому способу мышления.

Операторы и движения

Базовые операторы:

  • d (delete) — удалить;
  • c (change) — удалить и перейти в режим вставки;
  • y (yank) — скопировать;
  • > — увеличить отступ;
  • < — уменьшить отступ.

Оператор обычно соединяется с движением:

d + w = dw
c + $ = c$
y + 0 = y0

Команда dw удаляет текст от курсора до начала следующего слова. d$ удаляет текст от курсора до конца строки. c$ делает то же самое, но после удаления сразу включает режим вставки.

Если дважды нажать оператор, действие применяется к строке целиком:

dd    удалить строку
yy    скопировать строку
cc    заменить содержимое строки
>>    увеличить отступ строки
<<    уменьшить отступ строки

Перед командой можно указать количество:

3dw   удалить три слова
2yy   скопировать две строки
4>>   увеличить отступ четырёх строк

Такой синтаксис можно читать слева направо: количество, оператор, движение.

Движения по словам

Для точного редактирования полезно перемещаться не только по символам:

  • w — к началу следующего слова;
  • e — к концу текущего или следующего слова;
  • b — к началу предыдущего слова;
  • W, E, B — аналогичные движения по словам, разделённым пробелами;
  • 0 — к началу строки;
  • ^ — к первому непробельному символу строки;
  • $ — к концу строки.

Разница между строчными и прописными командами w и W заметна в коде и конфигурациях. w считает знаки пунктуации отдельными границами, а W воспринимает последовательность до пробела как одно слово.

Примеры:

dw    удалить одно слово
cw    заменить одно слово
y$    скопировать остаток строки
c^    заменить текст от курсора до первого непробельного символа

Операции внутри и вокруг объектов

Для кавычек, скобок и других парных символов Vim предлагает текстовые объекты. Команды с i работают внутри объекта, а с aвнутри и включая ограничители.

ciw   заменить слово под курсором
ci"   заменить текст внутри двойных кавычек
ci(   заменить текст внутри круглых скобок
ca"   заменить текст вместе с кавычками
cit   заменить текст внутри HTML/XML-тега

Допустим, в строке есть:

server_name "old.example";

Поставьте курсор внутрь old.example, нажмите ci" и введите новое имя. Кавычки сохранятся, а содержимое будет заменено.

Для скобок можно использовать ci( или ci). Для блока кода в фигурных скобках — ci{. Если нужно удалить весь блок вместе с ограничителями, используйте da{.

Эти команды особенно удобны для кода, JSON, YAML и конфигураций, где часто приходится менять значения внутри кавычек или скобок.

Команды f, t и повторение

Для перемещения к конкретному символу в текущей строке:

  • f<char> — перейти на следующий символ <char>;
  • F<char> — перейти на предыдущий символ;
  • t<char> — перейти перед следующим <char>;
  • T<char> — перейти после предыдущего <char>.

Например, f; переместит курсор к следующей точке с запятой. Команда dt; удалит текст до следующей точки с запятой, не удаляя саму точку.

Последнее движение f, F, t или T можно повторить:

  • ; — повторить движение в том же направлении;
  • , — повторить его в обратном направлении.

Это удобно при обработке длинной строки с несколькими одинаковыми символами.

Визуальный режим

Визуальный режим позволяет выделить текст, а затем применить к нему операцию.

  • v — выделение по символам;
  • V — выделение целых строк;
  • Ctrl-v — прямоугольное, или блочное, выделение.

После выделения можно использовать:

  • d — удалить;
  • y — скопировать;
  • c — заменить;
  • > или < — изменить отступ.

Пример изменения отступа блока:

  1. нажмите V на первой строке;
  2. клавишами j и k выделите нужные строки;
  3. нажмите >;
  4. нажмите . для повторения отступа, если нужно обработать блок дальше.

После команды > выделение иногда остаётся активным — это зависит от настроек Vim. Нажмите Esc, чтобы вернуться в обычный режим.

Блочное выделение через Ctrl-v полезно, когда нужно добавить одинаковый текст в несколько строк. Выделите вертикальный участок, нажмите I, введите текст и завершите операцию клавишами Esc. Vim вставит введённый фрагмент во все выбранные строки.

Повтор последнего изменения

Клавиша . повторяет последнее изменение. Это одна из самых полезных команд Vim.

Например:

  1. поставьте курсор на слово;
  2. нажмите ciw;
  3. введите новое значение;
  4. нажмите Esc;
  5. переходите к следующим похожим словам и нажимайте ..

Повторяется не просто вставленный текст, а вся операция редактирования. Поэтому . хорошо работает при одинаковых изменениях в нескольких местах.

Соседняя команда u отменяет изменение, а Ctrl-r возвращает отменённое действие. Если нужно посмотреть историю изменений, в Vim можно использовать:

:undolist

Не путайте . в обычном режиме с точкой в командной строке — контекст режима важен.

Поиск и замена

Для поиска используйте /текст, n и N, как в базовой статье. Чтобы заменить одно совпадение в текущей строке:

:s/старое/новое/

Чтобы заменить все совпадения в текущей строке:

:s/старое/новое/g

Для всего файла:

:%s/старое/новое/g

Перед каждой заменой Vim может запрашивать подтверждение:

:%s/старое/новое/gc

После этого для каждого совпадения доступны ответы:

  • y — заменить;
  • n — пропустить;
  • a — заменить все оставшиеся;
  • q — остановить замену;
  • l — заменить последнее совпадение и остановиться.

Если в искомом тексте есть специальные символы, выберите разделитель, который не встречается в строке:

:%s#old/path#new/path#g

Перед массовой заменой сначала выполните поиск и проверьте совпадения через /старое. Для важных конфигураций можно сначала сохранить копию или использовать подтверждение c.

Регистры и копирование

В Vim есть несколько регистров — именованных областей, куда попадает скопированный или удалённый текст. Необязательно сразу запоминать все их разновидности, достаточно знать безымянный регистр и системный буфер обмена.

Посмотреть содержимое регистров:

:reg

Явно скопировать строку в именованный регистр a:

"ayy

Здесь "a выбирает регистр, а yy копирует строку. Вставить его содержимое:

"ap

Для добавления к существующему регистру используется прописная буква:

"Ayy

Системный буфер обмена в Vim может быть доступен через регистр +:

"+yy
"+p

Поддержка зависит от сборки Vim и терминала. Проверить её можно командой:

:version

Ищите в выводе признак +clipboard. Если указано -clipboard, системный буфер обмена через этот регистр недоступен.

Отступы и форматирование

Для текущей строки:

>>    увеличить отступ
<<    уменьшить отступ
==    автоматически отформатировать

Для диапазона строк можно использовать визуальный режим или команду с диапазоном:

:10,20>
:10,20<
:10,20=

Автоматически выровнять весь файл:

gg=G

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

Безопасная работа с массовыми изменениями

Перед командой вроде :%s/.../.../g проверьте три вещи:

  1. Вы действительно находитесь в нужном файле.
  2. Шаблон поиска не совпадает с лишними фрагментами.
  3. Замена не ломает синтаксис конфигурации.

Полезная последовательность:

:e!       перечитать файл без сохранения текущих изменений
:%s/old/new/gc
:w        сохранить после проверки

Команда :e! опасна для несохранённых изменений: она их отбросит. Используйте её только когда точно хотите перечитать файл с диска.

Для системных конфигураций после сохранения проверьте синтаксис специализированной командой. Например, для конфигурации Nginx:

sudo nginx -t

И только после успешной проверки перезагружайте сервис.

Небольшая практическая задача

Создайте файл с повторяющимися настройками:

cat > ~/vi-lab.conf <<'EOF'
server_name old.example;
proxy_pass http://old-backend:8080;
server_name old.example;
proxy_pass http://old-backend:8080;
EOF
vi ~/vi-lab.conf

В редакторе:

  1. найдите old.example через /old.example;
  2. замените слово командой ciw на new.example;
  3. перейдите к следующему совпадению через n и повторите изменение через .;
  4. замените old-backend на new-backend через поиск и ciw;
  5. скопируйте первую строку yy и вставьте её ниже через p;
  6. удалите лишнюю строку dd;
  7. выполните :%s/http/https/gc, подтверждая замены клавишей y;
  8. сохраните файл через :wq.

Проверьте результат:

cat ~/vi-lab.conf

Шпаргалка

Задача Команда
Удалить слово dw
Изменить слово cw или ciw
Удалить до конца строки d$
Изменить внутри кавычек ci"
Удалить блок в скобках da(
Скопировать несколько строк Nyy
Визуальный режим по строкам V
Повторить изменение .
Перейти к символу f<char>
Повторить поиск символа ;
Замена в строке :s/old/new/g
Замена во всём файле :%s/old/new/g
Замена с подтверждением :%s/old/new/gc
Увеличить отступ >>
Автоформатировать файл gg=G
Показать регистры :reg

Что дальше

После операторов, движений и регистров Vim уже становится полноценным инструментом для повседневной работы. Следующий уровень — макросы, метки, окна, буферы, вкладки и настройка редактора.

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

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