Is there a specific historical reason for this?
Background — (you can skip this part if you already understand the question.)
As intermediate/advanced vi
users will know, y
is the "yank" command—it yanks (copies) the text specified by the following movement command.* Thus ye
yanks to the end of the word, y0
yanks from cursor position to the beginning of the line, y_
yanks the entire current line, y$
yanks from cursor position to the end of the current line, etc.
The d
(delete) command and the c
(change) command can both be used with all of these motions as well.
dd
is a synonym for d_
and deletes the entire current line. Likewise, cc
is a synonym for c_
and will change the current line (i.e. it will delete all the text and put you in insert mode at the beginning of the line).**
The "yank" command follows this convention; yy
will yank the entire current line just like y_
.
There is another set of synonyms: D
is a synonym for d$
and will delete from the cursor position to the end of the line. C
is a synonym for c$
and will change the text from the cursor position to the end of the line, placing you in insert mode to type the new text.
However, Y
is another synonym for yy
or y_
and will yank the entire line, not just from the cursor to the end of the line as you would expect from the C
and D
patterns.
I understand that in Vim it was kept this way to preserve backward compatibility with vi
, as is mentioned in the Vim help under :help Y
:
If you like "Y" to work from the cursor to the end of line (which is more logical, but not Vi-compatible) use ":map Y y$".
So this is a holdover from vi
. Fine.
But, why was the command designed that way in the first place? Was there any logic to it ever?
*Specifically it places the text in register 0 and points the unnamed register at register 0.
**Although it's not relevant to my question, S
is another synonym for cc
or c_
.