Чому Y є синонімом yy замість y $?


28

Чи є для цього конкретна історична причина?


Передумови - (ви можете пропустити цю частину, якщо вже розумієте питання.)

Як проміжні / просунуті viкористувачі будуть знати, yє команда-це «смикати» смикає (копію) текст , заданий з допомогою наступної команди руху. * Таким чином , yeсмикає до кінця слова, y0смикає від позиції курсора до початку рядка, y_янки весь поточний рядок, y$янки від положення курсору до кінця поточного рядка тощо.

Команда d(delete) та команда c(change) можуть використовуватися і з усіма цими рухами.

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_.


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 (колишня 1.1, 1 січня 1978 р.). У цій версії не було yyкомунікації. ex-2.2 (6 травня 1979 р.) мав і те, yyі Y. Так насправді yyє синонімом Y( Yпопередніх yy).


Це справжня відповідь. Yне дотримується тієї самої логіки, що й інші команди, тому що вона передує тому, що згодом було відтворено як абревіатуру.
mechalynx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.