В 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.


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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.