"¡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 ?
"¡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 ?
Respuestas:
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 hjkl
para 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 hjkl
porque 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.
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.
/want
y presionar enter para aterrizar en la palabra 'querer', luego haga ci"
.
hjkl
): mapeo up
y down
2 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.
En resumen, Vim
utiliza las hjkl
teclas 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.
Como
vim
se deriva devi
, utiliza las mismas claves hjkl.
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.
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.
hjkl
no funciona en modo de inserción, entonces, ¿cómo es esto una respuesta a la pregunta?
hjkl
en 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.
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, hjkl
de todos modos son marginalmente mejores que las flechas. Sí, el único beneficio de usar hjkl
sobre 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 l
claves 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 l
tecla pulsada? No claro que no.
Afortunadamente, la mayoría de los kits de herramientas de la GUI proporcionan combinaciones como Ctrl+Right
esa 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 14k
con la ayuda de relativenumber
es genial, pero ¿qué pasa con los movimientos horizontales? Para movimientos grandes, en hjkl
realidad 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 hjkl
y, en su mayor parte, mucho más lógicos e intuitivos si estás acostumbrado Ctrl+Right
y amigos.
El cambio de <Right><Right><Right><Right><Right><Right><Right><Right><Right>
que lllllllll
ni siquiera 9l
es 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 w
es 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, hjkl
tenga 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.
hjkl
es inútil, pero hjkl
son útiles.
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, ESC
se interpretaría como "salir del modo de inserción", y luego los siguientes [ A
se 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.
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.
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 hjkl
teclas.
ESC [ A
es a lo que te refieres?
ESC [ A
es un terminal DEC VT-100 (el terminal ANSI fue fuertemente derivado del DEC VT-100) flecha. IIRC, ESC A
era la flecha ADM-3A, o posiblemente la flecha DEC VT-52. El punto sigue siendo el mismo, sin embargo, el ESC
carácter enviado como parte de la tecla de flecha se confundió fácilmente con el ESC
escrito manualmente.
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
, o
o cw
que 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 hjkl
si 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 ESC
emita 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 ESC
llave con furia y repetidamente, como todos los demás).
vi
la 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".
Sí, por muchas de las razones mencionadas anteriormente, vi
originalmente 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 hjkl
navegación en vi
ocasiones. 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 ".
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.
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 I
para 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 0
y $
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í.
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.
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 "