我想在映射中提取<...>
或(...)
表达式的内部内容。
在正常模式下,我可以键入两次按字母顺序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(
另类
另一种方法是先清除寄存器,进行第一次拉动,然后在寄存器仍为空的情况下仅执行第二次替代拉动。