Макрос Vim на каждой строке визуального выбора

Я хотел бы выполнить макрос на каждой строке в выборе, а не в общей сложности количество строк в моей голове. Например, я мог бы записать макрос для преобразования:

Last, First

В

First Last

и я хотел бы, чтобы это работало на всех этих строках:

Stewart, John 
Pumpkin, Freddy
Mai, Stefan
...

Какие-либо гуру Vim идей?

Править: Это - просто пример, очевидно, это тривиально regexable, но существуют другие экземпляры, которые подходят, которые не вполне так легки, что я предпочел бы использовать макросы.

77
задан Stefan Mai 21 August 2010 в 20:08
поделиться

2 ответа

Предположим, у вас есть макрос 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.
143
ответ дан 24 November 2019 в 10:53
поделиться

Выберите строки, затем нажмите :, чтобы войти в командный режим. 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
16
ответ дан 24 November 2019 в 10:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: