В Vim, как применить макрос к набору строк? - PullRequest
196 голосов
/ 24 декабря 2008

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

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

Ответы [ 4 ]

306 голосов
/ 24 декабря 2008

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

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

:5,10norm! @a

Выполнить макрос, хранящийся в регистре a в строках 5 до конца файла.

:5,$norm! @a

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

:%norm! @a

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

:g/pattern/norm! @a

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

:'<,'>norm! @a

Введите : помогите нормальному в vim, чтобы узнать больше.

58 голосов
/ 14 марта 2011

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

:g/pattern/normal! @a

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

33 голосов
/ 04 января 2014

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

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

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

Например:

1000@q

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

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

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

2 голосов
/ 13 марта 2011

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

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

...