有特定的历史原因吗?


背景—(如果您已经理解了这个问题,则可以跳过此部分。)

作为中级/高级vi用户会知道,y是“猛拉”命令,它猛拉(复制)以下移动命令指定的文本。*因此,ye猛拉到单词的末尾,y0猛拉从光标位置到行首y_将整个当前行都拉动,将y$从光标位置移至当前行的末尾,等等。

d(删除)命令和c(更改)命令都可以与所有这些一起使用。

ddd_的同义词,并删除整个当前行。同样,ccc_的同义词,它将更改当前行(即它将删除所有文本,并在行的开头将您置于插入模式)。**

“ yank”命令遵循此约定; yy将像y_一样拉动整个当前行。

还有另一组同义词:Dd$的同义词,将从光标位置删除到该行的末尾。 Cc$的同义词,它将文本从光标位置更改为行尾,使您进入插入模式以键入新文本。

Yyy的另一个同义词y_并会整行拖动,而不仅仅是像从CD模式所期望的那样,从游标拖动到行尾。


我知道在Vim中它被保留了这样可以保持与vi的向后兼容性,如Vim帮助下:help Y所述:


如果您希望“ Y”从光标到行尾(即更具逻辑性,但与Vi不兼容),请使用“:map Y y $”。


所以这是vi的保留。很好。

但是,为什么命令最初是这样设计的?它有没有逻辑呢?


*具体来说,它将文本放置在寄存器0中,并将未命名的寄存器指向寄存器0。

**尽管它是与我的问题无关,Sccc_的另一个同义词。

评论

我不确定为什么会这样。您将不得不询问比尔·乔伊。但是,这是一个逻辑错误,很可能从未在原始vi中得到修复,然后将其放入所有克隆中,因此最终被POSIX要求。

如果您找到答案,他们在这里也需要它。 ;)

我怀疑这是真正的原因,但反对Y的人在vim明智的方法中提出异议,他认为,作为C程序员,他们习惯于行尾拉动比起全行拉动要多得多,因此默认映射是好的。 YMMV:我的确实如此。

#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是一个功能而不是一个错误。

对于与DC不一致的地方-我也有一个合理的解释。
如果您尝试以文本编辑器的身份思考,那么您的主要愿望就是创建新文本,而不是删除它。
他们(文本编辑器作者)希望他们的用户写越来越多的文本......

因此对于语法糖命令(而YDC是一种语法糖)因为它们复制了已有的功能),所以他们选择添加尽可能多的文本的操作(Y复制整个行)或删除尽可能少的文本(DC删除直到行尾而不是整个行)。 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日)确实同时具有yyY。所以实际上yyY的同义词(Y早于yy)。

评论


这是真正的答案。 Y不会遵循与其他命令相同的逻辑,因为Y早于它后来被重新定义为缩写的事物。

–mechalynx
19-09-15在21:18