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



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



Last, First


на



First Last


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



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


любые идеи гуру в Vim?



EDIT: это всего лишь пример, очевидно, что это тривиально регулярное выражение, но есть и другие примеры, которые возникают не так просто, что я бы предпочел использовать макросы.

567   3  

3 ответов:

Предположим, у вас был макрос 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.

выше , производит:

 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\+\)/, /

это поменяет местами два слова, разделенные запятой на каждой строке в визуальном выделении.

вы также можете использовать '< и '> как и любая другая закладка или положение строки, например, как часть команды движения, так и в обычном режиме d'< удалит из текущей позиции курсора в начало первой строки в визуальном выделении. Метки остаются в силе, даже если блок больше не выделяется визуально.

если вы хотите воспроизвести записанный макрос на каждой строке, вам нужно выполнить макрос с помощью . К сожалению,:normal команда не работает на диапазоне строк, но вы можете исправить это с помощью . Это работает :ex команда в каждой строке это соответствует регулярному выражению, так что вы можете сделать это:

:'<,'>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

вы можете добавить функцию в ваш ~/.vimrc или просто скопируйте его в свой браузер и запустите :@+

fun! RunMacroOverSelection(macroname)
    execute "'<,'>normal @". a:macroname
endfun
com -nargs=1 Rover :call RunMacroOverSelection(<f-args>)
nnoremap <leader>r :Rover<space>

преимущество в том, что вы можете применить любой макрос на визуальный выбор. Вам нужно дать макрос письмо в качестве аргумента, например:

:Rover a

Comments

    Ничего не найдено.