Vimmacros观视觉select的每一行
我想在select的每一行上运行一个macros,而不是总计我头脑中的行数。 例如,我可能写一个macros来转换:
Last, First
成
First Last
我希望它可以运行在所有这些线上:
Stewart, John Pumpkin, Freddy Mai, Stefan ...
任何想法的Vim大师?
编辑:这只是一个例子,显然这是trivialy正则expression式,但也有其他的例子,不太容易,我宁愿使用macros。
假设你有一个运行(并保持)在一行的macros。 然后你可以在你select的每一行上运行它:
:'<,'>normal @q
(如果你已经有一组select的行,在命令行上命中:
产生:'<,'>
)
例如,下面的macros将每个单词的首字母大写,除了第一行之外:
: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.
用上面的normal @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.
select行,然后按:
进入命令模式。 Vim会自动填写'<,'>
,这限制了范围到选定的行。 对于您的示例,您可以使用:s
命令进行交换:
:'<,'>s/\(\w\+\), \(\w\+\)/\2, \1/
这将交换在视觉select的每一行中用逗号分隔的两个单词。
您也可以像使用任何其他书签或行位置一样使用'<
和'>
,例如作为移动命令的一部分,所以在正常模式中, d'<
将从当前光标位置删除到视觉select中第一行的开头。 即使块不再在视觉上突出显示,标记仍然有效。
如果要在每一行重放一个录制的macros,则需要使用:normal
命令执行该macros。 不幸的是:normal
命令不能在一系列的行上运行,但是你可以用:global
命令来解决这个问题。 这在所有匹配正则expression式的行上运行:ex
命令,所以你可以这样做:
:'<,'>g/^/ norm @a
说明:
:'<,'> for every line in the visual block g/^/ on every line that matches the regex /^/ - ie 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>
好处是你可以在视觉select上应用任何macros。 您需要将macros信作为参数,例如:
:Rover a