Макрос Vim в каждой строке визуального выделения
Я хотел бы запустить макрос на каждой строке в выделении, а не суммировать количество строк в моей голове. Например, я мог бы написать макрос для преобразования:
Last, First
на
First Last
и я хотел бы, чтобы он работал на всех этих строках:
Stewart, John
Pumpkin, Freddy
Mai, Stefan
...
любые идеи гуру в Vim?
EDIT: это всего лишь пример, очевидно, что это тривиально регулярное выражение, но есть и другие примеры, которые возникают не так просто, что я бы предпочел использовать макросы.
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