文本对象的序列在vim映射中猛拉

时间:2014-01-28 20:09:19

标签: vim

我想在映射中抽取<...> (...)表达式的内部内容。

在正常模式下,我可以输入双向序列yi<yi(。其中一个将是空的,另一个将匹配所需的内容。净效果是匹配内容,无论它们位于()<>内。

现在,如果我在地图中放置相同的序列,它似乎在第一个yank失败时中止,因此它只匹配<...>表达式的内部内容(因为在我的示例中yi<是第一个探测下来。)

相反,如果我放:normal yi<<CR>:normal yi(<CR>,映射的工作方式与我在正常模式下手动输入yi<yi(的方式相同。此外:normal yi<yi(也失败了。

在我看来,yanking一个不匹配的文本对象总是以错误结束并中止当前映射或:normal执行。但我无法在vim文档中明确记录该行为。我E中未包含cpoptions标记,但声明它会影响y{motion}而非y{object}

任何人都可以澄清这种奇怪的行为吗?

1 个答案:

答案 0 :(得分:2)

注意:normal的语义在try...catch循环中包含或通过:silent!执行时会发生更改:如果没有它,执行命令序列会在遇到错误时中止;丢弃序列的其余部分(如在宏中)。有了它,即使发生错误,所有命令都会执行。

当您手动输入这两个猛拉时,您实际上忽略了错误。

溶液

因此,您可以使用

获得所需的行为
:silent! normal! yi<yi(

替代

另一种方法是首先清除寄存器,执行第一次扫描,如果寄存器仍为空,则只执行第二次替代扫描。