背景—(如果您已经理解了这个问题,则可以跳过此部分。)
作为中级/高级
vi
用户会知道,y
是“猛拉”命令,它猛拉(复制)以下移动命令指定的文本。*因此,ye
猛拉到单词的末尾,y0
猛拉从光标位置到行首y_
将整个当前行都拉动,将y$
从光标位置移至当前行的末尾,等等。d
(删除)命令和c
(更改)命令都可以与所有这些一起使用。 dd
是d_
的同义词,并删除整个当前行。同样,cc
是c_
的同义词,它将更改当前行(即它将删除所有文本,并在行的开头将您置于插入模式)。** “ yank”命令遵循此约定;
yy
将像y_
一样拉动整个当前行。还有另一组同义词:
D
是d$
的同义词,将从光标位置删除到该行的末尾。 C
是c$
的同义词,它将文本从光标位置更改为行尾,使您进入插入模式以键入新文本。Y
是yy
的另一个同义词y_
并会整行拖动,而不仅仅是像从C
和D
模式所期望的那样,从游标拖动到行尾。我知道在Vim中它被保留了这样可以保持与
vi
的向后兼容性,如Vim帮助下:help Y
所述:如果您希望“ Y”从光标到行尾(即更具逻辑性,但与Vi不兼容),请使用“:map Y y $”。
所以这是
vi
的保留。很好。但是,为什么命令最初是这样设计的?它有没有逻辑呢?
*具体来说,它将文本放置在寄存器0中,并将未命名的寄存器指向寄存器0。
**尽管它是与我的问题无关,
S
是cc
或c_
的另一个同义词。#1 楼
我发现了William Joy(vi的创建者)和Mark Horton(1979年以来为vi的维护者)撰写的论文“使用Vi进行显示编辑入门”。从该论文中可以明显看出,默认的Y行为是不是错误,而是所需的功能。
在“重新排列和复制文本”部分中,他们提到了以下内容:
Try the command YP. This makes a copy of the current line
and leaves you on this copy, which is placed before the current line.
The command Y is a convenient abbreviation for yy.
The command Yp will also make a copy of the current line,
and place it after the current line.
You can give Y a count of lines to yank, and thus duplicate
several lines try 3YP.
稍后在命令列表中(请参阅pdf版本的附录),Y的描述是这样的:
Y Yanks a copy of the current line into the unnamed buffer,
to be put back by a later p or P; a very useful synonym for yy.
这样,我可以确定Y是一个功能而不是一个错误。
对于与
D
和C
不一致的地方-我也有一个合理的解释。如果您尝试以文本编辑器的身份思考,那么您的主要愿望就是创建新文本,而不是删除它。
他们(文本编辑器作者)希望他们的用户写越来越多的文本......
因此对于语法糖命令(而
Y
,D
和C
是一种语法糖)因为它们复制了已有的功能),所以他们选择添加尽可能多的文本的操作(Y
复制整个行)或删除尽可能少的文本(D
和C
删除直到行尾而不是整个行)。 br />评论
好吧,我喜欢YP;快速简便地输入。我相信。 ;)
–通配符
16年1月27日在20:14
由于“他们(文本编辑作者)希望他们的用户写越来越多的文本)而被否决是毫无根据的。删除文本与创建文本一样,是文本编辑的一部分。下面的帖子有一个更合理的解释。
–凯文
20-3-27在1:59
@Kevin实际上这应该是个玩笑(也许不是一个好玩的话),而不是一个声明。这个想法是,vi的作者认为整个行的复制操作更有用,而且应该使用Y快捷键(也许我很想直到行的结尾不是我个人经常做的事情)。
– Boris Serebrov
20 Mar 27 '20 at 12:22
#2 楼
Y
是第一个vi版本(1978年1月1日以前的1.1版)的猛击命令。该版本没有yy
cammand。 ex-2.2(1979年5月6日)确实同时具有yy
和Y
。所以实际上yy
是Y
的同义词(Y
早于yy
)。评论
这是真正的答案。 Y不会遵循与其他命令相同的逻辑,因为Y早于它后来被重新定义为缩写的事物。
–mechalynx
19-09-15在21:18
评论
我不确定为什么会这样。您将不得不询问比尔·乔伊。但是,这是一个逻辑错误,很可能从未在原始vi中得到修复,然后将其放入所有克隆中,因此最终被POSIX要求。如果您找到答案,他们在这里也需要它。 ;)
我怀疑这是真正的原因,但反对Y的人在vim明智的方法中提出异议,他认为,作为C程序员,他们习惯于行尾拉动比起全行拉动要多得多,因此默认映射是好的。 YMMV:我的确实如此。