每一行视觉选择的Vim宏

时间:2010-07-26 18:46:04

标签: vim macros line

我想在选择中的每一行上运行一个宏,而不是总计我头脑中的行数。例如,我可能会编写一个宏来进行转换:

Last, First

First Last

我想让它在所有这些方面运行:

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

任何想法Vim大师?

编辑:这只是一个例子,显然这是一个琐碎的可复制,但是还有其他一些实例并不那么简单,我宁愿使用宏。

3 个答案:

答案 0 :(得分:140)

假设您有一个宏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.

使用上述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.

答案 1 :(得分:16)

选择行,然后按:进入命令模式。 Vim会自动填写'<,'>,这会限制所选行的范围。对于您的示例,您可以使用:s命令进行交换:

:'<,'>s/\(\w\+\), \(\w\+\)/\2, \1/

这会在视觉选择的每一行上交换两个用逗号分隔的单词。

您还可以像使用任何其他书签或行位置一样使用'<'>,例如作为移动命令的一部分,因此在正常模式下d'<将从当前光标位置删除到视觉选择中第一行的开头。即使块不再在视觉上突出显示,标记仍然有效。

如果要在每一行上重放录制的宏,则需要使用:normal命令执行宏。不幸的是,:normal命令不能在一系列行上运行,但您可以使用:global命令修复它。这会在与正则表达式匹配的每一行上运行: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

答案 2 :(得分:1)

您可以将以下功能添加到gem "jekyll-theme-primer", "~> 0.4",或者只需将其复制到浏览器上并运行~/.vimrc

:@+

优点是您可以在视觉选择上应用任何宏。 您需要将宏字母作为参数,例如:

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