我知道当您在vim中定义一个函数时,您可以使用range
关键字,以便用户可以说:
:-5,+5call MyFunction()
然后你的函数得到:firstline和a:lastline。
我想要的是类似的东西,但更像是将命令与动作相结合的传统vi方式,以便'd'删除一个空格,'dw'删除一个单词,'d2w'删除两个单词,'d2j '删除三行等。假设我的函数被映射到某个输入模式字符序列,有没有办法让它接受类似的可变长度输入,然后修改那个文本?
为了更清楚一点,假设我想定义一个函数来包装< b>现有文本周围的标签。我们会说函数映射到; b。我希望用户能够说'; bw'加粗一个单词,或'; bf。'使用vim为内置命令提供的所有灵活性,将所有内容加粗到句子的末尾或其他任何内容。
答案 0 :(得分:2)
如果我理解你在问什么,那么你所做的只是在你的映射中包含char参数。例如:
map d :call MyFunction('d')<cr>
map dw :call MyFunction('dw')<cr>
map d2w :call MyFunction('d2w')<cr>
" Of course these would be terrible mappings because they
" are already mapped to important Vim functions
映射的工作方式是,如果你“过度指定”上面的'd'之类的字符,以便它可以单独使用,也可以作为更长命令的前缀,Vim将在之后短暂等待(timeoutlen
)你按'd'看你是否要按另一个角色。 (这取决于timeout
选项设置为true,这是默认值。)如果不按另一个字符,Vim将执行'd'映射。如果这样做,将调用更复杂的映射。请参阅:h map-commands
一般和:h map-typing
了解更多信息。
注意:在您澄清之后,我认为您想要的是创建一个自定义“操作员”功能,您可以使用该功能操作由Vim运动定义的缓冲区域。有关如何执行此操作的信息,请参阅:h map-operator
。