如何在vim宏中提供参数

时间:2011-11-14 10:50:20

标签: vim

通过提示或其他方式在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方法参数的提示会很好。在每次使用宏时,此参数都会有所不同。

4 个答案:

答案 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)

虽然我同意其他人的意见,如果你需要这个功能,你可能会效率低下,可以将一个可变文本字符串作为宏的一部分插入到文档中。诀窍是将要在宏中使用的文本存储在寄存器中。

  1. 将一些文本移入指定的寄存器,例如"xyw将一个单词划入x寄存器
  2. 记录您的宏qq,当您想要放置变量文本时,将其放置,例如"xp将x寄存器中的文本放入光标所在的文档中
  3. 现在,当您播放q宏@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]时将光标放在您需要的位置。