根据Vim的动词,名词和修饰语的逻辑,命令y3s
应该可以复制三个句子,但是在我的Vim版本中,它不是这样做的。我想知道是否有原因。在线查找似乎还有其他方法可以复制特定数量的句子,但是我很好奇为什么这种方法行不通。谢谢!
答案 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}}一句话)。同时,)
作为文本对象,等效于is
和as
,是括号内或括号内的所有内容;和(
作为文本运动默认情况下不存在。
因此,)
不是已知的映射,因为您是通过 motion (没有b
或s
)删除的,并且没有运动{ {1}};它什么也不会做。
您可以使用y2s
,它将拉动一个句子左右一半(即从光标到下一个第二个句子的开头);或者,您可以使用i
拉动当前句子,下一个句子及其后的空格;或a
表示相同,除非没有最后一个空格;但您不能使用s
。 (您也可以将所有这些都写为y2)
,y2as
,y2is
。)
在y2s
(或等效为2y)
)中,第二个2yas
是运算符的重复项。在Vim中,几乎等于操作符的运动是一条线:2yis
抽出一条线,y2y
删除一条线,2yy
(或y
)重新格式化行,yy
过滤行,dd
(或gqgq
)将行大写,等等。原因很简单:行是我们最常操作的行,很难咒语的速度要快于两次按相同键的速度。因此,第二个gqq
本身没有意义:它表示第一个==
在行上工作(因此gugu
或guu
抽出两行)。 / p>
整个y
页是非常有用的阅读,我衷心推荐。
答案 1 :(得分:1)
如果要复制3行,应执行y3y
,而不是y3s
。 y
代表Yank或copy。
更新
@Amadan的答案有更多解释,也解释了y3y
起作用的原因。
答案 2 :(得分:-1)
简单的3Y
就可以了,其中Y
可以拖行,而3
可以重复3次。在Vim中,没有句子,只有行,词和字符。