В Vim, как применить макрос к набору строк?

У меня есть файл с кучей строк. Я записал макрос, который выполняет операцию в одной строке. Я хочу повторить этот макрос на всех оставшихся строках в файле. Есть ли быстрый способ сделать это?

Я попробовал Ctrl + Q, выделил ряд строк и нажал @@, но это, похоже, не помогло.

Ответ 1

Используйте команду normal в режиме Ex для выполнения макроса на нескольких/всех строках:

Выполните макрос, сохраненный в регистре a в строках с 5 по 10.

:5,10norm! @a

Выполните макрос, сохраненный в регистре a, в строках 5 по окончании файла.

:5,$norm! @a

Выполните макрос, сохраненный в регистре a, на всех строках.

:%norm! @a

Выполните сохранение макроса в регистре a во всех строках, соответствующих шаблону.

:g/pattern/norm! @a

Чтобы выполнить макрос на визуально выбранных строках, нажмите V и j или k, пока не будет выбран желаемый регион. Затем введите :norm! @a и обратите внимание на то, что показана следующая строка ввода.

:'<,'>norm! @a

Введите: в обычном режиме vim читайте больше.

Ответ 2

Используйте global для запуска макроса a во всех строках, которые содержат pattern

:g/pattern/normal! @a

Для получения справки проверьте :help global.

Ответ 3

Вы также можете сделать это:

В обычном режиме:

[number of times to apply the macro] @ [register]

Например:

[email protected]

Применяет макрос в регистре q к следующим 1000 строкам.

Обновление: принятый ответ намного лучше

Обновление: как указал @kevinliu, вы, вероятно, захотите завершить макрос с помощью j чтобы перейти к следующей строке.

Ответ 4

Там также плагин под названием RangeMacro, делает именно то, что вы хотите! Для всех, кто не может догадаться по имени, что он делает: он повторяет записанный макрос для каждой строки в заданном диапазоне, независимо от визуального выбора или по: 40,50/: +10

См. http://www.vim.org/scripts/script.php?script_id=3271