Có một lý do lịch sử cụ thể cho việc này?
Bối cảnh - (bạn có thể bỏ qua phần này nếu bạn đã hiểu câu hỏi.)
Như vi
người dùng trung cấp / nâng cao sẽ biết, y
là lệnh "yank", nó có thể tạo ra (bản sao) văn bản được chỉ định bởi lệnh di chuyển sau. * Do đó, ye
kéo dài đến cuối từ, kéo y0
từ vị trí con trỏ đến đầu dòng, y_
kéo toàn bộ dòng hiện tại, kéo y$
từ vị trí con trỏ đến cuối dòng hiện tại, v.v.
Lệnh d
(xóa) và lệnh c
(thay đổi) đều có thể được sử dụng với tất cả các chuyển động này.
dd
là một từ đồng nghĩa cho d_
và xóa toàn bộ dòng hiện tại. Tương tự, cc
là một từ đồng nghĩa cho c_
và sẽ thay đổi dòng hiện tại (nghĩa là nó sẽ xóa tất cả văn bản và đưa bạn vào chế độ chèn ở đầu dòng). **
Lệnh "yank" tuân theo quy ước này; yy
sẽ kéo toàn bộ dòng hiện tại giống như y_
.
Có một bộ từ đồng nghĩa khác: D
là từ đồng nghĩa cho d$
và sẽ xóa từ vị trí con trỏ đến cuối dòng. C
là một từ đồng nghĩa cho c$
và sẽ thay đổi văn bản từ vị trí con trỏ đến cuối dòng, đặt bạn vào chế độ chèn để nhập văn bản mới.
Tuy nhiên, Y
là một từ đồng nghĩa khác cho yy
hoặc y_
sẽ kéo dài toàn bộ dòng , không chỉ từ con trỏ đến cuối dòng như bạn mong đợi từ các mẫu C
và D
.
Tôi hiểu rằng trong Vim, nó được giữ theo cách này để duy trì khả năng tương thích ngược với vi
, như được đề cập trong phần trợ giúp của Vim dưới :help Y
đây:
Nếu bạn thích "Y" để làm việc từ con trỏ đến cuối dòng (hợp lý hơn, nhưng không tương thích với Vi), hãy sử dụng ": map Y y $".
Vì vậy, đây là một nắm giữ từ vi
. Khỏe.
Nhưng, tại sao lệnh lại được thiết kế theo cách đó ngay từ đầu? Có logic nào cho nó bao giờ không?
* Cụ thể nó đặt văn bản trong thanh ghi 0 và trỏ thanh ghi không tên vào thanh ghi 0.
** Mặc dù nó không liên quan đến câu hỏi của tôi, S
là một từ đồng nghĩa khác cho cc
hoặc c_
.