"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 ?
"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 ?
Respostas:
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 hjkl
para 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 hjkl
estarem 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.
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.
/want
e aperte enter para pousar sobre a palavra 'querer', então faça ci"
.
hjkl
): mapeamento up
e down
para 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.
Em resumo, Vim
usa as hjkl
teclas como interface de navegação porque é um remanescente do antigo terminal "ADM-3A", que tinha essas teclas marcadas com setas.
Como
vim
é derivadovi
, ele usa as mesmas chaves hjkl.
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.
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.
hjkl
não funciona no modo de inserção, então como isso é uma resposta para a pergunta?
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 trabalhar não explica por que alguém me disse para nunca correr.
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, hjkl
são marginalmente melhores do que as setas. Sim, o único benefício do uso hjkl
sobre 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 l
principais 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 l
tecla pressionada? Não, claro que não.
Felizmente, a maioria dos kits de ferramentas da GUI fornece combinações como Ctrl+Right
essa, 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 14k
com a ajuda de relativenumber
é ótimo, mas e os movimentos horizontais? Para movimentos grandes, hjkl
na 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 hjkl
e na maioria das vezes muito mais lógicos e intuitivos se você estiver acostumado Ctrl+Right
e amigos.
Mudar de <Right><Right><Right><Right><Right><Right><Right><Right><Right>
a lllllllll
ou 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, hjkl
tenha 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.
hjkl
é inútil, mas hjkl
é útil.
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, ESC
ele seria interpretado como "sair do modo de inserção" e, a seguir, os seguintes [ A
itens 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.
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.
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 hjkl
teclas.
ESC [ A
que é o que você está se referindo?
ESC [ A
é um terminal DEC VT-100 (o terminal ANSI foi fortemente derivado do DEC VT-100). IIRC, ESC A
era a flecha ADM-3A, ou possivelmente a flecha DEC VT-52. O ponto permanece o mesmo, no entanto, o ESC
caractere enviado como parte da tecla de seta foi facilmente confundido com o ESC
digitado manualmente.
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
, o
ou cw
que é 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, hjkl
se 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 ESC
emitir 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 ESC
tecla furiosa e repetidamente, como todo mundo.)
vi
a 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".
Sim, por muitos dos motivos mencionados acima, vi
foi 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 hjkl
navegação em vi
algumas 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 ".
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.
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 I
para 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 0
e 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á.
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.
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 "