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

QPT*_*PTR 2 vi vim

根据Vim的Verb,Noun和Modifier逻辑,命令y3s应该可以复制三个句子,但在我的Vim版本中,它并没有这样做.我想知道是否有理由.在线查看似乎还有其他方法来复制特定数量的句子,但我很好奇为什么这种方法不起作用.谢谢!

Ama*_*dan 5

这里有几个误解.首先,运动文本对象之间存在差异.

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

text object(:help text-objects)指定文本的语义单位; 它通常由两个按键组成,第一个是i(内部,内部)或a(a,an,around).i"双引号内,a(括号内,is内句(即周围没有空格),2aw两个单词.因此daw删除这个单词(包括空格),或更简单,删除一个单词.

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

正如您将注意到的,"句子"在文本运动((向后的)句子,向前的句子)和文本对象(is内部句子,as句子)中具有不同的映射.同时,(作为一个文本对象,)b括号内部或周围的所有内容等同起来; 并且s默认情况下不存在文本动作.

因此,y2s不是已知的映射,因为您通过运动删除(否ia),并且没有运动s; 它什么都不做.

你可以使用y2),它会围绕一个句子一半(即从光标到下一个句子的开头); 或者你可以使用y2as当前句子和下一句话以及后面的空格; 或者y2is除了没有最后一个空间之外; 但你不能使用y2s.(你也可以将所有这些写成2y),, 2yas)2yis.

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

整个:help motion.txt页面是一个非常有用的阅读,我衷心推荐它.