Por qué no se recomiendan las teclas de flecha en Vim


125

"¡Nunca uses las teclas de flecha en Vim!"

Escuché esto de un orador al azar, pero no tuve la oportunidad de preguntarle por qué. Además, si no usa las teclas de flecha, ¿cómo puede mover el cursor en el modo Insertar ?


66
Las respuestas históricas a esta pregunta son interesantes. Los religiosos diatriban menos.
Isaac Rabinovitch

55
Buena pregunta. Esto siempre me molesta sobre vi [m], como usuario de teclado Dvorak realmente apesta.
wim

32
Recuerdo cuando usé vi por primera vez, hace muchos años, un colega senior me aconsejó "Asegúrese de aprender a usar las teclas h, j, k y l porque un día terminará en la máquina en el sitio de un cliente donde la flecha las teclas no funcionan, y lucirás como un completo idiota si ni siquiera puedes trabajar vi ".
Ergwun

1
En el modo de inserción aún puede mover el cursor usando Ctrl-O y luego un comando de modo normal, y volverá al modo de inserción. Verifique también CTRL-G CTRL-J y CTRL-G CTRL-K que moverán el cursor a la línea siguiente y anterior, en la columna que comenzó a insertar.
Benoit

1
He desarrollado una gran cantidad de malos hábitos vi [m] a lo largo de los años. Creo que necesito usarlo en una conexión muy lenta, para obligarme a usar mejores hábitos.
aidan

Respuestas:


172

El uso de las teclas de flecha se considera un mal hábito, porque si está usando las teclas de flecha, probablemente se esté perdiendo muchas de las hermosas características de vim.

Cuando las personas comienzan a usar vim por primera vez, tienden a permanecer en modo de inserción, ya que esto se parece más a la edición de texto convencional. Sin embargo, para ser efectivo en vim, solo debe estar en modo de inserción cuando realmente está ingresando texto. Si desea mover el cursor, debe estar en modo normal. Deberías estar en modo normal por defecto.

En el modo normal, hay un millón de accesos directos para moverse. Puede usar hjklpara moverse un espacio a la vez, o puede moverse por palabras, párrafos, etc. Si está en modo normal, no tiene sentido usar las teclas de flecha en lugar de hjklporque están más lejos.

Existe la actitud de que si está usando las teclas de flecha, está usando vim "incorrecto". La verdad es que vim tiene una curva de aprendizaje realmente muy empinada, así que mientras aprendes haz lo que sea que te mantenga cuerdo. Cuando comencé a usar vim, hice todo de forma "incorrecta" y no tuve ningún problema para romper los hábitos una vez que aprendí más de los comandos de vim.

Como ejemplo, cuando comencé, digamos que quería cambiar el texto entre comillas:

String mystring = "I want to change this";

Entraría en modo de inserción, me movería al final de la cadena con las teclas de flecha, presionaría la tecla de retroceso hasta que la cadena desapareciera e ingresaría el nuevo texto.

Una forma mucho mejor es colocar el cursor en cualquier lugar de la cadena (modo normal) y luego presionar ci". Esta voluntad change in ". Eliminará todo entre las comillas y lo pondrá en modo de inserción para que pueda ingresar el nuevo texto.


44
@ ott-- ci<y ci)funciona también, y no tiene que mover la mano del teclado al mouse. Si desea navegar hasta el inicio de los corchetes y luego cambiar el contenido f(ci(funciona.
Matthew Finlay

66
"coloque el cursor en cualquier lugar de la cadena", y nuevamente, mientras que en el modo de inserción usaría las flechas para llegar allí, en el modo normal podría hacer /wanty presionar enter para aterrizar en la palabra 'querer', luego haga ci".
Nathan Long

8
¡Hola, esto está bien! Qué manera tan rápida y poderosa de mover el cursor. La única forma de mejorarlo sería de alguna manera apuntar mágicamente a donde quería el cursor, y hacer que salte allí. Quizás podamos inventar algo. Creo que deberíamos llamarlo un "ratón".
Matthew Scouten

18
@MatthewScouten Nadie afirma que vim sea más simple que un mouse. Sin embargo, con un poco de práctica, es mucho, mucho más rápido. Usar un mouse es como apuntar y gruñir para transmitir tu punto. Vim te permite hablar en oraciones completas.
Dean

44
Romper hábitos es una buena respuesta, pero evitar por la fuerza que alguien realice una actividad normal es fascista. Peor aún, la usabilidad de ( hjkl): mapeo upy down2 teclas que son indistinguibles verticalmente entre sí, y mucho menos de las teclas izquierda y derecha ..... es una demostración trágica de la arrogancia ideológicamente cegada.
Nueva Alejandría

93

Colocación clave

En resumen, Vimutiliza las hjklteclas ya que la interfaz de navegación se debe a que es un remanente del antiguo terminal "ADM-3A", que tenía estas teclas marcadas con flechas.

Teclado

Como vimse deriva de vi, utiliza las mismas claves hjkl.

Nuevos hábitos

El reemplazo basado en letras para las teclas de flecha le permite navegar por el texto sin apartar las manos de la configuración de escritura estándar . Esto podría decirse que es más eficiente y más rápido que mover la mano para presionar las teclas de flecha. Como se describe en la referencia n. ° 2 (ver recursos), este no es el final de las ventajas de esto: VIM tiene muchos otros atajos a los que puede acceder sin mover las manos.

Recursos y modo de inserción

Hay algunas respuestas muy detalladas y precisas a las 2 partes de su pregunta: en términos de reemplazo de la tecla de flecha, he respondido de manera rápida y resumida, sin embargo, para su pregunta de inserción , consulte los recursos enumerados a continuación.


2
Sin mencionar que las teclas hjkl son mucho más eficientes que mover las manos hacia las teclas de flecha.
sixtyfootersdude

2
Esto no responde la pregunta, solo explica por qué se elige hjkl .
Matsemann

3
Esta es una historia verdadera e interesante, pero el OP le pregunta cómo mueve el cursor en modo de inserción . hjklno funciona en modo de inserción, entonces, ¿cómo es esto una respuesta a la pregunta?
LarsH

3
@Kruug, la primera parte de la pregunta es por qué alguien dijo que nunca usara las teclas de flecha en vim. El hecho de que pueda usar hjklen vim no dice por qué alguien nunca debería usar las teclas de flecha, así como el hecho de que pueda andar en bicicleta al trabajo no explica por qué alguien me diría que nunca trote.
LarsH

1
Ahora entiendo por qué Vim usa escape para salir del modo de inserción ^^ ¡Imagen genial!
Étienne

56

Ese estúpido mantra a menudo lo repiten los mecanógrafos tácticos para quienes la fila de la casa es como una segunda columna vertebral o los mecanógrafos no táctiles que quieren verse bien. Para los mecanógrafos no táctiles, la fila de inicio simplemente no es tan especial y mover ligeramente la mano derecha para alcanzar las flechas no es un problema en absoluto.

Lo importante es considerar lo que las personas que repiten ese mantra proponen usar en su lugar.

La mayoría de las veces, insisten en usar hjkl.

Si omitimos el hecho de que estas teclas solo se usan porque el teclado utilizado por el autor de vi no tenía teclas de flecha físicas y, por lo tanto, cualquier argumento en contra de las teclas de flecha es solo racionalización, hjklde todos modos son marginalmente mejores que las flechas. Sí, el único beneficio de usar hjklsobre las flechas es que omites ese pequeño movimiento de la mano derecha hacia y desde las flechas. Si ese beneficio vale la pena, es su decisión.

Pero ese movimiento de la mano derecha no es la razón por la que usar solo las flechas es ineficiente. Es ineficiente porque lo limitan a moverse carácter por carácter y línea por línea, mientras que la mayoría del movimiento necesario para editar texto tiene un rango mucho mayor.

Martillar la flecha derecha 13 veces es ineficiente y aburrido. ¿Es que mejor para martillar las lclaves 13 veces? No. Es igualmente estúpido.

Mantener presionada la flecha derecha hasta llegar a su objetivo es menos aburrido, pero es propenso a errores y casi tan ineficiente como 13 golpes debido a la desaceleración necesaria y no determinista al final. ¿Es que mejor mantener la ltecla pulsada? No claro que no.

Afortunadamente, la mayoría de los kits de herramientas de la GUI proporcionan combinaciones como Ctrl+Rightesa que nos permiten movernos palabra por palabra o saltar a EOL, al siguiente párrafo o lo que sea. Estos atajos nos ayudan a navegar mucho más rápido y de manera más inteligente que con flechas simples. ¿Tenemos lo mismo con hjkl? No, nosotros no. Podemos usar un conteo, si queremos, pero ¿quién quiere contar los personajes para cada movimiento? Hacer 14kcon la ayuda de relativenumberes genial, pero ¿qué pasa con los movimientos horizontales? Para movimientos grandes, en hjklrealidad son peores que modificadores + flechas. ¿Y adivina qué? Grandes movimientos son lo que más necesitamos.

Pero somos bastardos afortunados, nuestro editor favorito tiene docenas de movimientos que corren en círculos alrededor de las flechas y hjkl : bBeEwW/?*#{}()y así sucesivamente. Estos comandos son muchísimo más poderosos que hjkly, en su mayor parte, mucho más lógicos e intuitivos si estás acostumbrado Ctrl+Righty amigos.

El cambio de <Right><Right><Right><Right><Right><Right><Right><Right><Right>que lllllllllni siquiera 9les ridículamente inútil.

Cambiar de <Right><Right><Right><Right><Right><Right><Right><Right><Right>a <C-Right>es mucho mejor. A partir de ahí, cambiar a wes fácil y rápido. ¡No necesitas <nop>tus flechas!

Si estos comandos son más útiles, más potentes y más intuitivos que hjkl, ¿por qué demonios tantos bloggers y comentaristas insisten en reemplazar las flechas con hjkl?

Yo tengo. Ni idea.

En conclusión, hjkltenga su lugar en nuestro cinturón de herramientas porque siempre tenemos que movernos por 2 caracteres o líneas, pero a menudo son el árbol que oculta el bosque. Tenga cuidado con las personas que predican contra las flechas: lo que tienen reservado para usted puede no ser mejor en absoluto.


Al principio, pensé que ibas a decir que 'hjkl' son inútiles, pero una buena captura, los movimientos de palabras / párrafos / oraciones son mucho más útiles que el mantra con respecto al movimiento de un solo carácter.
Xavier T.

1
Gracias. Tuve una discusión similar sobre HN el otro día que se descarriló debido a una redacción deficiente. Enfocar los esfuerzos de uno hjkl es inútil, pero hjklson útiles.
romainl

55
Lo mismo aquí: al final me gustó su respuesta, pero creo que el tono se vio como innecesariamente despotricando / trolling / flameante.
UncleZeiv

No los llame inútiles, el argumento sobre la velocidad es bueno, y la forma en que HJKL funciona con otros comandos VIM de una manera que las teclas de flecha no lo hacen también es importante.
Aviator45003

@TC ¿Algún ejemplo para hacer que todo el debate sea más interesante?
romainl

18

Otros han descrito por qué se prefieren otras formas de mover el cursor, pero se ha dicho poco para responder a la pregunta, ¿por qué se considera una mala idea usar las teclas de flecha?

Creo que la razón principal (y @Squeezy algo aludió a esto) es que en los días de terminales como el VT100, las teclas de flecha producían una secuencia de escape que fue interpretada por el programa en ejecución. (Dado que las teclas de flecha no están representadas en ASCII, la escritura de las teclas de flecha debe comunicarse de alguna manera "especial".) La secuencia de escape era típicamente algo así como

ESC [ A

dependiendo de las propiedades de su terminal, su conexión y su modo de cursor . Si su shell o su programa no estuvieran configurados correctamente para el terminal, no entenderían la secuencia de escape como una tecla de flecha.

Cuando estaba en la universidad, iniciando sesión en Ultrix a través de terminales VT100, si presionaba una flecha mientras estaba en vi en modo de inserción, ESCse interpretaría como "salir del modo de inserción", y luego los siguientes [ Ase interpretaron como comandos de modo normal . ¡Obviamente no es lo que el usuario quiere o espera!

Hoy en día, el manejo de terminales y teclas de flecha parece ser más robusto, especialmente en entornos GUI. Pero los mismos problemas aún ocurren cuando se usa vim sobre SSH o Telnet.


14

El uso de las teclas de flecha está mal visto porque te obliga a mover los dedos desde el inicio cuando usas el diseño QWERTY y desde el teclado de caracteres (?) Cuando usas Dvorak o cualquier otro diseño.


44
Guau. ¿Seriamente? No quiero creer eso, ya que implicaría que las personas que diseñaron Vim pensarían que sus usuarios pasan más tiempo escribiendo que pensando.
Renan

13
¿Por qué mover tu mano implica pensar?
EBGreen

8
bueno, cuando tenía que hacerlo en la escuela, tenías que presionar esc antes de poder usar la navegación hjkl, así que ya habías quitado tu mano izquierda de la fila de inicio para llevar tu dedo meñique a Esc. Recuerdo que para retroceder un espacio e insertar un carácter, tenía que ingresar 'Esc: hola' y luego escribir el carácter que deseaba insertar. Eso no es tan útil.
Frank Thomas

1
@ Renan: está asumiendo que 'escribir' significa 'insertar texto'. Tengo mis dedos en la fila en casa cuando estoy leyendo y pensando, también, porque el teclado es como navegar en Vim: buscar a mover, abrir otros archivos para comparar el código, saltando alrededor de corregir los errores de ortografía, etc.
Nathan Largo

2
@Renan - 1) subestimas los ahorros y 2) las pequeñas cosas se suman. He visto a usuarios avanzados de Vim escribiendo con teclado editar a 10 veces la velocidad de otros desarrolladores. A suficiente velocidad, la edición se vuelve automática y no interrumpe los pensamientos o el flujo. Es un placer trabajar de esta manera, por lo que flota mi barco, pero apuesto a que es un aumento de productividad mayor de lo que piensas. Intenta ver codificadores como Gary Bernhardt como ejemplo.
Nathan Long

10

Las teclas de flecha presentan un problema, ya se conocía en vi, en conexiones lentas, como en el módem de 1200 baudios. La flecha se traduce en una secuencia ESC como ESC a. Ahora, cuando el tiempo entre ESC y a es demasiado largo, terminas escuchando un BEL (o viendo un flash) seguido del modo de agregado. Esto no aparecerá con las hjklteclas.


Creo que ESC [ Aes a lo que te refieres?
LarsH

2
ESC [ Aes un terminal DEC VT-100 (el terminal ANSI fue fuertemente derivado del DEC VT-100) flecha. IIRC, ESC Aera la flecha ADM-3A, o posiblemente la flecha DEC VT-52. El punto sigue siendo el mismo, sin embargo, el ESCcarácter enviado como parte de la tecla de flecha se confundió fácilmente con el ESCescrito manualmente.
RBerteig

@RBerteig: Es bueno saberlo.
LarsH

5

Con respecto a la segunda pregunta:

[I] f no utiliza las teclas de flecha, ¿cómo puede mover el cursor en el modo Insertar?

Para quien es maestro y, por lo tanto, desdeña las teclas de flecha, el concepto de "modo" tampoco existe.

El maestro agrega texto nuevo utilizando no un modo de inserción, sino más bien completar los comandos de inserción o reemplazo que comienzan con un código de operación como i, oo cwque es seguido por texto de carga útil, y finalizado por ESC. Los comandos tienen una sintaxis, por lo que la máquina atraviesa estados al aceptar la sintaxis de los comandos, pero en el modelo maestro del editor, estos no dan lugar a un modo. Lo que los aprendices ingenuamente llaman "modo", es para el maestro un estado de comando inacabado, una situación de lo más aborrecible que el maestro evita.

Cada vez que el maestro se da cuenta, mientras está en medio de un comando de inserción o reemplazo, ese texto debe insertarse o eliminarse en una posición distinta a la siguiente posición de caracteres indicada por el cursor, el maestro termina el comando de inserción y desata una de las docenas de comandos eficientes. comandos de movimiento (recurrir a los humildes hjklsi una forma más poderosa obviamente no es aplicable).

Además, dado que el maestro rara vez se distrae de tal manera que deja un comando sin terminar, el maestro rara vez, si es que alguna vez, hace que el editor ESCemita un pitido debido a la entrada de un superfluo emitido "por si acaso".

(Sin embargo, cuando la red está retrasada o la máquina está empantanada, el maestro golpea la ESCllave con furia y repetidamente, como todos los demás).


2
Recuerde, si vila entrada de comando de inserción es un modo, para ser justos, tenemos que identificar todos esos modos en otros editores y llamarlos modales. Por ejemplo, cuando presionamos Ctrl-X en Emacs, estamos en un "modo" en el que es posible, por ejemplo, presionar Ctrl-S para guardar el documento, que no funcionará fuera de ese "modo".
Kaz

5
  • Las teclas de flecha pueden no funcionar bien en ciertos entornos. hjkl son caracteres normales y bien entendidos por todo tipo de terminales.
  • No mueve el cursor en modo Insertar (excepto para Retroceder y corregir un error tipográfico breve), la idea de vi es ingresar al modo Insertar solo para ingresar algo. El movimiento se realiza en modo normal
  • Si puede, debe evitar usar hjkl para moverse donde sea aplicable y, en su lugar, solo usarlos para obtener instrucciones. Existen numerosas opciones para moverse en vi , consulte: http://vim.wikia.com/wiki/Moving_around

En realidad, puede mover el cursor en modo de inserción, al menos a la izquierda, usando la tecla de retroceso. Pero estoy de acuerdo en que no puedes moverlo libremente.
LarsH

Intenté expresar que no QUIERES mover el cursor en modo Insertar .
Squeezy

Lo siento, no entendí lo que escribiste diciendo que no puedes mover el cursor en modo de inserción. En realidad, quiero mover el cursor en modo de inserción: si estoy ingresando un texto nuevo y presiono la tecla incorrecta, quiero usar la tecla de retroceso para corregirlo. Pero más allá de ese uso limitado, estoy de acuerdo.
LarsH

3

Sí, por muchas de las razones mencionadas anteriormente, vioriginalmente se escribió para usar hjkl, pero " nunca " es una declaración bastante grande.

Tiendo a modificar vim(y otras herramientas que uso) para comportarme como quiero. Esto funciona muy bien en mi máquina, pero como desarrollador incrustado, no siempre elijo lo que hay en las máquinas que soporto. Me encuentro con máquinas más antiguas que solo tienen hjklnavegación en viocasiones. Termino recibiendo los códigos de control insertados en mi archivo por un segundo o dos hasta que vuelva a romper mi hábito y cambie a hjkl.

¡La única razón válida que se me ocurre para "nunca usar las teclas de flecha en Vim!" es para que pueda usar máquinas que no pueden manejar las teclas de flecha. Eso parece una razón bastante débil para decir " nunca ".


3

si no usa las teclas de flecha, ¿cómo puede mover el cursor en el modo Insertar?

La razón principal por la que desaconsejo a las personas que usen las teclas de flecha es explícitamente porque le permite moverse mientras está en modo de inserción.

Uno de los problemas más extraños con el aprendizaje de vim para los recién llegados es que el comando de deshacer de vim funciona deshaciendo la última acción , no la última pulsación de tecla . Muchos de mis amigos terminan permaneciendo en modo de inserción todo el tiempo porque nunca hay una razón para dejarlo. Cuando me preguntan "¿Cómo deshago?" Respondo con "presione la letra u desde el modo de comando" se frustran cuando vim borra todo el archivo.

"Vim es un editor de texto bastante inútil si no puede deshacer las cosas bien".

Es difícil usar una herramienta antes de aprender cómo hacerlo.

Vim se vuelve útil solo después de haber aprendido cómo usarlo. El poder de vim está en cómo puedes decirle "haz eso otra vez" o "deshace esa cosa" o "haz eso solo cuando golpeo esta tecla de acceso rápido macro" a través de la memoria muscular subconsciente. Si "esa cosa" se convierte en "escriba el archivo completo de principio a fin", estoy de acuerdo, vim no es tan útil en absoluto.

Es por esa razón que solo debes ingresar texto cuando estás dentro insert mode. Evitar las teclas de flecha es solo una forma que hemos encontrado para ayudarlo a convertirse en un mejor usuario de vim, más rápido.


0

Ejecutar vim mientras estaba en mi dispositivo Android, que ejecuta un demonio ssh en kbox, me llevó a salir de mi zona de confort. Dado que el Emulador de Terminal Anroid en el dispositivo usa botones de volumen para reemplazar los combos de teclas especiales (ctrl + lo que sea), algunas teclas que normalmente usaría en el teclado no funcionan en esta situación.

Por ejemplo, la tecla Insertar no funciona en este entorno, por lo que estoy usando Ipara cambiar al modo de inserción. La tecla Esc, que generalmente uso para escapar del modo de inserción, tampoco funciona, por lo que estoy usando ctrl + [para escapar. Las teclas Inicio y Fin no funcionan como estoy acostumbrado. En cambio, confío en los atajos 0y $atajos con los que nunca me he molestado antes para llegar al principio o al final de una línea.

De todos modos, las teclas de flecha todavía funcionan como de costumbre en mi situación, pero es bueno saber que los atajos de teclado minimalistas están ahí.


0

simplemente escriba el siguiente comando antes de escribir en vim: -

  1. Esc
  2. : establecer nocp

Un problema con esto es que puede que tenga que escribirlo cada vez.


bueno, esto sería útil cuando desee utilizar la tecla de flecha en modo de inserción
0decimal0

0

Aquí está mi 2 ¢.

Haz lo que te haga sentir cómodo. Si usa editores diferentes, podría ser más fácil usar las teclas de flecha para mantener la coherencia.

Por otro lado, es absolutamente brillante que vi (y vim) no necesitan teclas especiales, excepto quizás. Probablemente podría hackear un viejo sistema eléctrico de IBM para que funcione como terminal.

La otra cosa a tener en cuenta es que las teclas de flecha pueden no funcionar como se esperaba. He usado terminales donde no funcionaban. No estoy seguro exactamente cómo se implementan en Vim, pero estoy bastante seguro de que no es uniforme. Mi memoria irregular incluso parece recordar una implementación en la que se implementaron como macros vim.


0

El nombre del juego con editores de texto mejorados parece estar "moviéndose rápidamente" y reduciendo el movimiento perdido / repetitivo. Se pierde algo de tiempo cuando se mueve de las teclas de letras a las teclas de flecha (según las dimensiones del teclado) y luego de regreso a la fila de inicio. Pero si puede acceder a la tecla ESC con los modos de cambio de dedo meñique o anular izquierdo se convierte en un movimiento fluido y en el transcurso de una sesión de edición habrá una ganancia de velocidad.

Y esta es la clave para la segunda parte de su pregunta: salga del modo de inserción presionando ESC con su izquierda y muévase con hjkl con su derecha. Eventualmente podrás hacer esto sin perder el ritmo.

Dicho esto, nunca llegué a ningún lado con Vim hasta que probé algunas de las cosas mencionadas aquí , la más importante es la sección " Obtener eficiencia: asignaciones de accesos directos "

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.