vim:将字符或单词传递给您的函数

标签 vim

我知道当你在 vim 中定义一个函数时,你可以使用 range关键字,以便用户可以说:

:-5,+5call MyFunction()

然后你的函数得到 a:firSTLine 和 a:laSTLine。

我想要的是类似的东西,但更像是将命令与运动结合的传统 vi 方式,这样 'd' 删除一个空格,'dw' 删除一个单词,'d2w' 删除两个单词,'d2j' 删除三个行等假设我的函数被映射到一些输入模式字符序列,有没有办法让它接受类似的可变长度输入,然后修改该文本?

为了更清楚一点,假设我想定义一个函数来将 标签包裹在现有文本周围。我们会说这个函数被映射到 ;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有关如何执行此操作的信息。

关于vim:将字符或单词传递给您的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4452282/

相关文章:

Vim 的全局命令,模式由逗号连接

vim - Vim-在PHP文件上激活HTML代码段

perl - 屏幕抓取 : Automating a vim script

vim - 在 Ex 模式下将 "read"命令的输出处理为范围

linux - .vimrc .vim script/plugin/whatelse 中的绝对或相对路径

vim - psql 客户端使用 vi 在编辑模式下自动完成

vim - VIM 中的历史忽略

vim - 在 Vim 中如何将光标移动到字符串的末尾?

list - 从列表中删除重复项(在 vim 中)

linux - 从 Linux 命令行复制到 Vim