Operator Pending Mappings

前面介绍 mapping 的时候, 留了个operator-pending 的坑, 现在来填.

官方文档中, 对 Operator-pending mappings 的解释是:

Operator-pending mappings can be used to define a movement command that can be
used with any operator.

Operator-pending mappings 可以用于定义会被执行的移动指令.[我这翻译的…]

看个简单的例子来理解.

打开文件test.txt, 内容如下:

This is (some) text about topic one.

It has multiple (paragraphs).
part1(paragraph) content.
part2(paragraph) content.
part3(paragraph) content.
.....
end

命令模式下, 执行:

:onoremap p i(

这时, 在 normal 模式下, 按dp, 等同于di(, 即删除() 里的内容.

这里默认从当前光标所在位置, 往下查找第一个(), 然后执行操作.

比如, 我们把光标移动到第三行 It has……, 按dp, 会发现 paragraphs 被删除了.

当光标停留在最后一行 end, 按dp, 发现无效.

如果想要消除光标所在位置, 就需要使用<C-u> CTRL-u.

来看个例子:

:onoremap i( :<C-u>normal! 0f)vi(<CR>

此时, 按di(, 不管光标在哪里, 会删除光标所在行的第一个() 中的内容.

鉴于 Operator-pending mappings 我平时用到的很少, 也没有细细研究, 目前就不多扯了.

想要了解更多, 可以看官方文档:

:h omap-info