Por que Y é sinônimo de yy em vez de y $?

28

Existe uma razão histórica específica para isso?


Plano de fundo - (você pode pular esta parte se já entender a pergunta.)

Como viusuários intermediários / avançados saberão, yé o comando "puxar" - puxa (copia) o texto especificado pelo seguinte comando de movimento. * Assim, yepuxa para o final da palavra, y0puxa da posição do cursor para o início da linha, y_puxa toda a linha atual, y$puxa da posição do cursor até o final da linha atual, etc.

O dcomando (delete) e o comando c(change) também podem ser usados ​​com todos esses movimentos.

ddé um sinônimo d_e exclui toda a linha atual. Da mesma forma, ccé sinônimo c_e alterará a linha atual (ou seja, excluirá todo o texto e o colocará no modo de inserção no início da linha). **

O comando "yank" segue esta convenção; yypuxará toda a linha atual exatamente como y_.

Há outro conjunto de sinônimos: Dé um sinônimo d$e será excluído da posição do cursor até o final da linha. Cé um sinônimo c$e mudará o texto da posição do cursor para o final da linha, colocando você no modo de inserção para digitar o novo texto.

No entanto, Yé outro sinônimo para yyor y_e puxará a linha inteira , não apenas do cursor até o final da linha, como seria de esperar dos padrões Ce D.


Entendo que no Vim foi mantido dessa maneira para preservar a compatibilidade com versões anteriores vi, conforme mencionado na ajuda do Vim em :help Y:

Se você deseja que "Y" trabalhe do cursor até o final da linha (que é mais lógico, mas não compatível com o Vi), use ": map Y y $".

Portanto, esta é uma ressaca de vi. Bem.

Mas, por que o comando foi projetado dessa maneira em primeiro lugar? Havia alguma lógica nisso alguma vez?


* Especificamente, coloca o texto no registro 0 e aponta o registro sem nome no registro 0.

** Embora não seja relevante para a minha pergunta, Sé outro sinônimo para ccor c_.

Curinga
fonte
3
Não sei por que foi feito assim. Você teria que perguntar a Bill Joy sobre isso. As chances são, no entanto, de um erro lógico, que nunca foi corrigido no vi original e, em seguida, transformou-o em todos os clones e, eventualmente, foi exigido pelo POSIX.
Christian Brabandt
3
Se você encontrar a resposta, eles também precisam dela aqui . ;)
joeytwiddle
1
Duvido que este seja o motivo real, mas a pessoa que se opôs a Y ser remapeado no vim-sensible argumentou que, como programador em C, eles usavam os puxões de fim de linha muito mais que os puxões de linha inteira e, portanto, o mapeamentos padrão são bons. YMMV: o meu certamente faz.
Rich

Respostas:

16

Encontrei um artigo "Uma Introdução à Edição de Display com Vi", de William Joy (vi criador) e Mark Horton (mantenedor do vi desde 1979).

Pelo artigo, fica claro que o comportamento Y padrão não é um erro, mas um recurso desejado. Na seção "Reorganizando e duplicando o texto", eles mencionam o seguinte:

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.

Posteriormente na lista de comandos (consulte o apêndice na versão pdf ), a descrição para Y é esta:

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.

Dessa forma, tenho certeza de que Y era um recurso e não um bug.

Quanto à inconsistência com De C- também tenho uma explicação lógica. Se você tentar pensar como um autor de editor de texto, seu principal desejo seria criar um novo texto e não excluí-lo. Eles (autores do editor de texto) querem que seus usuários escrevam mais texto e mais e mais ...

Portanto, para os comandos sugar sintáticos (e Y, De Csão um tipo de açúcar sintático porque duplicam recursos já existentes), eles escolhem as operações que adicionam o máximo de texto possível ( Yduplicam toda a linha) ou excluem o menor número possível de texto ( De Cexcluem até o fim da linha e não a linha inteira).

Boris Serebrov
fonte
Ok, eu gosto YP; que é rápido e fácil de digitar. Estou convencido. ;)
Caractere curinga
8

Yfoi o comando yank da primeira versão vi (ex-1.1, 1 de janeiro de 1978). Esta versão não possui o yycomando cammand. ex-2.2 (6 de maio de 1979) tinha ambos yye Y. Então, na verdade, yyé um sinônimo para Y( Yanterior yy).

user3224237
fonte
Esta é a verdadeira resposta. Ynão segue a mesma lógica que os outros comandos, porque antecede o que mais tarde foi reconsiderado como abreviação.
mechalynx 15/09