为什么Y是yy而不是y $的同义词?


28

是否有特定的历史原因?


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

作为中级/高级vi用户会知道,y是在“抽出”命令它猛拉(份)由下面的移动命令指定的文本。*因此ye猛拉到字的结束时,y0从光标位置猛拉到行的开始,y_拖动整个当前行,y$从光标位置拖动到当前行的末尾,依此类推。

d(删除)命令和c(变化)命令都可以与所有这些运动的被使用。

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

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

还有另一组同义词:D是的同义词,d$将从光标位置到行尾将其删除。 C是的同义词c$,它将文本从光标位置更改到行尾,使您进入插入模式以键入新文本。

但是,Y是或的另一个同义词,它将使yyy_(而不是象从Cand D模式中所期望的那样)从光标移至行的结尾。


我了解在Vim中一直保持这种方式来保持与向后的兼容性vi,如Vim帮助中所述:help Y

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

因此,这是来自的延期vi。精细。

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


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

**尽管这不是有关我的问题,S是另一个同义词ccc_


3
我不确定为什么会这样。您将不得不向Bill Joy询问。但是,这是一个逻辑错误,很可能从未在原始vi中得到修复,然后将其放入所有克隆中,因此最终被POSIX要求。
克里斯蒂安·布拉班德

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

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

Answers:


16

我找到了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-我也有一个合理的解释。如果您试图以文本编辑器的身份思考,那么您的主要愿望就是创建新文本而不是删除它。他们(文本编辑器作者)希望他们的用户写更多的文本,并且越来越多...

因此,对于语法糖命令(和YDC语法糖是一种,因为它们复制了现有功能),他们选择的操作是添加尽可能多的文本(Y重复整行)或删除尽可能少的文本(DC删除直到行的末尾而不是整行)。


好吧,我喜欢YP;快速简便地输入。我相信。;)
通配符

8

Y是第一个vi版本(1978年1月1日以前的1.1版)的猛禽命令。此版本没有yy卡门。ex-2.2(1979年5月6日)确实具有yyY。因此,实际上yyYYpredates yy)的同义词。


这是真正的答案。Y不遵循与其他命令相同的逻辑,因为它早于后来被重新定义为缩写的事物。
mechalynx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.