我想提取 <...>
的内部内容或 (...)
映射中的表达式。
在正常模式下,我可以输入两次 yank 序列 yi<yi(
.其中一个 yank 将是空的,另一个将匹配所需的内容。最终效果是匹配内容,无论它们在里面 ()
或 <>
.
现在,如果我将相同的序列放在 map 中,它似乎会在第一次 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!
执行时会发生变化>:没有它,命令序列的执行在遇到错误时中止;序列的其余部分被丢弃(就像在宏中一样)。有了它,所有命令都会执行,即使发生错误也是如此。
当您连续手动键入这两个 yank 时,您实际上忽略了错误。
解决方案
因此,您可以获得所需的行为
:silent! normal! yi<yi(
备选
另一种方法是先清除寄存器,进行第一次抽取,如果寄存器仍然为空,则只执行第二次替代抽取。
关于vim - vim 映射中的文本对象序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21415758/