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

125

"Nunca use as setas no Vim!"

Ouvi isso de um orador aleatório, mas não tive a chance de perguntar o porquê. Além disso, se você não usar as teclas de seta, como mover o cursor no modo Inserir ?

Yoland Yan
fonte
6
As respostas históricas a essa pergunta são interessantes. Os religiosos discordam menos.
Isaac Rabinovitch
5
Boa pergunta. Isso sempre me incomoda no vi [m], como um usuário de teclado Dvorak é realmente uma merda!
Wim
32
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, j, k e l porque um dia você terminará na máquina em um site cliente onde a seta as teclas não funcionam, e você parecerá um completo idiota se você não puder nem trabalhar com vi. "
Ergwun
1
No modo de inserção, você ainda pode mover o cursor usando Ctrl-O e, em seguida, um comando de modo normal, e ele voltará 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
1
Eu desenvolvi uma carga de maus vi [m] hábitos ao longo dos anos. Eu acho que preciso usá-lo em uma conexão muito lenta, para me forçar a usar melhores hábitos.
Aidan

Respostas:

172

Usar as setas do teclado é considerado um mau hábito, porque se você estiver usando as setas do teclado, provavelmente estará perdendo muitos dos recursos encantadores do vim.

Quando as pessoas começam a usar o vim pela primeira vez, elas tendem a permanecer no modo de inserção, pois é mais como a edição de texto convencional. Para ser eficaz no vim, no entanto, você só deve estar no modo de inserção quando estiver realmente inserindo texto. Se você deseja mover o cursor, deve estar no modo normal. Você deve estar no modo normal por padrão.

No modo normal, existem milhões de atalhos para se movimentar. Você pode usar hjklpara mover um espaço de cada vez, ou pode usar palavras, parágrafos e assim por diante. Se você estiver no modo normal, não há sentido em usar as teclas de seta em vez de hjklestarem mais distantes.

Existe a atitude de que, se você estiver usando as teclas de seta, estará usando o vim "errado". A verdade é que o vim tem uma curva de aprendizado realmente muito íngreme; portanto, enquanto você estiver aprendendo, faça o que for necessário. Quando comecei a usar o vim, fiz tudo da maneira "errada" e não tive nenhum problema em quebrar os hábitos depois que aprendi mais sobre os comandos do vim.

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

String mystring = "I want to change this";

Eu entrava no modo de inserção, movia para o final da string usando as teclas de seta, pressione backspace até a string desaparecer e digitava o novo texto.

Uma maneira muito melhor é colocar o cursor em qualquer lugar da string (modo normal) e pressionar ci". Isso vai change in ". Ele excluirá tudo entre as aspas e o colocará no modo de inserção para que eu possa inserir o novo texto.

reitor
fonte
4
@ ot-- ci<e também ci)funciona, e você não precisa mover a mão do teclado para o mouse. Se você deseja navegar para o início dos colchetes e alterar o conteúdo, ele f(ci(funciona.
quer
6
"coloque o cursor em qualquer lugar da cadeia" - e, novamente, enquanto que no modo de inserção você pode usar as setas para chegar lá, no modo normal você poderia fazer /wante aperte enter para pousar sobre a palavra 'querer', então faça ci".
Nathan Long
8
Ei, isso é legal! Que maneira rápida e poderosa de mover o cursor. A única maneira de melhorá-lo seria apontar magicamente para onde você queria o cursor e fazer com que ele simplesmente pulasse lá. Talvez possamos inventar alguma coisa. Eu acho que deveríamos chamá-lo de "mouse".
Matthew Scouten
18
@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 mostrar seu ponto de vista. O Vim permite que você fale em frases completas.
247 Dean
4
Quebrar hábitos é uma boa resposta - mas forçosamente impedir alguém de uma atividade normal é fascista. Pior ainda, a usabilidade de ( hjkl): mapeamento upe downpara 2 teclas que são verticalmente indistinguíveis uma da outra, e muito menos das teclas esquerda e direita ..... é uma demonstração trágica de arrogância ideologicamente cega.
New Alexandria
93

Posicionamento da chave

Em resumo, Vimusa as hjklteclas como interface de navegação porque é um remanescente do antigo terminal "ADM-3A", que tinha essas teclas marcadas com setas.

Teclado

Como vimé derivado vi, ele usa as mesmas chaves hjkl.

Novos hábitos

A substituição por letra das teclas de seta permite navegar pelo texto sem tirar as mãos da configuração padrão de digitação . Isso é sem dúvida mais eficiente e mais rápido do que mover a mão para pressionar as setas. Conforme descrito na referência nº 2 (consulte os recursos), esse não é o fim das vantagens: o VIM possui muitos outros atalhos que você pode acessar sem mexer as mãos.

Recursos e modo de inserção

Existem algumas respostas muito detalhadas e precisas para as duas partes da sua pergunta: em termos de substituição das teclas de seta, eu respondi de maneira rápida e resumida; no entanto, para a sua pergunta de inserção , consulte os recursos listados abaixo.

Christian Stewart
fonte
2
Sem mencionar que as teclas hjkl são muito mais eficientes do que mover as mãos para as teclas de seta.
Sixtyfootersdude
2
Isso não responde à pergunta, apenas explica por que o hjkl é escolhido.
Matsemann 23/05
3
Este é um histórico verdadeiro e interessante, mas o OP pergunta como você move o cursor no modo de inserção . hjklnão funciona no modo de inserção, então como isso é uma resposta para a pergunta?
LarsH 23/05
3
@ Kruug, a primeira parte da pergunta é por que alguém disse para nunca usar as setas no vim. O fato de você poder usar hjklno 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 trabalhar não explica por que alguém me disse para nunca correr.
LarsH 23/05
1
Agora entendo por que o Vim usa escape para sair do modo de inserção ^^ Cool picture!
Etienne
56

Esse mantra estúpido é frequentemente repetido por datilógrafos para quem a fila da casa é como uma segunda coluna ou por não datilógrafo que querem parecer legais. Para os não-datilógrafos, a fila da casa simplesmente não é tão especial e mover levemente a mão direita para alcançar as flechas não é um problema.

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

Na maioria das vezes, eles insistem em usar hjkl.

Se deixarmos de lado o fato de que essas teclas são usadas apenas porque o teclado usado pelo autor do vi não possui teclas de seta físicas e, portanto, qualquer argumento contra as teclas de seta é apenas racionalização, hjklsão marginalmente melhores do que as setas. Sim, o único benefício do uso hjklsobre as setas é que você pula esse pequeno movimento da mão direita de e para as setas. Se esse benefício vale a pena, é sua decisão.

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

Martelar a seta direita 13 vezes é ineficiente e chato. É que melhor para martelar os lprincipais 13 vezes? Não. É igualmente estúpido.

Manter a seta direita pressionada até chegar ao seu objetivo é menos entediante, mas é propenso a erros e quase tão ineficiente quanto 13 acertos, devido à desaceleração necessária e não determinística no final. É que melhor manter a ltecla pressionada? Não, claro que não.

Felizmente, a maioria dos kits de ferramentas da GUI fornece combinações como Ctrl+Rightessa, que permitem mover palavra por palavra ou pular para o EOL, para o próximo parágrafo ou o que for. Esses atalhos nos ajudam a navegar muito mais rápido e com mais inteligência do que com setas simples. Temos o mesmo com hjkl? Não, nós não. Podemos usar uma contagem, se quisermos, mas quem quer contar caracteres para cada movimento? Fazer 14kcom a ajuda de relativenumberé ótimo, mas e os movimentos horizontais? Para movimentos grandes, hjklna verdade são piores que modificadores + setas. E adivinha? Grandes movimentos são o que mais precisamos.

Mas somos sortudos, nosso editor favorito tem dezenas de movimentos que circulam as setas e hjkl : bBeEwW/?*#{}()e assim por diante. Esses comandos são imensuravelmente mais poderosos do que hjkle na maioria das vezes muito mais lógicos e intuitivos se você estiver acostumado Ctrl+Righte amigos.

Mudar de <Right><Right><Right><Right><Right><Right><Right><Right><Right>a lllllllllou até mesmo 9lé ridiculamente inútil.

Mudar de <Right><Right><Right><Right><Right><Right><Right><Right><Right>para <C-Right>é muito melhor. A partir daí, mudar para wé fácil e rápido. Não há necessidade de <nop>suas flechas!

Se esses comandos são mais úteis, mais poderosos e mais intuitivos do que hjkl, por que diabos tantos blogueiros e comentaristas insistem em substituir as setas hjkl?

Eu tenho. Nenhuma idéia.

Em conclusão, hjkltenha seu lugar em nosso cinto de ferramentas, porque sempre temos que passar por 2 caracteres ou linhas, mas elas são mais frequentemente do que a árvore que esconde a floresta. Desconfie das pessoas que pregam contra as flechas: o que elas reservam para você pode não ser melhor.

romainl
fonte
No começo, eu pensei que você diria que 'hjkl' é inútil, mas uma boa captura, movimentos de palavras / parágrafos / frases são muito mais úteis que o mantra sobre o movimento de caracteres únicos.
Xavier T.
1
Obrigado. Eu tive uma discussão semelhante no HN outro dia que descarrilou por causa de uma redação ruim. Concentrar os esforços hjkl é inútil, mas hjklé útil.
Romainl
5
O mesmo aqui: no final, gostei da sua resposta, mas acho que o tom apareceu como desnecessariamente delirante / trolling / flamejante.
UncleZeiv
Não os chame de inúteis, o argumento sobre velocidade é bom e a maneira como o HJKL trabalha com outros comandos do VIM de uma maneira que as teclas de seta não o fazem também é importante.
precisa saber é o seguinte
@TC Existem exemplos para tornar todo o debate mais interessante?
precisa saber é o seguinte
18

Outros descreveram por que outras maneiras de mover o cursor são preferidas, mas pouco foi dito para responder à pergunta, por que é considerado uma má idéia usar as teclas de seta?

Eu acho que a principal razão (e o @Squeezy aludiu um pouco a isso) é que, nos dias de terminais como o VT100, as teclas de seta produziam uma sequência de escape que era interpretada pelo programa em execução. (Como as teclas de seta não são representadas em ASCII, a digitação das teclas de seta deve 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 seu modo de cursor . Se o seu shell ou o seu programa não estivesse configurado corretamente para o terminal, eles não entenderiam a sequência de escape como uma tecla de seta.

Quando eu estava na faculdade, efetuando login no Ultrix via terminais VT100, se eu pressionasse uma seta enquanto vi no modo de inserção, ESCele seria interpretado como "sair do modo de inserção" e, a seguir, os seguintes [ Aitens como comandos no modo normal . Obviamente não é o que o usuário deseja ou espera!

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

LarsH
fonte
14

O uso das teclas de seta é desaprovado, porque obriga a mover os dedos da tela inicial ao usar o layout QWERTY e do painel de caracteres (?) Ao usar o Dvorak ou qualquer outro layout.

pdoherty926
fonte
4
Uau. A sério? Não quero acreditar nisso, pois isso implicaria que as pessoas que projetaram o Vim pensariam que seus usuários gastam mais tempo digitando do que pensando.
Renan
13
Por que mover a mão implica pensar?
EBGreen 23/05
8
bem, quando eu tinha que fazer isso na escola, você tinha que pressionar esc antes de poder usar a navegação hjkl, então você já havia retirado sua mão esquerda da fila de casa para levar seu dedo mindinho a Esc. Lembro que, para voltar um espaço e inserir um caractere, era necessário digitar 'Esc: hi' e digite o caractere que você deseja inserir. isso não é tão útil.
Frank Thomas
1
@ Renan - você está assumindo que 'digitar' significa 'inserir texto'. Também tenho meus dedos na linha de casa quando estou lendo e pensando, porque o teclado é como navego no Vim: procurando mover, abrindo outros arquivos para comparar código, pulando para corrigir erros ortográficos, etc.
Nathan Long
2
@Renan - 1) você subestima a economia e 2) pequenas coisas se somam. Eu já vi usuários avançados do Vim digitar com toque editar 10 vezes a velocidade de outros desenvolvedores. A uma velocidade suficiente, a edição se torna automática e não interrompe os pensamentos ou o fluxo. É um prazer trabalhar dessa maneira, por isso flutua no meu barco, mas aposto que é um aumento de produtividade maior do que você pensa. Tente assistir codificadores como Gary Bernhardt como exemplo.
Nathan Long
10

As teclas de seta exibem um problema - já era conhecido no vi - em conexões lentas, como no modem de 1200 baud. A seta se traduz em uma sequência ESC como ESC a. Agora, quando o tempo entre ESC e a fica muito longo, você acaba ouvindo um BEL (ou vendo um flash) seguido pelo modo de acréscimo. Isso não aparecerá com as hjklteclas.

ott--
fonte
Eu acho ESC [ Aque é o que você está se referindo?
LarsH 23/05
2
ESC [ Aé um terminal DEC VT-100 (o terminal ANSI foi fortemente derivado do DEC VT-100). IIRC, ESC Aera a flecha ADM-3A, ou possivelmente a flecha DEC VT-52. O ponto permanece o mesmo, no entanto, o ESCcaractere enviado como parte da tecla de seta foi facilmente confundido com o ESCdigitado manualmente.
RBerteig 23/05
@RBerteig: É bom saber.
LarsH
5

Em relação à segunda questão:

[I] Se você não usa as setas, como pode mover o cursor no modo Inserir?

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

O mestre adiciona novo texto usando não um modo de inserção, mas comandos completos de inserção ou substituição que começam com um código de operação, como i, oou cwque é seguido pelo texto da carga útil, e finalizado por ESC. Os comandos têm uma sintaxe e, portanto, a máquina percorre estados ao aceitar a sintaxe dos comandos, mas no modelo mestre do editor, eles não dão origem a um modo. O que os aprendizes chamam ingenuamente de "modo" é para o mestre um estado de comando inacabado, uma situação mais repugnante que o mestre evita.

Sempre que o mestre percebe, enquanto está no meio de um comando inserir ou substituir, esse texto deve ser inserido ou excluído, exceto na próxima posição de caractere indicada pelo cursor, o mestre termina o comando insert e libera uma das dezenas de comandos de movimento (recorrer ao humilde, hjklse uma maneira mais poderosa não for obviamente aplicável).

Além disso, como o mestre raramente se distrai de forma a deixar um comando inacabado, o mestre raramente, se é que alguma vez, faz o editor ESCemitir um sinal sonoro devido à entrada de um supérfluo emitido "apenas por precaução".

(No entanto, quando a rede está atrasada ou a máquina está atolada, o mestre pressiona a ESCtecla furiosa e repetidamente, como todo mundo.)

Kaz
fonte
2
Lembre-se, se via entrada do comando insert for um modo, 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 24/04
5
  • as teclas de seta podem não funcionar bem em determinados ambientes. hjkl são caracteres normais e bem compreendidos por todos os tipos de terminais.
  • Você não move o cursor no modo Inserir (exceto para Backspace e corrige um pequeno erro de digitação), a idéia do vi é entrar no modo Inserir apenas para inserir algo. O movimento é feito no modo Normal
  • Se puder, evite usar hjkl para mover onde for aplicável e, em vez disso, use-os apenas para obter instruções. Existem inúmeras opções para se mover no vi , consulte: http://vim.wikia.com/wiki/Moving_around
Squeezy
fonte
Na verdade, você pode mover o cursor no modo de inserção, pelo menos para a esquerda, usando backspace. Mas concordo que você não pode movê-lo livremente.
LarsH 23/05
Tentei expressar que você não quer mover o cursor no modo Inserir .
Squeezy
Desculpe, entendi errado o que você escreveu como dizendo que não pode mover o cursor no modo de inserção. Na verdade, quero mover o cursor no modo de inserção: se estou inserindo algum texto novo e pressiono a tecla errada, quero usar o backspace para corrigi-lo. Mas além desse uso limitado, eu concordo.
LarsH
3

Sim, por muitos dos motivos mencionados acima, vifoi originalmente escrito para uso hjkl, mas " nunca " é uma afirmação bastante grande.

Costumo modificar vim(e outras ferramentas que uso) para se comportar como eu quero. Isso funciona muito bem na minha máquina, mas como desenvolvedor incorporado, nem sempre escolho o que há nas máquinas que eu suporte. Me deparei com máquinas mais antigas que só têm hjklnavegação em vialgumas ocasiões. Acabo recebendo os códigos de controle inseridos no meu arquivo por um segundo ou dois, até que eu volte a quebrar meu hábito e mude para hjkl.

O único motivo válido que eu posso usar para "nunca usar teclas de seta no Vim!" é para que você possa usar máquinas que não podem manipular as teclas de seta. Isso parece uma razão bastante tênue para dizer " nunca ".

kmort
fonte
3

se você não usar as teclas de seta, como mover o cursor no modo Inserir?

A principal razão pela qual eu desencorajo as pessoas a usar as teclas de seta é explicitamente porque permite que você se mova enquanto estiver no modo de inserção.

Um dos problemas mais estranhos com o aprendizado do vim para iniciantes é que o comando desfazer do vim opera desfazendo a última ação , não a última tecla . Muitos de meus amigos acabam ficando no modo de inserção o tempo todo, porque nunca há um motivo para deixá-lo. Quando eles me perguntam "Como faço para desfazer?" Eu respondo com "pressione a letra u no modo de comando", eles ficam frustrados quando o vim limpa o arquivo inteiro.

"O Vim é um editor de texto inútil se não puder desfazer as coisas corretamente."

É difícil usar uma ferramenta antes de aprender como.

O Vim se torna útil somente depois que você aprender a usá-lo. O poder do vim está em como você pode dizer "faça aquilo de novo" ou "desfaça essa coisa" ou "faça isso apenas quando eu pressionar essa macro de atalho" através da memória muscular subconsciente. Se "essa coisa" se tornar "digite o arquivo inteiro do início ao fim", eu concordo, o vim não é tão útil.

É por esse motivo que você só deve inserir texto quando estiver dentro insert mode. Evitar as teclas de seta é apenas uma das formas que encontramos para ajudá-lo a se tornar um usuário melhor do vim, mais rápido.

Conrad.Dean
fonte
0

A execução do vim no meu dispositivo Android, que está executando um daemon ssh no kbox, me levou a sair da minha zona de conforto. Como o emulador de terminal Anroid no dispositivo usa botões de volume para substituir os combos especiais de teclas (ctrl + qualquer que seja), algumas teclas que eu normalmente usaria no teclado não funcionam nessa situação.

Por exemplo, a tecla Inserir não funciona nesse ambiente, então estou usando Ipara alternar para o modo Inserir. A tecla Esc, que eu normalmente uso para escapar do modo de inserção, também não funciona, então estou usando ctrl + [para escapar. As teclas Home e End não funcionam como estou acostumado. Em vez disso, estou confiando nos atalhos 0e com os quais $nunca me preocupei antes para chegar ao início ou ao final de uma linha.

De qualquer forma, as teclas de seta ainda funcionam como de costume na minha situação, mas é bom saber que os atalhos de teclado minimalistas estão lá.

iyrin
fonte
0

basta escrever o seguinte comando antes de escrever no vim: -

  1. Esc
  2. : definir nocp

Um problema com isso é que você pode precisar escrevê-lo toda vez.

0decimal0
fonte
bem isso seria útil quando você quiser usar tecla de seta no modo de inserção
0decimal0
0

Aqui está o meu 2 ¢.

Faça o que você se sentir confortável. Se você usar editores diferentes, poderá ser mais fácil usar as teclas de seta para obter consistência.

Por outro lado, é absolutamente brilhante o vi (e o vim) não precisar de nenhuma chave especial, exceto talvez. Você provavelmente poderia hackear um antigo IBM selectric para funcionar como um terminal.

Outra coisa a observar é que as teclas de seta podem não funcionar conforme o esperado. Eu usei terminais onde eles não funcionavam. Não sei exatamente como eles são implementados no Vim, mas tenho certeza de que não é uniforme. Minha memória irregular parece lembrar uma implementação em que foram implementadas como macros do vim.

David E.
fonte
0

O nome do jogo com editores de texto aprimorados parece estar "se movendo rapidamente" e reduzindo o movimento desperdiçado / repetitivo. Há algum tempo perdido quando você passa das teclas da letra para as teclas de seta (dependendo das dimensões do teclado) e depois volta para a linha inicial. Mas se você puder acessar a tecla ESC com os modos de comutação dedo mindinho ou dedo anelar da mão esquerda, torna-se um movimento fluido e, ao longo de uma sessão de edição, haverá um ganho de velocidade.

E esta é a chave para a segunda parte da sua pergunta, saia do modo de inserção pressionando ESC com sua esquerda e mova com hjkl com sua direita. Eventualmente, você será capaz de fazer isso sem pular uma batida.

Dito isto, eu nunca cheguei a lugar nenhum com o Vim até experimentar algumas das coisas mencionadas aqui , sendo a mais importante a seção " Obtenha eficiência: mapeamentos de atalhos "

Vijay Edwin
fonte