通过提示或其他方式在vim中录制宏时是否可以提供一些参数?
编辑: 我有这样的代码:
foo
bar
我想用红宝石块包围每个人:
expect do
foo
end.to raise_error(CustomClass)
expect do
foo
end.to raise_error(OtherCustomClass)
因此,很容易创建一个将导致以下结果的宏: 期待做 FOO end.to raise_error()
expect do
foo
end.to raise_error()
但是有一个用于设置raise_error方法参数的提示会很好。在每次使用宏时,此参数都会有所不同。
答案 0 :(得分:6)
如果您正在谈论使用qx...q
录制宏,则无法做到这一点。
但您仍然可以执行::let @y = substitute(@x, 'old_pattern', 'replacement', 'g')
,然后使用@y
。
您还可以定义一个函数:
function Play(myArg)
execute 'normal sequence_of_characters' . a:myArg . 'other_sequence_of_characters'
endfunction
call Play('foo')
答案 1 :(得分:6)
虽然我同意其他人的意见,如果你需要这个功能,你可能会效率低下,可以将一个可变文本字符串作为宏的一部分插入到文档中。诀窍是将要在宏中使用的文本存储在寄存器中。
"xyw
将一个单词划入x寄存器qq
,当您想要放置变量文本时,将其放置,例如"xp
将x寄存器中的文本放入光标所在的文档中@q
时,它将使用x寄存器中当前的任何内容,因此您可以将不同的文本拖入x寄存器,播放您的q宏,将使用新的文本。 答案 2 :(得分:2)
特别是在OP的情况下,你真的只有两个可变内容片段,我发现最简单的方法是@mkomitee approach above的混蛋}。
我没有在每次使用宏之前手动将两个'参数'保存到寄存器中,而是选择键入“第一个参数”,然后选择它,评估宏,然后键入“第二个参数”。这个,我用一个删除命令启动宏(一个简单的 d ,假设你总是以可视模式调用宏);然后使用切换到插入模式的命令(如 c 或 i )完成它,最后,在仍处于插入模式时, Ctrl-O q 导致宏在完成后也将Vim置于插入模式。
作为一个稍微简单的例子,如果两个“参数”是单个单词,这里是创建(然后调用)宏来操纵widget.snog()
到参数化widgetFoo.fooSnog(bar)
的按键:
foo b qq “zdw - 我们现在正在录制到
中的第一个“参数”q
寄存器,使用z
‸
“aP - 前缀 - 粘贴来自文档中其他地方使用的固定寄存器
widget.snog()‸
^ 电子 a␣ CTRL-R ESC < kbd> b~ hx - 粘贴第一个arg,并大写
widget‸Foo.snog()
2w~ b “zP - 大写现有单词,然后再次粘贴第一个arg
widgetFoo.fo‸oSnog()
$ Ctrl-O q - 移动到最后一个位置,输入insert-mode,然后结束宏
widgetFoo.fooSnog(‸)
使用
bar
完成第一个实例后,我们现在可以多次使用它:
o baz Esc b - 设置我们的第一个'参数',
widgetFoo.fooSnog(bar) ‸baz
@q quux Esc - 调用宏,完成第二个
widgetFoo.fooSnog(bar) widgetBaz.bazSnog(quux‸)
o corge Esc b @@ grault Esc - 重复第三次
widgetFoo.fooSnog(bar) widgetBaz.bazSnog(quux) widgetCorge.corgeSnog(grault‸)
o garply Esc b @@ waldo Esc - ......等等
widgetFoo.fooSnog(bar) widgetBaz.bazSnog(quux) widgetCorge.corgeSnog(grault) widgetGarply.garplySnog(waldo‸)
当然,它看起来很费劲,以如此长的方式输入 - 但实际上很少有击键,很容易训练到你的手指。
tl; dr :输入第一个参数; 之前输入宏记录将其删除到寄存器中;根据需要操纵你的文字;然后使用 Ctrl-O q 将vim保留在第二个参数位置的插入模式中。
答案 3 :(得分:0)
如果您需要生成代码,则最好的方法是使用vim snippets。您可以配置片段,以便在[tab]时将光标放在您需要的位置。