命令 y3s 在 Vim 中以普通模式复制三行

the command y3s to copy three lines in Normal Mode in Vim

根据 Vim 的动词、名词和修饰语逻辑,命令 y3s 应该复制三个句子,但在我的 Vim 版本中它不会这样做.我想知道是否有它的原因。网上查了一下,好像还有其他方法可以复制一定数量的句子,但是我很好奇为什么这种方法不起作用。谢谢!

如果你想复制 3 行,你应该做 y3y,而不是 y3sy 代表 Yank 或复制。

更新,

@Amadan 的回答有更多解释以及为什么 y3y 有效。

Simpley 3Y 会做,其中 Y 会抽出一行,3 会重复 3 次。在Vim中没有句子,只有行、词和字符。

这里有几个误解。首先,motionstext objects.

是有区别的

动作(:help navigation)是改变光标位置的命令:l向右,j向下,)向前句, 2Fx 后退到同一行中的上一个 x/foo/e+2<CR> 前进到下一个 foo 结束后的 2 个字符,w 下一个单词的开始。其参数为动作的命令对从当前位置到新动作指定位置的文本范围进行操作。 dw 因此从当前位置删除到下一个单词的开头。

文本对象(:help text-objects)指定文本的语义单元;它通常由两个按键组成,第一个是 i(内部,内部)或 a(a,an,周围)。 i" 在双引号内,a( 在括号内,is 内在句子(即没有 space 围绕它),2aw 一个单词两次。因此daw删除这个词周围(包括space),或者更简单,删除一个词。

区别很明显:如果你在一个词的中间,例如Some peng|uins fly| 代表光标),dw 给你 Some peng|fly(从光标删除到下一个单词的开头),而 daw 给你 Some |fly(删除整个单词 penguins,以及下一个 space,因为 "around" 修饰符)。 diw会给你Some | fly(不包括把space删进去)。

如您所见,"sentence" 在文本运动(( 句子向后,) 句子向前)和文本对象(is 内部一句话,as一个句子)。同时,( 作为文本对象,相当于 )b,是括号内或周围的所有内容;并且 s 因为默认情况下不存在文本动作。

因此,y2s 不是已知映射,因为您是通过 motion 删除(没有 ia),并且没有议案s;它不会做任何事情。

您可以使用 y2),这将拉出大约一个半句(即从光标到下一个句子的开头);或者您可以使用 y2as 来拉出当前句子和下一个句子,并在其后添加 space;或 y2is 除了最后一个 space;但你不能使用 y2s。 (您也可以将所有这些写成 2y)2yas2yis。)

y2y(或等效的2yy)中,第二个y是运算符的重复。在Vim中几乎是一个规则,等于操作符的动作是一条线:yy拉出一条线,dd删除一条线,gqgq(或gqq) 重新格式化一行,==过滤一行,gugu(或guu)大写一行等。原因很简单:行是我们最常操作的,并且很难做出比按两次相同的键更快的咒语。因此,第二个 y 本身没有意义:它表示第一个 y 正在处理行(因此 y2y2yy 抽出两行)。

整个 :help motion.txt 页面非常有用,我衷心推荐它。