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

在正常模式下,我可以键入两次按字母顺序yi<yi(。抽头之一将是空的,而另一将匹配所需的内容。最终结果是无论内容位于()还是<>中,都匹配它们。

现在,如果我将相同的序列放在映射中,则似乎在第一个yank失败时会中止,因此它仅与<...>表达式的内部内容匹配(因为在我的示例中,yi<是第一个探测的yank)。

相反,如果放置:normal yi<<CR>:normal yi(<CR>,则映射的工作方式与在正常模式下手动键入yi<yi(时的工作相同。而且:normal yi<yi(也失败。

在我看来,拉扯不匹配的文本对象总是以错误结束,并中止当前的映射或:normal执行。但是我找不到在vim文档中明确记录的行为。 E标志未包含在我的cpoptions中,尽管已声明它会影响y{motion}而不是y{object}

谁能澄清这种奇怪的行为?

最佳答案

请注意,当:normal包含在try...catch循环中或通过:silent!执行时,其语义会发生变化:如果没有,则在遇到错误时命令序列的执行将中止;该序列的其余部分将被丢弃(例如在宏中)。使用它,即使发生错误,所有命令也会执行。

当您连续手动键入这两个按钮时,实际上可以忽略该错误。



因此,您可以通过以下方式获得所需的行为

:silent! normal! yi<yi(


另类

另一种方法是先清除寄存器,进行第一次拉动,然后在寄存器仍为空的情况下仅执行第二次替代拉动。

08-20 01:24