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