Questão Por que as teclas de seta não são recomendadas no Vim


"Nunca use as setas no Vim!"

Eu ouvi isso de um palestrante aleatório, mas não tive a chance de perguntar por quê. Além disso, se você não usar as teclas de seta, como você pode mover o cursor no Inserir modo?


112


origem


As respostas históricas a essa questão são interessantes. Os religiosos criticam menos. - Isaac Rabinovitch
Boa pergunta. Isso sempre me incomoda sobre vi [m], como um usuário de teclado Dvorak é realmente uma droga! - wim
Lembro-me de quando usei o vi pela primeira vez, há muitos anos, um colega sênior me aconselhando "Certifique-se de aprender a usar as teclas h, ke l porque um dia você vai acabar na máquina em um site do cliente onde a seta as teclas não funcionam, e você vai parecer um idiota completo se você não puder trabalhar com o vi. " - Ergwun
No modo de inserção, você ainda pode mover o cursor usando Ctrl-O, depois um comando de modo normal, e ele retornará ao modo de inserção. Verifique também CTRL-G CTRL-J e CTRL-G CTRL-K, que moverá o cursor para a linha seguinte e anterior, na coluna que você começou a inserir. - Benoit
Eu desenvolvi uma carga de maus hábitos ao longo dos anos. Eu acho que preciso usá-lo em uma conexão muito lenta, para me forçar a usar hábitos melhores. - aidan


Respostas:


Usar as teclas de seta é considerado um mau hábito, porque se você estiver usando as teclas de seta, provavelmente estará perdendo muitos dos recursos adoráveis ​​do vim.

Quando as pessoas começam a usar o vim, elas tendem a permanecer no modo de inserção, já que isso é mais como uma edição de texto convencional. Para ser eficaz no vim, no entanto, você só deve estar no modo de inserção quando estiver inserindo o texto. Se você quiser mover o cursor, você deve estar no modo normal. Você deve estar no modo normal por padrão.

No modo normal, há um milhão de atalhos para se movimentar. Você pode usar hjkl para mover um espaço de cada vez, ou você pode mover por palavras, parágrafos e assim por diante. Se você está no modo normal, não faz sentido usar as teclas de seta em vez de hjkl desde que eles estão mais longe.

Existe a atitude de que se você estiver usando as setas, você está usando o vim "errado". A verdade é que o vim tem uma curva de aprendizado realmente muito íngreme, então enquanto você estiver aprendendo, faça o que for que o mantenha saudável. Quando comecei a usar o vim, fiz tudo da maneira "errada" e não tive nenhum problema em quebrar os hábitos, uma vez que aprendi mais sobre os comandos do vim.

Por exemplo, quando comecei, digamos que queria alterar o texto entre aspas:

String mystring = "I want to change this";

Eu entraria no modo de inserção, moveria para o final da string usando as teclas de seta, pressionaria o botão backspace até que a string se fosse e digitasse o novo texto.

Uma maneira muito melhor é colocar o cursor em qualquer lugar da string (modo normal), depois pressionar cEu". Isso vai change  in  ". Ele irá apagar tudo entre aspas e colocá-lo no modo de inserção para que eu possa inserir o novo texto.


168



@ ott-- ci< e ci) trabalhe também, e você não precisa mover a mão do teclado para o mouse. Se você quiser navegar até o início dos colchetes e, em seguida, alterar o conteúdo f(ci( trabalho. - Matthew Finlay
"coloque o cursor em qualquer lugar da string" - e novamente, enquanto no modo de inserção você usaria as setas para chegar lá, no modo normal você poderia fazer /want e aperte enter para pousar na palavra 'want', então faça ci". - Nathan Long
Ei isso é legal! Que maneira rápida e poderosa de mover o cursor. A única maneira de melhorar seria uma maneira de apontar magicamente onde você queria o cursor e fazer com que ele simplesmente pulasse para lá. Talvez possamos inventar alguma coisa. Eu acho que devemos chamá-lo de "mouse". - Matthew Scouten
@MatthewScouten Ninguém está afirmando que o vim é mais simples que um mouse. Com um pouco de prática, porém, é muito, muito mais rápido. Usar um mouse é como apontar e grunhir para transmitir sua opinião. Vim deixa você falar em frases completas. - Dean
Quebrar hábitos é uma boa resposta - mas impedir alguém de uma atividade normal é fascista. Pior, o usabilidade do (hjkl): mapeamento up e down para 2 teclas que são verticalmente indistinguíveis umas das outras, muito menos das teclas esquerda e direita ..... é um trágico demonstração de arrogância ideologicamente cega. - New Alexandria


Colocação de Chaves

Em resumo, Vim usa o hjkl chaves como a interface de navegação é porque é um remanescente do antigo terminal "ADM-3A", que tinha essas chaves marcadas com setas.

Keyboard

Desde a vim é derivado de vi, usa as mesmas chaves hjkl.

Novos hábitos

A substituição baseada em letras para as teclas de seta permite que você navegar o texto sem tirar suas mãos da configuração de digitação padrão. Isto é discutivelmente mais eficiente e mais rápido do que mover sua mão para acertar as setas. Como descrito na referência # 2 (veja recursos), este não é o fim das vantagens: o VIM tem muitos outros atalhos que você pode acessar sem mover suas mãos.

Recursos e modo de inserção

Existem algumas respostas muito detalhadas e precisas para as 2 partes da sua pergunta: em termos de substituição de chave de seta, eu respondi de uma maneira rápida e resumida, no entanto para sua pergunta de inserção, por favor, veja os recursos listados abaixo.


90



Sem mencionar que as teclas hjkl são muito mais eficientes do que mover as mãos para as teclas de seta. - sixtyfootersdude
Isso não responde a pergunta, apenas explica por que hjkl é escolhido. - Matsemann
Esta é uma história verdadeira e interessante, mas o OP pergunta como você move o cursor no modo de inserção. hjkl não funciona no modo de inserção, então como isso é uma resposta para a pergunta? - LarsH
@Kruug, a primeira parte da questão é por que alguém disse para nunca usar as teclas de seta no vim. O fato de você poder usar hjkl no vim não diz por que alguém nunca deve usar as teclas de seta, assim como o fato de eu poder andar de bicicleta para o trabalho não explica por que alguém me dizia para nunca correr. - LarsH
Agora eu entendo porque o Vim usa escape para sair do modo insert ^^ Cool picture! - Étienne


Esse mantra estúpido é freqüentemente repetido por datilógrafos, para quem a fila principal é como uma segunda coluna ou por um datilógrafo sem toque que quer parecer legal. Para os não-datilógrafos, a linha inicial simplesmente não é tão especial e mover levemente a mão direita para alcançar as setas não é um problema.

O que é importante considerar é o que as pessoas que repetem esse mantra propõem usar em seu lugar.

Na maioria das vezes, eles insistem em usar hjkl.

Se deixarmos de lado o fato de que essas chaves são usadas apenas porque o teclado usado pelo autor do vi não tem chaves de seta físicas e, portanto, qualquer argumento contra as teclas de seta é apenas racionalização, hjkl são apenas marginalmente melhores que as flechas de qualquer maneira. Sim, o único benefício de usar hjkl sobre as setas é que você pula esse pequeno movimento da mão direita para e das setas. Se esse benefício vale a pena é o seu chamado.

Mas esse movimento da mão direita não é por que usar  as setas são ineficientes. É ineficiente porque eles impedem que você mova caractere por caractere e linha por linha enquanto a maioria O movimento necessário para editar o texto tem um alcance muito maior.

Martelar a flecha direita 13 vezes é ineficiente e chato. É isso aquele melhor para martelar o l chave 13 vezes? Não. É igualmente estúpido.

Manter a seta para a direita pressionada até você atingir seu alvo é menos entediante, mas é propenso a erros e quase tão ineficiente quanto 13 ocorrências devido à desaceleração necessária e não determinista no final. É isso aquele melhor manter o l tecla pressionada? Não, claro que não.

Felizmente a maioria dos kits de ferramentas GUI fornecem combos como Ctrl+Right que nos permitem mover palavra por palavra ou pular para EOL, para o próximo parágrafo ou qualquer outra coisa. Esses atalhos nos ajudam a navegar muito mais rápido e de forma mais inteligente do que com setas simples. Nós temos o mesmo com hjkl? Não, nós não. Podemos usar uma contagem, se quisermos, mas quem quer contar os caracteres para cada movimento? Fazendo 14k com a ajuda de relativenumber é ótimo, mas e os movimentos horizontais? Para grandes movimentos, hjkl são realmente piores que modificadores + setas. E adivinha? Grandes movimentos são o que mais precisamos.

Mas nós somos sortudos, nosso editor favorito tem dezenas de movimentos que correm em volta das duas setas e  hjkl: bBeEwW/?*#{}() e assim por diante. Esses comandos são imensamente mais fortalecedor do que hjkl e na maior parte muito mais lógico e intuitivo se você está acostumado a Ctrl+Right e amigos.

Mudando de <Right><Right><Right><Right><Right><Right><Right><Right><Right> para lllllllll ou até mesmo 9l é ridiculamente inútil.

Mudando de <Right><Right><Right><Right><Right><Right><Right><Right><Right> para <C-Right> é muito melhor. De lá, mudar para w é fácil e rápido. Não precisa de <nop> suas flechas!

Se esses comandos forem mais úteis, mais poderosos e mais intuitivos do que hjklPor que diabos tantos blogueiros e comentaristas insistem em substituir as flechas com hjkl?

Eu tenho. Nenhuma idéia.

Em conclusão, hjkl ter o seu lugar no nosso cinto de ferramentas, porque sempre temos que passar por 2 caracteres ou linhas, mas eles são mais frequentemente do que não a árvore que esconde a floresta. Seja cauteloso com as pessoas que pregam contra as flechas: o que elas reservam para você pode não ser melhor de forma alguma.


50



No começo, eu pensei que você diria que 'hjkl' são inúteis, mas bons movimentos, palavra / parágrafo / frases são muito mais úteis que o mantra sobre o movimento de um único personagem. - Xavier T.
Obrigado. Eu tive uma discussão semelhante sobre HN no outro dia que descarrilou por causa da redação pobre. Concentrando os esforços em hjkl  é inútil, mas hjkl são úteis. - romainl
O mesmo aqui: no final, eu gostei da sua resposta, mas acho que o tom veio como desnecessariamente ranting / trolling / flaming. - UncleZeiv
Ooooh, obrigada Daniel. - romainl
Não os chame de inúteis, a discussão sobre velocidade é boa, e a maneira como o HJKL trabalha com outros comandos VIM de uma maneira que as teclas de seta também não são importantes. - Aviator45003


Outros descreveram porque outras formas de mover o cursor são preferidas, mas pouco foi dito para responder a pergunta, por que é considerado uma má idéia usar as setas?

Eu acho que o principal motivo (e @Squeezy um pouco aludiu a isso) é que nos dias de terminais como o VT100, teclas de seta produziu uma seqüência de escape que foi interpretado pelo programa em execução. (Como as teclas de seta não são representadas em ASCII, a digitação das teclas de seta tem que ser comunicada de alguma maneira "especial".) A sequência de escape era tipicamente algo como

ESC [ A

dependendo das propriedades do seu terminal, sua conexão e sua modo de cursor. Se seu shell ou seu programa não estivessem configurados adequadamente para o terminal, eles não entenderiam a sequência de escape como uma tecla de seta.

Quando eu estava na faculdade, fazendo o login no Ultrix via terminais VT100, se eu pressionasse uma seta enquanto estava no modo de inserção, o ESC seria interpretado como "sair do modo de inserção" e, em seguida, o seguinte [ A foram interpretados como comandos de modo normal. Obviamente, não o que o usuário quer ou espera!

Atualmente, o manuseio de terminais e teclas de seta parece ser mais robusto, especialmente em ambientes GUI. Mas os mesmos problemas ainda ocorrem ao usar o vim sobre SSH ou Telnet.


16





Usar as teclas de seta é desaprovado porque obriga você a mover os dedos do início quando estiver usando o layout QWERTY e do bloco de caracteres (?) Ao usar o Dvorak ou qualquer outro layout.


14



Uau. A sério? Eu não quero acreditar nisso, pois isso implicaria que as pessoas que projetaram o Vim pensariam que seus usuários passam mais tempo digitando do que pensando. - Renan
Por que mover sua mão implica pensar? - EBGreen
bem, quando eu tinha que fazer isso na escola, você tinha que acertar o esc antes de usar a navegação do hjkl, então você já tinha removido a mão esquerda da linha inicial para pegar o dedo mindinho no Esc. Lembro-me de voltar um espaço e inserir um caractere que você tinha que digitar 'Esc: h i' e, em seguida, digite o caractere que você deseja inserir. isso não é tão útil. - Frank Thomas
@Renan - você está assumindo que 'digitar' significa 'inserir texto'. Eu tenho meus dedos na fila de casa quando estou lendo e pensando também, porque o teclado é como eu navegar no Vim: procurando por mover, abrindo outros arquivos para comparar código, pulando para corrigir erros de ortografia, etc. - Nathan Long
@Renan - 1) você subestima a poupança e 2) pequenas coisas se somam. Eu vi os usuários avançados do TIM digitarem a 10x a velocidade de outros desenvolvedores. Em velocidade suficiente, a edição se torna automática e não interrompe os pensamentos ou o fluxo de uma pessoa. É um prazer trabalhar dessa maneira, então ele flutua no meu barco, mas eu aposto que é um aumento maior de produtividade do que você pensa. Tente assistir codificadores como Gary Bernhardt como um exemplo. - Nathan Long


As teclas de seta exibem um problema - já era conhecido no vi - em conexões lentas, como no modem de 1200 bauds. A seta se traduz em uma seqüência ESC como ESC a. Agora, quando o tempo entre ESC e a for muito longo, você acaba ouvindo um BEL (ou vendo um flash) seguido do modo de anexação. Isto não aparecerá com o hjkl chaves.


10



eu acho que ESC [ A é o que você está se referindo? - LarsH
ESC [ A é um terminal DEC VT-100 (o terminal ANSI foi fortemente derivado da seta DEC VT-100). IIRC, ESC A era a seta ADM-3A, ou possivelmente a seta DEC VT-52. O ponto permanece o mesmo, no entanto, o ESCpersonagem enviado como parte da tecla de seta foi facilmente confundido com o ESC digitado manualmente. - RBerteig
@RBerteig: Bom saber. - LarsH


Em relação à segunda questão:

[Se você não usa as teclas de seta, como pode mover o cursor no modo Inserir?

Para quem é mestre e, portanto, despreza as setas, o conceito de "modo" também não existe.

O mestre adiciona novo texto usando não um modo de inserção, mas insere ou substitui completamente comandos que começam com um opcode como i, o ou cw que é seguido por texto de payload e terminado por ESC. Os comandos têm uma sintaxe e, assim, a máquina atravessa os estados aceitando a sintaxe dos comandos, mas no modelo de mestre do editor, eles não dão origem a um modo. O que os aprendizes ingenuamente chamam de "modo" é para o mestre um estado de comando inacabado, uma situação muito abominável que o mestre evita.

Sempre que o mestre perceber, enquanto no meio de um comando de inserção ou substituição, esse texto precisar ser inserido ou excluído na posição do próximo caractere indicado pelo cursor, o mestre encerrará o comando de inserção e liberará uma das dezenas de comandos eficientes. comandos de movimento (recorrer aos humildes hjkl E se uma maneira mais poderosa não é obviamente aplicável).

Além disso, uma vez que o mestre raramente se distrai de tal maneira a deixar um comando inacabado, o mestre raramente, ou nunca, faz o editor bipar devido à entrada de um supérfluo. ESC emitido "apenas no caso".

(No entanto, quando a rede está atrasada ou a máquina está esbarrando, o mestre libera ESC chave furiosamente e repetidamente, assim como todos os outros.)


5



Lembre-se, se viA entrada do comando insert é um modo, então, para ser justo, temos que identificar todos esses modos em outros editores e chamá-los de modal. Por exemplo, quando pressionamos Ctrl-X no Emacs, estamos em um "modo" no qual é possível, por exemplo, pressionar Ctrl-S para salvar o documento, o que não funcionará fora desse "modo". - Kaz