我想在选择中的每一行上运行一个宏,而不是总计我头脑中的行数。例如,我可能会编写一个宏来进行转换:
Last, First
向
First Last
我想让它在所有这些方面运行:
Stewart, John
Pumpkin, Freddy
Mai, Stefan
...
任何想法Vim大师?
编辑:这只是一个例子,显然这是一个琐碎的可复制,但是还有其他一些实例并不那么简单,我宁愿使用宏。答案 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>