Qual é a diferença entre j, CTRL-J, <NL> e CTRL-N no modo normal?

12

Vi em algum lugar na web alguém usando Ctrl-Je, como não conhecia esse mapeamento, procurei no documento relevante e encontrei o seguinte:

j           or
<Down>      or
CTRL-J      or
<NL>        or
CTRL-N          [count] lines downward linewise.

O que me leva a várias perguntas:

  • O que é<NL> : eu o veria como equivalente, <CR>já que pressionar Enterpressionará uma linha no modo normal por padrão, mas por que está <NL>aqui e não <CR>?
  • Qual é a diferença entre esses mapeamentos : todas essas 5 opções ficam uma linha abaixo da mesma maneira? De acordo com meus testes, eu responderia que sim, mas isso levaria à minha próxima pergunta.
  • Por que existem 5 mapeamentos para fazer exatamente a mesma coisa : eu posso entender isso je <down>são mantidos para usuários que não estão acostumados a vim mapeamentos, mas por que os outros mapeamentos existem?
  • Quando é mais interessante usar um a mais que o outro : Essa é uma continuação da pergunta anterior: se existem tantas possibilidades, acho que elas têm vantagens diferentes ou são melhores para uso em casos de uso específicos. Quais são esses casos de uso?

Acho que a redundância destes comandos ainda mais estranho quando eu olhar para :h k: existem apenas 3 maneiras de ir para cima: k, <UP>e ctrl-p. Portanto, a questão do bônus é: Por que existem 5 maneiras de descer e apenas 3 para subir?

statox
fonte
Tem certeza de que eles estavam usando a Ctrl-Jligação padrão ? Parece ser comum, pelo menos entre os que conheço, mapear Ctrl-J/Kpara "descer / subir até a próxima linha com o mesmo nível de indentação da linha de partida".
Aaron Dufour
4
Gostaria de responder a "Por que existem 5 maneiras de descer e apenas 3 para subir?" Bem - é porque, na vida, as coisas vão para o sul muito mais fácil! :)
VanLaser
@ VanLaser realmente ótima resposta, eles devem considerar adicionar essa dica no documento! ;-)
statox
@VanLaser Pena que não é. Nesse ritmo, toda a humanidade cairá no nada em pouco tempo!
Xj6
"Abandone a esperança, todos que <CR>aqui estão"
VanLaser 15/08/15

Respostas:

15

Interessante que você mencionou <CR>. <CR>ou retorno de carro, tecnicamente usado para significar ir para o início da linha . <NL>, ou nova linha, também conhecida como feed de linha (geralmente chamada LF), foi usada para significar ir para a próxima linha . Com o tempo, a distinção foi perdida na maioria dos aplicativos. 1 Pressionar Enterrealmente produz um retorno de carro, geralmente (tente pressionar CtrlVEnter- você deve ver ^Mnos terminais Unix). <NL>O código de controle é CtrlJ.

CtrlNme surpreendeu. De acordo com 2 , é um caractere de mudança de posição :man ascii

Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
────────────────────────────────────────────────────────────────────────
016   14    0E    SO  (shift out)             116   78    4E    N

A mudança de e mudança fora caracteres, de acordo com a Wikipedia :

... forneceu uma maneira de mudar, daí a nomenclatura, uma fita colorida, dividida longitudinalmente geralmente com vermelho e preto, para cima e para baixo para a outra cor em uma máquina de escrever ou teleprinter eletromecânica ...

Como acabou o significado ir para baixo é um mistério para mim.


Por que existem 5 maneiras de descer e apenas 3 para subir?

Bem, as três maneiras de subir têm maneiras correspondentes de descer. ( CtrlPpresumivelmente é o complemento de CtrlN, implicando que a mudança de entrada / saída não é relevante aqui). As duas maneiras adicionais abaixo ( <NL>ou CtrlJ) são na verdade duas representações da mesma maneira. <NL>é uma herança dos dias da máquina de escrever - e naqueles dias, acho que não havia uma chave para subir - apenas para descer.

Veja também:

1 Isso ainda é importante em alguns casos (impressão \r(retorno de carro) e \n(alimentação de linha), usando a maioria das funções / ferramentas de impressão formatadas, ainda mantendo o significado antigo.).

2 Esta tabela está organizada de forma que o alfabeto corresponda ao código de controle do caractere na mesma linha.

muru
fonte
3
Eu sempre pensei que Ctrl-Nera para o próximo , e Ctrl-Pera para o anterior . É isso que eles representam no Emacs, de qualquer maneira, ao qual eles estão vinculados next-linee previous-line. Além disso, Ctrl-Pnão é mudança ; é escape de link de dados . A mudança é Ctrl-O.
Lithis
@Lithis Estou corrigido.
Muru
2
@ Litis Honestamente, a única coisa que sei sobre o Emacs é cx ce.
Muru
Resposta histórica e clara, muito obrigado Muru! Eu deveria ter pensado no código ascii dos caracteres que a resposta geralmente está lá.
Statox
@muru Isso é muito ruim, já que o Emacs realmente tem muito a oferecer, especialmente seu modo organizacional, que tem sido extremamente útil para mim. Eu recomendo que você verifique o projeto Spacemacs github.com/syl20bnr/spacemacs , que se concentra fortemente na emulação do Vim, para que você não precise conhecer nenhum comando tradicional do Emacs para usar. Talvez isso mude um pouco sua percepção.
Xj6
8

Veja :help key-notation.

  1. <NL>significa "avanço de linha" e <CR>"retorno de carro".

    Essas são duas maneiras diferentes de quebrar a linha atual. Historicamente, eles estão vinculados a caracteres de controle diferentes ( ctrl-je ctrl-m), mas geralmente são inseridos com a mesma chave <CR>,. Concordo que usar <NL>neste contexto parece contra-intuitivo.

  2. Todos esses "mapeamentos" (na verdade não são mapeamentos) se comportam exatamente da mesma maneira.

  3. História, principalmente, também restrições de plataforma cruzada.

    Não havia teclas de movimento dedicadas no terminal de Bill Joy, mas os decalques das setas estavam nas hjklteclas. Como os editores modais eram raros na época, pressionar essas teclas apenas inseria o caractere associado no que você estava fazendo. Você tinha que pressionar <C-h>, <C-j>, <C-k>e <C-l>para mover o cursor na tela.

    Como você pode ver, há muito uma sobreposição entre j, <C-j>, <NL>e <Down>. <C-n>geralmente significando "próximo" no Vim, é fácil ver como ele foi agrupado com seus companheiros.

  4. Como todos são sinônimos, você é livre para usar o que funciona melhor para você.

    <CR>, por exemplo, é uma chave interessante a ser usada para seus próprios mapeamentos.

romainl
fonte
Obrigado pela iluminação! Eu concordo muito com o <CR>mapeamento. Também mais uma pergunta: eu sei que essas "combinações de teclas" não são realmente chamadas de mapeamentos, mas não tenho certeza de como devo chamá-las.
Statox
Essa é uma pergunta interessante, tendo a chamá-los de "comandos".
Romainl
Posso estar errado, mas não é "comando" referindo-se ao ex comandos do modo como :ls, :substitute, new, etc ...?
statox
xtambém é um "comando".
precisa saber é
Na verdade eu só vi que as chamadas doc x, dd, c, etc "comandos". Então você deve estar certo, acho que jou ^Jtambém são comandos.
Statox