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

时间:2018-12-27 17:50:21

标签: vim vi

根据Vim的动词,名词和修饰语的逻辑,命令y3s应该可以复制三个句子,但是在我的Vim版本中,它不是这样做的。我想知道是否有原因。在线查找似乎还有其他方法可以复制特定数量的句子,但是我很好奇为什么这种方法行不通。谢谢!

3 个答案:

答案 0 :(得分:5)

这里有几个误解。首先,动作文本对象之间是有区别的。

运动(:help navigation)是用于更改光标位置的命令:l代表右,j代表下,)代表句子向前,{{ 1}}在同一行中后退到上一个2Fx,在下一个x的末尾,/foo/e+2<CR>下一个字的开始后,foo向前2个字符。参数为运动的命令在文本范围内操作,从当前位置到新的运动指定位置。 w因此从当前位置删除到下一个单词的开头。

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

区别很明显:如果您在一个单词的中间,例如daw(其中Some peng|uins fly代表光标),|给您dw(从光标删除到下一个单词的开头),而Some peng|fly给您{ {1}}(由于使用“ around”修饰符,将删除整个单词daw,以及下一个空格)。 Some |fly会给您penguins(不包括删除项中的空格)。

您会注意到,“句子”在文本运动(向后diw,向前Some | fly个句子和文本对象((内部句子{{ 1}}一句话)。同时,)作为文本对象,等效于isas,是括号内或括号内的所有内容;和(作为文本运动默认情况下不存在。

因此,)不是已知的映射,因为您是通过 motion (没有bs)删除的,并且没有运动{ {1}};它什么也不会做。

您可以使用y2s,它将拉动一个句子左右一半(即从光标到下一个第二个句子的开头);或者,您可以使用i拉动当前句子,下一个句子及其后的空格;或a表示相同,除非没有最后一个空格;但您不能使用s。 (您也可以将所有这些都写为y2)y2asy2is。)

y2s(或等效为2y))中,第二个2yas是运算符的重复项。在Vim中,几乎等于操作符的运动是一条线:2yis抽出一条线,y2y删除一条线,2yy(或y)重新格式化行,yy过滤行,dd(或gqgq)将行大写,等等。原因很简单:行是我们最常操作的行,很难咒语的速度要快于两次按相同键的速度。因此,第二个gqq本身没有意义:它表示第一个==在行上工作(因此guguguu抽出两行)。 / p>

整个y页是非常有用的阅读,我衷心推荐。

答案 1 :(得分:1)

如果要复制3行,应执行y3y,而不是y3sy代表Yank或copy。

更新

@Amadan的答案有更多解释,也解释了y3y起作用的原因。

答案 2 :(得分:-1)

简单的3Y就可以了,其中Y可以拖行,而3可以重复3次。在Vim中,没有句子,只有行,词和字符。