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

222

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

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

Джордан Пармер
источник
Оффтопный вопрос: я не знал о макросах VIM (или не хотел знать: P).
ОскарРиз
Несомненно, это: oreillynet.com/mac/blog/2006/07/… суммирует это довольно хорошо.
Джордан Пармер
Также можно проверить: он сложный-повтор изнутри vim
Сэм

Ответы:

354

Используйте обычную команду в режиме 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, чтобы узнать больше.

Судья майгарден
источник
1
Да,: помогите нормально в vim или по ссылке, которую я только что добавил.
судья Мейгарден
1
Что-нибудь, чтобы помочь товарищу, не являющемуся пользователем Emacs!
судья Мейгарден
48
Ницца!! Совет для начинающих: используйте V, затем j / k, чтобы выделить :norm! @a
нужные
7
Чтобы добавить к очень полезному совету от @KevinBourrillion, при нажатии :после выделения линий вместо строки ввода «Ex» будет указано, :'<,'>к чему вы добавите остаток от того, что предложил Кевин. Это позволит сделать окончательные команды следующим образом: :'<,'>norm! @a.
Дейвин
3
@GabeMoothart Позволяет !избежать переназначения пользователем ключей. Возможно, вам это не нужно, но ответ, который работает для всех, требует его.
Судья Мейгарден
60

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

:g/pattern/normal! @a

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

SergioAraujo
источник
4
Просто для пояснения для будущих пользователей: это глобальная команда Ex.
АТП
39

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

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

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

Например:

1000@q

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

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

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

Макс Хейбер
источник
4
Это останавливается на последней строке и не выполняется несколько раз на последней строке, чего я боялся.
Hubro
@Hubro, эти ответы от других пользователей работали для меня: :%norm! @aиvGG :norm! @a
Макс Хайбер
2
По какой-то причине это сработало потрясающе, а принятый ответ - нет. Мой макрос включал вставку новой строки, выполнение чего-либо и переход к следующей строке.
jasonszhao
@jasonszhao да здесь тоже самое. но есть ли в любом случае, чтобы не сказать 1000, но все строки до конца ... и по-прежнему заботиться о новой линии, делать вещи и т. д.
ihightower
2
Я думаю, следует отметить, что ваш макрос должен заканчиваться jкомандой перехода на следующую строку, иначе он попытается применить его к той же строке.
Кевин Лю
2

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

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

phux
источник