vim - vim 映射中的文本对象序列

标签 vim

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

在正常模式下,我可以输入两次 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/

相关文章:

macos - 将终端命令输出直接打印到 vim - macOS

ruby-on-rails - 在新窗口中打开 rails.vim 相关文件

python - 是否有 Django 的 rails.vim 等价物?

vim - YouCompleteMe和Syntastic的兼容性?

regex - 是否可以在 Vim 中通过正则表达式替换有条件地插入文本?

vim - 通过病原体生成不同位置的标签

linux - 替换 Linux 中文件的内容

vim - 如何在 vimscript 中获取 'password' 之类的输入?

php - PHP 的 Vim 折叠

vim - Vim:如何将可视 block 拖到寄存器?