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