Я бы хотел запустить макрос для каждой строки в выделенном фрагменте, а не подсчитывать количество строк в голове. Например, я мог бы написать макрос для преобразования:
Last, First
В
First Last
и я бы хотел, чтобы он запускался во всех этих строках:
Stewart, John
Pumpkin, Freddy
Mai, Stefan
...
Есть идеи гуру Vim?
РЕДАКТИРОВАТЬ: это просто пример, очевидно, что это тривиально регулярное выражение, но есть и другие случаи, которые не так просты, что я бы предпочел использовать макросы.
Ответы:
Предположим, у вас есть макрос,
q
который запускается (и остается) в одной строке. Затем вы можете запустить его в каждой строке вашего выбора с помощью:(если у вас уже выбрана группа строк, нажатие
:
производит:'<,'>
в командной строке)Например, следующий макрос использует каждое слово в строке, кроме первого:
Итак, запустите его на следующем (где
+
выделены строки)С помощью приведенной выше
normal @q
команды производит:источник
:'<,'>normal! @q
@q
. From:help normal
- «Если задано [!], Сопоставления не будут использоваться».@
в визуальном режиме , как это:vnoremap @ :normal @
. Таким образом, вы все еще можете делать@a
то, что ожидаете (хотя вам нужно будет нажать Enter после :()Выберите строки и нажмите,
:
чтобы войти в командный режим. Vim автоматически заполнит'<,'>
, что ограничивает диапазон выбранными строками. В вашем примере вы можете использовать:s
команду для обмена:Это поменяет местами два слова, разделенных запятой, в каждой строке визуального выделения.
Вы также можете использовать
'<
и,'>
как любую другую закладку или позицию строки, например, как часть команды перемещения, поэтому в нормальном режимеd'<
будет удаляться от текущей позиции курсора до начала первой строки в визуальном выборе. Метки остаются в силе, даже если блок больше не выделяется визуально.Если вы хотите воспроизвести записанный макрос в каждой строке, вам необходимо выполнить макрос с помощью
:normal
команды. К сожалению,:normal
команда не работает с рядом строк, но вы можете исправить это с помощью:global
команды. Это запускает:ex
команду в каждой строке, соответствующей регулярному выражению, поэтому вы можете сделать это:Пояснение:
источник
^
с ,.
чтобы сделать запуск макроса только на линиях , что имеет какой - то текст, не будет?Вы можете добавить указанную ниже функцию в свой
~/.vimrc
или просто скопировать ее в своем браузере и запустить:@+
Преимущество в том, что вы можете применить любой макрос к визуальному выделению. Вам нужно указать букву макроса в качестве аргумента, например:
источник