Я хотел бы выполнить макрос на каждой строке в выборе, а не в общей сложности количество строк в моей голове. Например, я мог бы записать макрос для преобразования:
Last, First
В
First Last
и я хотел бы, чтобы это работало на всех этих строках:
Stewart, John
Pumpkin, Freddy
Mai, Stefan
...
Какие-либо гуру Vim идей?
Править: Это - просто пример, очевидно, это тривиально regexable, но существуют другие экземпляры, которые подходят, которые не вполне так легки, что я предпочел бы использовать макросы.
Предположим, у вас есть макрос q
, который запускается (и остается) в одной строке. Затем вы можете запустить его в каждой строке вашего выбора с помощью:
:'<,'>normal @q
(если у вас уже выбрана группа строк, нажатие :
производит : '<,'>
на командная строка)
Например, в следующем макросе каждое слово в строке, кроме первого, пишется с заглавной буквы:
:let @q="^dwgU$P"
Итак, запускаем его в следующем (где выбраны строки +
)
0000: a long long time ago
0001: in a galaxy far away
+0002: naboo was under an attack
+0003: and i thought me and qui-gon jinn
+0004: could talk the federation in
0005: to maybe cutting them a little slack.
С выше обычная команда @q
, выдает:
0000: a long long time ago
0001: in a galaxy far away
0002: naboo WAS UNDER AN ATTACK
0003: and I THOUGHT ME AND QUI-GON JINN
0004: could TALK THE FEDERATION IN
0005: to maybe cutting them a little slack.
Выберите строки, затем нажмите :
, чтобы войти в командный режим. Vim автоматически заполнит '<,'>
, что ограничивает диапазон выбранными строками. Для вашего примера вы можете использовать команду :s
, чтобы выполнить замену:
:'<,'>s/\(\w\+\), \(\w\+\)/\2, \1/
Это поменяет местами два слова, разделённые запятой, на каждой строке в визуальном выборе.
Вы также можете использовать '<
и '>
как любую другую закладку или позицию строки, например, как часть команды перемещения, так в обычном режиме d'<
удалит от текущей позиции курсора до начала первой строки в визуальном выделении. Пометки остаются в силе, даже если блок больше не выделен визуально.
Если вы хотите воспроизвести записанный макрос на каждой строке, вам нужно выполнить макрос с помощью команды :normal
. К сожалению, команда :normal
не работает с диапазоном строк, но это можно исправить с помощью команды :global
. Она запускает команду :ex
на каждой строке, которая соответствует regex, так что вы можете сделать следующее:
:'<,'>g/^/ norm @a
Объяснение:
:'<,'> for every line in the visual block
g/^/ on every line that matches the regex /^/ - i.e. every line
norm run in normal mode
@a the macro recorded in a