Pourquoi Y est-il synonyme de yy au lieu de y $?

28

Y a-t-il une raison historique spécifique à cela?


Contexte - (vous pouvez ignorer cette partie si vous comprenez déjà la question.)

Comme intermédiaire / avancé viutilisateurs savent, yest la commande il Yanks « Yank » (copies) le texte spécifié par la commande de mouvement suivant. Ainsi yeyanks à la fin du mot, y0yanks de la position du curseur au début de la ligne, y_tire sur toute la ligne actuelle, y$tire de la position du curseur à la fin de la ligne actuelle, etc.

La dcommande (supprimer) et la commande c(modifier) ​​peuvent également être utilisées avec toutes ces requêtes.

ddest synonyme d_et supprime l'intégralité de la ligne actuelle. De même, ccest synonyme de c_et changera la ligne actuelle (c'est-à-dire qu'il supprimera tout le texte et vous mettra en mode insertion au début de la ligne). **

La commande "yank" suit cette convention; yytirera la ligne actuelle entière comme y_.

Il existe un autre ensemble de synonymes: Dest un synonyme de d$et sera supprimé de la position du curseur jusqu'à la fin de la ligne. Cest synonyme de c$et changera le texte de la position du curseur à la fin de la ligne, vous plaçant en mode insertion pour taper le nouveau texte.

Cependant, Yest un autre synonyme de yyou y_et tirera sur toute la ligne , pas seulement du curseur jusqu'à la fin de la ligne, comme vous pouvez vous y attendre des modèles Cet D.


Je comprends que dans Vim, il a été conservé de cette façon pour préserver la compatibilité descendante avec vi, comme cela est mentionné dans l'aide de Vim sous :help Y:

Si vous aimez que "Y" fonctionne du curseur à la fin de la ligne (ce qui est plus logique, mais pas compatible avec Vi), utilisez ": map Y y $".

Il s'agit donc d'un reliquat de vi. Bien.

Mais pourquoi le commandement a-t-il été conçu de cette façon en premier lieu? Y avait-il jamais une logique?


* Plus précisément, il place le texte dans le registre 0 et pointe le registre sans nom sur le registre 0.

** Bien que cela ne soit pas pertinent pour ma question, Sest un autre synonyme de ccou c_.

Caractère générique
la source
3
Je ne sais pas pourquoi il a été fait comme ça. Il faudrait demander à Bill Joy à ce sujet. Il y a cependant des chances, c'est un bug logique, qui n'a tout simplement jamais été corrigé dans le vi d'origine et ensuite intégré dans tous les clones et a donc été finalement demandé par POSIX.
Christian Brabandt
3
Si jamais vous trouvez la réponse, ils en ont également besoin ici . ;)
joeytwiddle
1
Je doute que ce soit la vraie raison, mais la personne qui s'est opposée à ce que Y soit remappé dans vim-sensible a fait valoir qu'en tant que programmeur C, elle utilisait le coup sec de fin de ligne beaucoup plus que le coup sec de ligne entière, et donc le les mappages par défaut sont bons. YMMV: le mien le fait certainement.
Rich

Réponses:

16

J'ai trouvé un article "An Introduction to Display Editing with Vi" de William Joy (créateur vi) et Mark Horton (mainteneur vi depuis 1979).

D'après le document, il est clair que le comportement Y par défaut n'est pas une erreur, mais une fonctionnalité souhaitée. Dans la section "Réorganisation et duplication du texte", ils mentionnent ceci:

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.

Plus loin dans la liste des commandes (voir l' annexe dans la version pdf ), la description de Y est la suivante:

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.

De cette façon, je suis sûr que Y était une fonctionnalité et non un bug.

Quant à l'incohérence avec Det C- j'ai aussi une explication logique. Si vous essayez de penser en tant qu'éditeur d'éditeur de texte, votre principal désir serait de créer un nouveau texte et non de le supprimer. Ils (auteurs de l'éditeur de texte) veulent que leurs utilisateurs écrivent de plus en plus de texte ...

Donc, pour les commandes de sucre syntaxique (et Y, Det Csont une sorte de sucre syntaxique car elles dupliquent des fonctionnalités déjà existantes), elles choisissent les opérations qui ajoutent le plus de texte possible ( Yduplique toute la ligne) ou suppriment le moins de texte possible ( Det Csuppriment jusqu'à la fin de la ligne et non toute la ligne).

Boris Serebrov
la source
D'accord, j'aime YP; qui est rapide et facile à taper. Je suis convaincu. ;)
Wildcard
8

Yétait la commande yank de la première version vi (ex-1.1, 1er janvier 1978). Cette version n'avait pas le yycammand. ex-2.2 (6 mai 1979) avait les deux yyet Y. Il s'agit donc en yyfait d'un synonyme de Y( Yprédate yy).

user3224237
la source
Telle est la vraie réponse. Yne suit pas la même logique que les autres commandes car elle est antérieure à la chose pour laquelle elle a été reconnectée par la suite comme abréviation.
Mechalynx