在vim中如何在两个不同的符号之间进行yank操作?

4

假设我有:

"foo === BAR.BAZ"

如果我的光标在我想要复制的字符串(比如本例中的 'R')的中间位置,并且我想要复制 BAR.BAZ,有什么简单的方法可以做到这一点吗?
使用 yiw 无法达到预期效果,因为它会在遇到 . 符号时停止。我需要在 <space>" 之间进行复制。
这只是一个例子。我知道有一些方法可以使 vim 在遇到句点分隔的单词时进行复制,但我正在寻找更通用的解决方案,以处理涉及更复杂符号的情况。
例如:"yank between <first_occurrence_of_left_symbol> <first_occurrence_of_right_symbol>" 对于以上示例,应该使用以下命令: yb<space>"

我能看到这个如何工作的基本原理:标记当前位置,F<left symbol>,标记当前位置,返回第一个标记,f<right symbol>,y`<second mark>,清除标记。你需要将其封装在一个函数或其他可以等待两个符号输入然后运行的东西中。这是我经验较少的部分。 - Wolf
2
为什么不直接使用内置的文本对象?在这种情况下,yiW可以满足您的需求,对于其他情况,还有其他文本对象可供选择。 - Dhruva Sagar
1个回答

5
您可以像这样定义自己的文本对象:

您可以定义自己的文本对象,如下所示:

onoremap I :exec 'norm vT'.nr2char(getchar()).'ot'.nr2char(getchar())<cr>

然后,为了完成你的示例,你需要输入:
yI<space>"

我想到的助记符是“ (d)elete (I)nbetween <char 1>, <char 2>”,幸运的是,I不能作为运算符的参数使用,因此不会覆盖任何内容。当然,如果选择其他键更直观,也可以自由选择。
这样做的方便之处在于将其作为onoremap映射,这使您能够在该文本上使用任何运算符。所以dcguy等都可以正常工作。
顺便说一句,您还可以添加一个映射来处理两个字符around,这是一个微不足道的修改:
onoremap A :exec 'norm vF'.nr2char(getchar()).'of'.nr2char(getchar())<cr>

我非常喜欢这个答案,但它有一个问题:如果在光标和左端之间出现<char 2>,它就会被欺骗。例如,在字符串BARZ.BAZ中,如果光标位于第二个B上,并且您输入yIBZ,那么您将复制AR而不是ARZ.BA - Wolf
@Wolf 很好的建议!我已经编辑了我的回答,那个版本更好吗? - DJMcMayhem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接