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

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

Запись начинается с q и буквы регистра, заканчивается тем же q

Механизм записи прост до изящества. В обычном режиме нажимается клавиша записи, за ней буква регистра, куда ляжет макрос. С этого момента каждое действие записывается. Когда правка завершена, та же клавиша записи останавливает запись.

qa            начать запись в регистр a
... правки ...
q             остановить запись

Регистр выбирают из строчных букв латиницы, от a до z. Это даёт двадцать шесть отдельных ячеек, в каждой свой макрос. Во время записи внизу экрана редактор показывает оповещение о том, что идёт запись в выбранный регистр, и оно исчезает, когда запись остановлена. Подсказка помогает не запутаться, записывается макрос сейчас или нет.

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

@a            воспроизвести макрос из регистра a
@@            воспроизвести последний выполненный макрос

Простой пример показывает всю последовательность целиком

Возьмём конкретную задачу: в каждой строке поменять третье слово на слово яблоко. Разложим запись по шагам, чтобы увидеть, как складывается макрос.

qa            начать запись в регистр a
0             перейти в начало строки
2w            сдвинуться на два слова вперёд, к третьему
cw яблоко     заменить слово на "яблоко"
<Esc>         выйти из режима вставки
q             остановить запись

Теперь на любой строке нажатие клавиши выполнения с буквой регистра повторит ровно эти шаги. Макрос захватил не результат, а сами действия - переход в начало, сдвиг на два слова, замену. Поэтому он повторяется на каждой строке заново, применяя ту же логику к новому содержимому.

Ценность в том, что макрос собирается из обычных команд редактора, которые автор и так знает. Не нужно учить особый язык - достаточно один раз выполнить правку под запись, и она становится повторяемой. Это превращает разрозненные команды в воспроизводимое сложное редактирование на основе уже знакомых возможностей.

Нормализация курсора делает макрос пригодным к повтору

Здесь кроется главный секрет надёжного макроса, отделяющий рабочий от рассыпающегося. Макрос должен начинаться с приведения курсора в предсказуемое положение и заканчиваться переходом, готовящим следующий повтор. Без этого второй запуск стартует не оттуда, откуда нужно, и вся цепочка идёт вразнос.

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

qa            начать запись
0             нормализовать: в начало строки
... правки ...
j             перейти на следующую строку - готовим повтор
q             остановить запись

Опытные авторы макросов идут дальше и привязывают каждый шаг к надёжному ориентиру. Вместо счёта слов в середине строки, который ломается при разной длине, ищут уникальный знак вперёд или прыгают к концу строки и движутся назад. Чем меньше макрос полагается на точное число символов и слов, тем устойчивее он к строкам разной формы. Привязка к ориентирам - вот что делает макрос пригодным для пёстрого, неоднородного текста.

Счётчик и применение к диапазону обрабатывают сотни строк разом

Записанный макрос редко запускают по одному разу. Чаще нужно прогнать его по множеству строк, и тут раскрывается настоящая сила. Перед клавишей выполнения ставят число, и макрос повторится столько раз подряд.

50@a          выполнить макрос 50 раз подряд
100@@         выполнить последний макрос 100 раз

Счётчик удобен, когда число строк известно. Но есть способ изящнее - применить макрос ко всем строкам диапазона или ко всем подходящим строкам через командный режим. Команда выполнения обычных команд на диапазоне прогоняет макрос по каждой строке выделения.

:'<,'>normal @a       применить макрос к визуальному выделению
:g/TODO/normal @a     применить ко всем строкам со словом TODO

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

Рекурсивный макрос обрабатывает файл до самого конца сам

Существует приём для случая, когда число строк заранее неизвестно, а пройти нужно до конца файла. Макрос делают рекурсивным - в конце он вызывает сам себя. Тогда он крутится, пока какая-нибудь команда внутри не провалится, что и служит естественным тормозом.

qaq           сначала очистить регистр a
qa            начать запись
... правки ...
j             переход на следующую строку
@a            вызов самого себя
q             остановить запись

Логика остановки тонкая, но красивая. Когда курсор доходит до последней строки, команда перехода вниз проваливается, потому что идти больше некуда. Провал команды обрывает выполнение макроса, и рекурсия естественно завершается. Поэтому первым делом регистр обязательно очищают пустой записью - иначе вызов самого себя подтянет старое содержимое регистра, и поведение станет непредсказуемым.

Макрос можно отредактировать как обычный текст

Случается, записанный макрос почти верен, но в одном месте ошибка. Перезаписывать всё заново необязательно. Регистры макросов - те же текстовые регистры, поэтому макрос можно вставить в буфер как текст, поправить и вернуть обратно в регистр.

"ap           вставить содержимое регистра a в буфер
... правка текста макроса ...
0"ay$         забрать исправленную строку обратно в регистр a

Содержимое регистра выводят на пустую строку, правят как обычный текст, затем забирают исправленную строку назад в тот же регистр. Это спасает, когда длинный макрос почти готов и переписывать его целиком жалко. Есть и способ дописать к существующему макросу новые действия, не стирая старые, - запись в регистр с заглавной буквой того же имени добавляет к уже записанному.

Посмотреть, что лежит в макросе, помогает команда просмотра регистра. Она показывает записанную цепочку нажатий, что полезно при отладке, когда непонятно, почему макрос ведёт себя не так.

Где макросы блистают, а где уступают

Стоит честно очертить границы. Макросы временны, хрупки и непрозрачны - они хороши не везде. Они блистают на повторяющихся правках по образцу, которые сложнее простой замены, но не настолько весомы, чтобы писать ради них полноценную команду или скрипт. Это инструмент момента: когда просто хочется сделать дело, не долбя одни и те же команды снова и снова.

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

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