Почему Y является синонимом yy вместо y $?

28

Есть ли конкретная историческая причина для этого?


Фон - (вы можете пропустить эту часть, если вы уже поняли вопрос.)

Как известно опытным / опытным viпользователям, yэто команда «yank» - она ​​восстанавливает (копирует) текст, заданный следующей командой перемещения. * Таким образом, 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_.

Wildcard
источник
3
Я не уверен, почему это было сделано так. Вы должны спросить об этом Билла Джоя. Однако есть вероятность, что это логическая ошибка, которая никогда не была исправлена ​​в оригинальном vi, а затем попала во все клоны и поэтому была востребована POSIX.
Кристиан Брабандт
3
Если вы когда-нибудь найдете ответ, он также нужен здесь . ;)
joeytwiddle
1
Я сомневаюсь, что это фактическая причина, но человек, который возражал против переназначения Y в vim-sensible, утверждал, что, будучи программистом на C, они использовали в конце строки гораздо больше, чем в целой строке, и поэтому сопоставления по умолчанию хороши. YMMV: мой, конечно, делает.
Богатый

Ответы:

16

Я нашел статью «Введение в редактирование экрана с помощью Vi» Уильяма Джоя (создатель vi) и Марка Хортона (сопровождающий vi с 1979 года).

Из статьи ясно, что поведение 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удаляют до конец строки, а не вся строка).

Борис Серебров
источник
Хорошо, мне нравится YP; это быстро и легко набрать. Я убеждена. ;)
Wildcard
8

Yбыл командой yank первой версии vi (ex-1.1, 1 января 1978). Эта версия не имела yyCammand. бывший 2.2 (6 мая 1979 г.) имел и то yyи другое Y. Так что на самом деле yyэто синоним Y( Yпредшествует yy).

user3224237
источник
Это настоящий ответ. Yне следует той же логике, что и другие команды, потому что она предшествует тому, что позже было переименовано в аббревиатуру.
mechalynx