Vi/Vim для уверенной работы: операторы, движения и массовое редактирование
Как перейти от базовых команд vi к эффективному редактированию: операторы и движения, текстовые объекты, визуальный режим, поиск и замена, регистры и повтор команд.
Содержание статьи
- От базовых команд к быстрой работе
- Операторы и движения
- Движения по словам
- Операции внутри и вокруг объектов
- Команды `f`, `t` и повторение
- Визуальный режим
- Повтор последнего изменения
- Поиск и замена
- Регистры и копирование
- Отступы и форматирование
- Безопасная работа с массовыми изменениями
- Небольшая практическая задача
- Шпаргалка
- Что дальше
От базовых команд к быстрой работе
В первой статье мы разобрали режимы 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— заменить;>или<— изменить отступ.
Пример изменения отступа блока:
- нажмите
Vна первой строке; - клавишами
jиkвыделите нужные строки; - нажмите
>; - нажмите
.для повторения отступа, если нужно обработать блок дальше.
После команды > выделение иногда остаётся активным — это зависит от настроек Vim. Нажмите Esc, чтобы вернуться в обычный режим.
Блочное выделение через Ctrl-v полезно, когда нужно добавить одинаковый текст в несколько строк. Выделите вертикальный участок, нажмите I, введите текст и завершите операцию клавишами Esc. Vim вставит введённый фрагмент во все выбранные строки.
Повтор последнего изменения
Клавиша . повторяет последнее изменение. Это одна из самых полезных команд Vim.
Например:
- поставьте курсор на слово;
- нажмите
ciw; - введите новое значение;
- нажмите
Esc; - переходите к следующим похожим словам и нажимайте
..
Повторяется не просто вставленный текст, а вся операция редактирования. Поэтому . хорошо работает при одинаковых изменениях в нескольких местах.
Соседняя команда 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 проверьте три вещи:
- Вы действительно находитесь в нужном файле.
- Шаблон поиска не совпадает с лишними фрагментами.
- Замена не ломает синтаксис конфигурации.
Полезная последовательность:
: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
В редакторе:
- найдите
old.exampleчерез/old.example; - замените слово командой
ciwнаnew.example; - перейдите к следующему совпадению через
nи повторите изменение через.; - замените
old-backendнаnew-backendчерез поиск иciw; - скопируйте первую строку
yyи вставьте её ниже черезp; - удалите лишнюю строку
dd; - выполните
:%s/http/https/gc, подтверждая замены клавишейy; - сохраните файл через
: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 уже становится полноценным инструментом для повседневной работы. Следующий уровень — макросы, метки, окна, буферы, вкладки и настройка редактора.
Но сначала стоит закрепить текущие команды на небольших текстовых файлах. Скорость приходит не от заучивания огромной шпаргалки, а от понимания принципа: выберите оператор, выберите область действия и при необходимости повторите изменение клавишей ..