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

114

"Never use arrow keys in 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 mover o cursor no modo Inserir ?

    
por Yoland Yan 18.08.2015 / 10:01

14 respostas

170

O uso das 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 se movimentar em um espaço por vez ou 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 , já que elas estão mais distantes.

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.

Como 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 de retrocesso até que a string fosse perdida e digitaria o novo texto.

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

    
por 23.05.2013 / 23:10
90

Colocação de chaves

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

Sincevimisderivedfromvi,itusesthesamehjklkeys.

Novoshábitos

Asubstituiçãobaseadaemletrasparaasteclasdesetapermitequevocênaveguepelotextosemtirarsuasmãosdaconfiguraçãodedigitaçãopadrão.Istoédiscutivelmentemaiseficienteemaisrápidodoquemoversuamãoparaacertarassetas.Comodescritonareferência#2(vejarecursos),estenãoéofimdasvantagens:oVIMtemmuitosoutrosatalhosquevocêpodeacessarsemmoversuasmãos.

Recursosemododeinserção

Existemalgumasrespostasmuitodetalhadaseprecisasparaasduaspartesdasuapergunta:emtermosdesubstituiçãodechavedeseta,respondidemaneirarápidaeresumida,masparasuaperguntadeinserção,porfavor,vejaosrecursoslistadosabaixo.

por 23.05.2017 / 14:41
50

Esse mantra estúpido é frequentemente repetido por datilógrafos, para quem a fila inicial é como uma segunda coluna ou por quem não quer digitar, 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 possui 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 é o motivo de usar apenas as setas é ineficiente. É ineficiente porque eles impedem que você mova caractere por caractere e linha por linha, enquanto o mais dos movimentos necessários para editar texto tem um alcance muito maior.

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

Manter a seta para a direita pressionada até 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 determinística no final. É que é melhor manter a tecla l pressionada? Não. Claro que não.

Felizmente, a maioria dos kits de ferramentas GUI fornece combos como Ctrl+Right que nos permitem mover palavra por palavra ou pular para EOL, para o próximo parágrafo ou o que quer que seja. 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? Fazer 14k com a ajuda de relativenumber é ótimo, mas e os movimentos horizontais? Para grandes movimentos, hjkl são realmente piores que modificadores + setas. E adivinhe? Grandes movimentos são o que mais precisamos.

Mas nós somos sortudos, nosso editor favorito tem dezenas de movimentos que circulam nas setas e hjkl : bBeEwW/?*#{}() e assim por diante. Esses comandos são imensamente mais poderosos que hjkl e, na maior parte, muito mais lógicos e intuitivos se você estiver acostumado a Ctrl+Right e amigos.

Mudar de <Right><Right><Right><Right><Right><Right><Right><Right><Right> para lllllllll ou 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 é necessário <nop> suas flechas!

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

eu. Ter. Não. Idéia.

Em conclusão, hjkl tem seu lugar em nosso toolbelt porque sempre temos que nos mover por 2 caracteres ou linhas, mas na maioria das vezes eles sã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 nada bom.

    
por 04.08.2014 / 21:20
16

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

Eu acho que o motivo principal (e @Squeezy um pouco aludiu a isso) é que nos dias de terminais como o VT100, teclas de seta produziam uma seqüê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 tem que ser comunicada de alguma maneira "especial".) A seqüência de escape era tipicamente algo como

ESC [ A

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

Quando eu estava na faculdade, fazendo 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, a seguinte [ A foram interpretados como comandos de modo normal. Obviamente, não o que o usuário quer ou espera!

Hoje em dia, 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.

    
por 02.07.2013 / 17:57
14

O uso das teclas de seta é desaprovado, pois obriga você a mover os dedos da janela ao usar o layout QWERTY e o bloco de caracteres (?) ao usar o Dvorak ou qualquer outro layout.

    
por 23.05.2013 / 23:46
10

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. Isso não aparecerá com as chaves hjkl .

    
por 23.05.2013 / 22:18
5

Sobre a segunda questão:

[I]f you don't use the arrow keys, how can you move the cursor in the Insert mode?

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

O mestre adiciona texto novo usando não um modo de inserção, mas comandos de inserção ou substituição completos, que começam com um opcode como i , o ou cw que é seguido por texto de carga útil 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, no meio de um comando de inserção ou substituição, que o texto deve ser inserido ou excluído, exceto na próxima posição de caractere indicada pelo cursor, o mestre encerra o comando de inserção e solta um dos dezenas de comandos de movimento eficientes (recorrendo ao baixo hjkl se uma maneira mais poderosa não é obviamente aplicável).

Além disso, como o mestre raramente fica distraído de modo a deixar um comando inacabado, o mestre raramente faz com que o editor emita um sinal sonoro devido à entrada de um ESC supérfluo emitido "apenas no caso" .

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

    
por 24.05.2013 / 02:43
5
  • as teclas de setas 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 em Modo de inserção (exceto para Backspace e corrigindo um curto erro de digitação), a idéia de vi é para entrar modo de inserção apenas para inserir algo. O movimento é feito no modo normal
  • Se puder, você deve evitar usar hjkl para mover onde for aplicável e, em vez disso, usá-los somente para obter direções. Existem inúmeras opções para mover em vi , veja: link
por 24.05.2013 / 07:52
3

Sim, por muitas das razões mencionadas acima, vi foi originalmente escrito para usar hjkl , mas " nunca " é uma declaração muito grande.

Eu tenho a tendência de modificar o vim (e outras ferramentas que eu uso) para me comportar como quero. Isso funciona muito bem na minha máquina, mas como desenvolvedor embutido, nem sempre consigo escolher o que está nas máquinas que eu suporte. Eu me deparei com máquinas antigas que só têm hjkl navegação em vi de vez em quando. Eu acabo recebendo os códigos de controle inseridos no meu arquivo por um segundo ou dois até que eu quebre meu hábito e mude para hjkl .

A única razão válida que eu posso usar é "nunca use as setas no Vim!" é assim que você é capaz de usar máquinas que não podem lidar com as teclas de seta. Isso parece uma razão muito fina para dizer " nunca ".

    
por 23.05.2013 / 23:01
3

if you don't use the arrow keys, how can you move the cursor in the Insert mode?

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

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

"Vim é um editor de texto sem valor se não conseguir desfazer as coisas corretamente."

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

O uso do Vim só é útil 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 essa coisa somente quando eu acertar essa macro de atalho" através da memória muscular subconsciente. Se "aquela coisa" se tornar "digite o arquivo inteiro do começo ao fim", eu concordo, o vim não é tão útil assim.

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

    
por 25.05.2013 / 02:26
0

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

Por exemplo, a tecla Insert não funciona neste ambiente, por isso estou usando I para alternar para o modo de inserção. A chave Esc, que eu costumo usar 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 contando com os atalhos 0 e $ com os quais nunca me preocupei antes para alcançar o começo ou o fim de uma linha.

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

    
por 25.05.2013 / 08:11
0

apenas escreva o seguinte comando antes de escrever no vim: -

  1. esc
  2. : definir nocp

um problema com isso é que você pode ter que escrevê-lo a cada vez.

    
por 25.05.2013 / 16:27
0

Aqui está o meu 2 ¢.

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

Por outro lado, é absolutamente brilhante o vi (e o vim) não precisam de teclas especiais, exceto talvez. Você provavelmente poderia hackear um velho selectric da IBM para funcionar como um terminal.

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

    
por 28.05.2013 / 22:07
0

O nome do jogo com editores de texto aprimorados parece estar "se movimentando com pressa" e reduzindo o movimento desperdiçado / repetitivo. Há algum tempo perdido quando você passa das teclas de letra para as teclas de seta (dependendo das dimensões do teclado) e do de volta para a linha inicial. Mas se você conseguir chegar à tecla ESC com os modos de alternância de dedo mindinho ou dedo mindinho da mão esquerda, ele se tornará 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 a esquerda e mova-se com hjkl à sua direita. Eventualmente, você será capaz de fazer isso sem pular uma batida.

Dito isto, nunca cheguei a lugar algum com o Vim até que experimentei algumas das coisas mencionadas aqui , o mais importante é a seção " Get efficient: shortcut mappings "

    
por 28.05.2013 / 22:48

Tags