Recorriendo texto en modo Insertar

322

Mientras está en modo Insertar en Vim, ¿hay alguna forma de atravesar el texto moviendo algunos caracteres hacia adelante y hacia atrás que no sea usar las teclas de flecha?

Si presiono h, j, ky lmientras que en el modo de inserción, los personajes reales se imprimen en la pantalla en lugar de moverse a través del texto.

La forma en que lo estoy haciendo en este momento es tener que recurrir a Ctrl+ [( Esc) y atravesar el texto; pero obviamente eso no es productivo.

Andreas Grech
fuente
Como consejo adicional: también es útil si asigna el escape a una combinación de teclas más cercana (es decir imap jk <Esc>) para que no tenga que romper su impulso y alcanzar su teclado para presionar la tecla.
tsujin 05 de
3
Me gusta ( <ESC>) mapeado en kjlugar de jk; ¡Mi amigo Dijkstra tiene la culpa!
Dr Beco
77
Tengo jky kj, así que solo lo presiono como un gran botón con dos dedos y no importa el orden en el que vuelvo a la normalidad.
Edu Ruiz

Respuestas:

649

Parece que usas mal vim, pero es probable que sea por no estar muy familiarizado con él.

La forma correcta es presionar Esc, ir a donde desea hacer una pequeña corrección, arreglarla, regresar y seguir editando. Es efectivo porque Vim tiene muchos más movimientos que el personaje habitual hacia adelante / atrás / arriba / abajo. Después de que aprenda más de ellos, esto será más productivo.

Aquí hay un par de casos de uso:

  • Accidentalmente escribiste "accidentalmente". No hay problema, la secuencia EscFfrdAcorregirá el error y lo llevará de regreso a donde estaba editando. El Ffmovimiento moverá el cursor hacia atrás hasta el primer carácter "f" encontrado. Compare eso con Ctrl+ DeldEnd, que hace prácticamente lo mismo en un editor informal, pero toma más teclas y hace que mueva la mano fuera del área alfanumérica del teclado.
  • Escribiste accidentalmente "escribiste accidentalmente", pero quieres corregirlo a "escribiste intencionalmente". Luego Esc2bcwborrará la palabra que desea corregir y lo llevará al modo de inserción, para que pueda volver a escribirla de inmediato. Para volver a la edición, simplemente presione en Alugar de End, para que no tenga que mover la mano para alcanzar la Endtecla.
  • Escribiste accidentalmente "mouse" en lugar de "mouse". No hay problema: el viejo Ctrl+ bueno weliminará la palabra anterior sin salir del modo de inserción. Y resulta que es mucho más rápido borrar una palabra pequeña que corregir errores dentro de ella. ¡Estoy tan acostumbrado que cerré la página del navegador cuando estaba escribiendo este mensaje ...!
  • El recuento de repeticiones está en gran medida infrautilizado. Antes de hacer un movimiento, puede escribir un número; y el movimiento se repetirá este número de veces. Por ejemplo, 15htraerá su cursor 15 caracteres hacia atrás y 4j lo moverá 4 líneas hacia abajo. Comience a usarlos y se acostumbrará pronto. Si cometió un error a diez caracteres de su cursor, descubrirá que presionar la tecla 10 veces es mucho más lento que el enfoque iterativo para mover el cursor. Por lo tanto, puede escribir rápidamente las teclas 12h(como una aproximación aproximada de cuántos caracteres necesita retroceder para mover el cursor) e inmediatamente avanzar dos veces con llpara corregir rápidamente el error.

Pero, si aún desea hacer pequeños recorridos de texto sin salir del modo de inserción, siga los consejos de rson y use + . Tomando el primer ejemplo que mencioné anteriormente, + lo moverá a un carácter "f" anterior y lo dejará en modo de inserción.CtrlOCtrlOFf

P Shved
fuente
33
+1 Excelente respuesta y gracias por todos los ejemplos que diste!
Andreas Grech el
79
También vale la pena señalar que puede usar Ctrl+opara emitir un solo comando en modo normal. Esto a veces puede llevarte a donde quieres estar, especialmente cuando se combina con los comandos de movimiento t / T yf / F.
Randy Morris el
66
"Parece que usas mal vim, pero es probable que no estés muy familiarizado con él". Es un poco condescendiente. ¿No?
David Rivers
17
Esta es una gran idea de cómo usar Vim correctamente. Sin embargo, creo que presionar "Esc" es una molestia, por lo que creo que vale la pena señalar que puede asignar una tecla más accesible a esa función, por ejemplo, "imap jj <esc>".
Simétrico
25
Para corregir un error tipográfico que debería no dejar el modo de inserción. Vim es poderoso porque creas acciones atómicas y repetibles. Insertar un error tipográfico y corregirlo crea dos acciones separadas. La forma correcta de arreglar un error tipográfico para hacerlo sin salir del modo de inserción. Si eso significa usar las teclas de flecha para navegar allí, está bien. Vim tiene algunas combinaciones de teclas para navegar en modo de inserción. Compruebe :h ins-special-keys. ctrl-h: retroceso,: ctrl-weliminar palabra,: ctrl-ueliminar al comienzo de la línea alt-b,: retroceder una palabra.
everett1992
152

Mientras está en modo de inserción , use CtrlOpara ir al modo normal con solo un comando:

CTRL-O h  move cursor left 
CTRL-O l  move cursor right
CTRL-O j  move cursor down
CTRL-O k  move cursor up

que es probablemente la forma más sencilla de hacer lo que quieres y es fácil de recordar.

Otras teclas de control muy útiles en modo de inserción:

CTRL-W    delete word to the left of cursor
CTRL-O D  delete everything to the right of cursor
CTRL-U    delete everything to the left of cursor
CTRL-H    backspace/delete
CTRL-J    insert newline (easier than reaching for the return key)
CTRL-T    indent current line
CTRL-D    un-indent current line

Esto eliminará muchos interruptores innecesarios para volver al modo normal.

Chris Sattinger
fuente
13
Gracias. Esto debe considerarse la respuesta correcta. En realidad es útil.
Atcold
1
En mi Mac, es minúscula o no mayúscula O. ¿Es diferente de "vim estándar"? Veo muchos lugares donde parecen decir mayúsculas (a menos que sea solo una escritura descuidada). ¿Puedes confirmar?
Floris
Ok muy útil. Sin embargo, una combinación interesante que tengo dificultades para encontrar y esta es eliminar la línea. Algo muy infravalorado en caso de insertar accidentalmente una línea.
patrik
55
@Floris Vim no distingue entre letras mayúsculas y minúsculas para combinaciones de Ctrl. Es por eso que no es posible asignar ctrl + shift + algo.
Mahmoud Al-Qudsi
92

Modo de inserción

Movimiento

hjkl

A pesar de lo que dijo Pavel Shved , que probablemente sea más aconsejable acostumbrarse al Escmodo Insertar, aquí hay un conjunto de ejemplos de asignaciones para una navegación rápida dentro del modo Insertar:

" provide hjkl movements in Insert mode via the <Alt> modifier key
inoremap <A-h> <C-o>h
inoremap <A-j> <C-o>j
inoremap <A-k> <C-o>k
inoremap <A-l> <C-o>l

Esto hará que Alt+ hen el modo Insertar quede un carácter a la izquierda, Alt+ jhacia abajo y así sucesivamente, de manera análoga al hjklmodo Normal.

Debe copiar ese código en su archivo vimrc para que se cargue cada vez que inicie vim (puede abrirlo escribiendo :new $myvimrccomenzando en modo Normal).


Cualquier movimiento en modo normal

Como la Alttecla modificadora no está asignada (a algo importante) de forma predeterminada, puede extraer de la misma manera otra (o toda) funcionalidad del modo Normal al modo Insertar. Por ejemplo:
pasar al comienzo de la palabra actual con Alt+ b:

inoremap <A-b> <C-o>b
inoremap <A-w> <C-o>w


(Otros usos de Alten modo Insertar)

Vale la pena mencionar que puede haber mejores usos para la Altclave que replicar el comportamiento en modo Normal: por ejemplo, aquí hay asignaciones para copiar desde una línea adyacente la parte de la columna actual hasta el final de la línea:

" Insert the rest of the line below the cursor.
" Mnemonic: Elevate characters from below line
inoremap <A-e> 
    \<Esc>
    \jl
        \y$
    \hk
        \p
        \a
" Insert the rest of the line above the cursor.
" Mnemonic:  Y depicts a funnel, through which the above line's characters pour onto the current line.
inoremap <A-y> 
    \<Esc>
    \kl
        \y$
    \hj
        \p
        \a

(Utilicé la \ continuación de línea y la sangría para aumentar la claridad: los comandos se interpretan como si estuvieran escritos en una sola línea).


Teclas de acceso rápido incorporadas para editar

CTRL-H   delete the character  in front of the cursor (same as <Backspace>)
CTRL-W   delete the word       in front of the cursor
CTRL-U   delete all characters in front of the cursor (influenced by the 'backspace' option)

(No hay teclas de acceso rápido incorporadas notables para el movimiento en modo Insertar).

Referencia: :help insert-index


Modo de línea de comandos

Este conjunto de asignaciones hace que los movimientosAlt + superiores estén disponibles en la línea de comandos:hjkl

" provide hjkl movements in Command-line mode via the <Alt> modifier key
cnoremap <A-h> <Left>
cnoremap <A-j> <Down>
cnoremap <A-k> <Up>
cnoremap <A-l> <Right>

Alternativamente, estas asignaciones agregan los movimientos tanto al modo Insertar como al modo de línea de comandos de una vez:

" provide hjkl movements in Insert mode and Command-line mode via the <Alt> modifier key
noremap! <A-h> <Left>
noremap! <A-j> <Down>
noremap! <A-k> <Up>
noremap! <A-l> <Right>


Los comandos de mapeo para pasar los comandos del modo Normal al modo de línea de comandos se ven un poco diferentes de los comandos de mapeo del modo Insertar (porque el modo de línea de comandos carece del modo Insertar Ctrl+ O):

" Normal mode command(s) go… --v <-- here
cnoremap <expr> <A-h> &cedit. 'h' .'<C-c>'
cnoremap <expr> <A-j> &cedit. 'j' .'<C-c>'
cnoremap <expr> <A-k> &cedit. 'k' .'<C-c>'
cnoremap <expr> <A-l> &cedit. 'l' .'<C-c>'

cnoremap <expr> <A-b> &cedit. 'b' .'<C-c>'
cnoremap <expr> <A-w> &cedit. 'w' .'<C-c>'


Teclas de acceso rápido incorporadas para movimiento y edición

CTRL-B       cursor to beginning of command-line
CTRL-E       cursor to end       of command-line

CTRL-F       opens the command-line window (unless a different key is specified in 'cedit')

CTRL-H       delete the character  in front of the cursor (same as <Backspace>)
CTRL-W       delete the word       in front of the cursor
CTRL-U       delete all characters in front of the cursor

CTRL-P       recall previous command-line from history (that matches pattern in front of the cursor)
CTRL-N       recall next     command-line from history (that matches pattern in front of the cursor)
<Up>         recall previous command-line from history (that matches pattern in front of the cursor)
<Down>       recall next     command-line from history (that matches pattern in front of the cursor)
<S-Up>       recall previous command-line from history
<S-Down>     recall next     command-line from history
<PageUp>     recall previous command-line from history
<PageDown>   recall next     command-line from history

<S-Left>     cursor one word left
<C-Left>     cursor one word left
<S-Right>    cursor one word right
<C-Right>    cursor one word right

<LeftMouse>  cursor at mouse click

Referencia: :help ex-edit-index

Aaron Thoma
fuente
@YugalJindle: ¡Gracias! :) Ahora he agregado información sobre cómo ajustar el modo de línea de comandos. (El enfoque es un poco diferente del modo Insertar).
Aaron Thoma
@Zen: ¿Qué quieres decir con "winkey"? No he hecho referencia a la clave de Windows en mi respuesta. ¿Te refieres a la Altllave?
Aaron Thoma
Shift - izquierda / derecha para mover una palabra completa !! ¿Cómo no supe eso? Gracias.
Floris
en realidad en modo terminal, alt envía automáticamente esc antes de sus comandos ........
Fuseteam
26

Si eres un purista vim, omite leer esta respuesta. OTOH, si eres nuevo en vim y estás buscando algunos consejos útiles que no encontrarás en los cientos de tutoriales y blogs de vim, sigue leyendo ... :-)

Algunas formas no ortodoxas (vim)

Es 2014, y como alguien que ha vuelto recientemente vim, puedo ofrecer algunos puntos de vista y consejos potencialmente contrarios.

Use shift + left o shift + right para atravesar palabras

Si bien la repetición es un concepto poderoso en vim, (personalmente) me resulta extraño que su uso me obligue a contar (líneas, caracteres, palabras, etc.) o adivinar. Mi cerebro generalmente funciona como "Quiero el cursor allí " y no como "Quiero el cursor _5_palabras_a_la_izquierda_". Poder mover rápidamente el cursor y observar visualmente dónde está el punto de inserción de esta manera me permite mantener mi mente en lo que estoy editando en lugar de tener que contar cuántos saltos necesito hacer para llegar a donde necesito editar.

Active el modo de mouse, use la rueda del mouse y haga clic

... para navegar por grandes cuerpos de texto.

La mayoría (todas) de las computadoras modernas tienen un panel táctil que está estrechamente integrado con el teclado (por ejemplo, MacBooks). Los diseñadores industriales han pasado muchos años optimizando estos diseños para que el viejo problema de tener que alejar la mano del teclado ya no sea un problema real. De acuerdo, es si estás acostumbrado a un mouse y no te gusta cambiar, pero para alguien nuevo en vim (como los que pueden encontrar esta publicación a través de una búsqueda), esto no debería ser un gran problema.

Como beneficio adicional, hacer clic + arrastrar lo pone en modo visual

Con el mouse habilitado, hacer clic y arrastrar tiene el efecto de cambiar al modo visual y marcar una región para tirar.

Y usa la rueda de desplazamiento

Usar el mouse (rueda) para desplazarse y hacer clic para colocar el cursor (duh) simplemente funciona. Consulte http://usevim.com/2012/05/16/mouse/ para obtener más información al respecto.

Y entonces...

Estas son las formas más modernas de navegar en vim (usando el mouse, la rueda de desplazamiento, etc.), igualmente efectivas dependiendo de su preferencia de entrada.

HTH

Shyam Habarakada
fuente
66
@MilesRout sí, tuve un descargo de responsabilidad. Pero con toda seriedad, creo que hay una buena proporción de usuarios de vim cuyo cerebro funciona igual que el mío. Es decir ... mi cerebro generalmente funciona como "Quiero el cursor allí" y no como "Quiero el cursor 5_palabras_a_la_izquierda ". Y la forma convencional de vim no funciona tan bien para esas personas. Me encanta vim porque a) está disponible en todas partes yb) tiene características potentes. Sin embargo, no siento la necesidad de cumplir con todos sus mecanismos predeterminados.
Shyam Habarakada
44
@MilesRout Hay mucha religión en torno a este tipo de cosas en vim, así que no voy a debatir contigo sobre esto. El método de conteo de repetición no me ayuda, y la respuesta aceptada también lo llama como algo muy infrautilizado. Solo puedo adivinar por qué ese es el caso. Usar w, b, etc. para navegar a lugares cercanos es genial, pero para ir más lejos, la rueda del mouse funciona mucho mejor para mí. Salud.
Shyam Habarakada
44
+1. No lo entiendo por votación. Hay un descargo de responsabilidad. Tómelo si le gusta y sáltelo si no.
fangmobile.com
Esta es una respuesta muy útil
Slava el
1
Como alguien que recientemente se mudó a VIM, considero que la premisa de esta respuesta es absolutamente acertada. La capacidad de decir instantáneamente la cantidad de repeticiones necesarias para colocar el cursor en un lugar determinado puede o no ser algo que viene con experiencia. En este momento, al igual que @ShyamHabarakada, mi cerebro simplemente no funciona así. Independientemente de lo poco ortodoxo que pueda ser, re-mapeé personalmente fn + hjkl a las teclas de flecha para movimientos muy pequeños. Para grandes movimientos, por lo general, me aproximo a varias repeticiones y luego afino con ellas. Para mí, eso es lo más rápido que puedo conseguir.
Jacoscaz
14

Muchas personas en la comunidad Vim argumentan que no debe navegar en modo Insertar, que no es la forma Vim. Creo que este es un sentimiento incorrecto aprendido al pasar de los editores estándar a Vim.

Vim es más poderoso cuando utiliza sus herramientas para crear acciones o hallazgos atómicos y repetibles.

Está bien navegar mientras está en modo Insertar si está reparando un error que cometió en la misma sesión Insertar. No debe navegar fuera del rango de texto que modificó.

Si comete un error al ingresar texto y sale del modo Insertar para corregirlo, no podrá repetir la acción deseada, .repetirá la corrección.

Vim admite muchas teclas de navegación en modo Insertar. Obviamente, están las teclas de flecha, Inicio y Fin, pero también hay muchos otros atajos. Ver :h ins-special-keys.

everett1992
fuente
4

En GVim, puedes usar el mouse. Pero, sinceramente, ¿qué hay de malo en usar las teclas de flecha? Hay una razón por la que están en un teclado.

Erich Kitzmueller
fuente
99
pero esa razón no está dirigida a los usuarios de vim. Una de las fortalezas centrales de vim es que puede hacer todo tipo de cosas sin tener que perder tiempo de las manos de la fila de inicio del teclado. En particular, los movimientos hjkl.
Aaron Thoma
1
Estoy de acuerdo con @ammoQ. No tiene nada de malo usar las teclas de flecha. Si el uso de las teclas de flecha le brinda más productividad, hágalo.
Eunwoo Song
elogio: uso hjkl con más frecuencia que las teclas de flecha cuando uso vi, pero cambiar de modo se ha convertido en una acción subconsciente para mí.
Erich Kitzmueller
4

Para tener una navegación un poco mejor en modo de inserción, ¿por qué no asignar algunas teclas?

imap <C-b> <Left>
imap <C-f> <Right>
imap <C-e> <End>
imap <C-a> <Home>
" <C-a> is used to repeat last entered text. Override it, if its not needed

Si puede evitar que la tecla Meta funcione en su terminal, puede burlarse del modo emacs aún mejor. La navegación en modo normal es mucho mejor, pero para movimientos más cortos ayuda a permanecer en modo de inserción.

Para saltos más largos, prefiero la siguiente traducción predeterminada:

<Meta-b>    maps to     <Esc><C-left>

Esto cambia al modo normal y retrocede una palabra

Alex
fuente
2

Creo Homey End(y PageUp/ PageDn) también funciona con normalidad, mientras que en el modo de inserción, pero aparte de eso, no creo que hay otras teclas estándar definidos para el recorrido de texto.

Ámbar
fuente
¿pero posiblemente no hay alguna forma de atravesar el texto usando solo las teclas de letras?
Andreas Grech el
55
Ciertamente lo hay, si no quieres poder escribir ciertas letras ...;)
hobbs el
@hobbs ¿Qué tal ctrl + hjkl? Eso debería tener sentido
user4052054
1

Lo siento, pero vim no funciona de esa manera.

Debe cambiar al modo "normal", navegar y luego volver a insertarlo nuevamente.

Johan
fuente
1

Puede crear asignaciones que funcionen en modo de inserción. La forma de hacerlo es a través de inoremap. Tenga en cuenta la 'i' al comienzo del comando (noremap es útil para evitar colisiones de mapas clave). El corolario es 'n' para el modo 'normal'. Puedes suponer lo que vim piensa que es 'normal';)

SIN EMBARGO, realmente desea navegar en texto usando el modo 'normal'. Vim es súper en este tipo de cosas y toda esa potencia está disponible desde el modo normal. Vim ya proporciona formas fáciles de pasar del modo normal al modo de inserción (por ejemplo, i, I, a, A, o, O). El truco es facilitar el acceso al modo normal. La forma de hacerlo es reasignar el escape a una clave más conveniente. Pero necesita uno que no entre en conflicto con su escritura habitual. Yo suelo:

inoremap jj <Esc>

Dado que jj (eso es 2 j's escritos uno tras otro rápidamente) no parece aparecer en mi vocabulario. Otros se reasignarán a donde sea cómodo.

El otro cambio esencial que hago es cambiar las teclas CAPSLOCK y CONTROL en mi teclado (usando la configuración del teclado de la computadora host) ya que casi nunca uso CAPSLOCK y tiene ese botón grande y hermoso justo donde lo quiero. (Esto es común para los usuarios de Emacs. ¡La desventaja es cuando te encuentras en un teclado 'sin fijar'! ¡Aaarggh!)

Una vez que reasigna CAPSLOCK, puede utilizar cómodamente las siguientes reasignaciones de modo de inserción:

Teniendo en cuenta que algunas teclas ya están asignadas en modo de inserción (backwards-kill-word es Cw (Control-w) por defecto, es posible que ya tenga los enlaces que desea. Dicho esto, prefiero Ch, así que en mi .vimrc tengo :

inoremap <C-h> <C-w>

PERO, probablemente quieras el mismo espasmo de memoria muscular en modo normal, así que también mapeo Ch como:

nnoremap <C-h> db

(d) elete (b) ackwards logra lo mismo con el mismo acorde clave. Este tipo de edición rápida es una que encuentro útil en la práctica para los errores tipográficos. Pero manténgase en el modo normal para moverse en el texto y cualquier otra cosa más que matar la palabra anterior. Una vez que tenga el hábito de cambiar los modos (usando una reasignación, por supuesto), será mucho más eficiente que reasignar el modo de inserción.

pfries
fuente
buena reasignación para escapar: ¡creo que funcionará para casi cualquier cosa, excepto árabe transliterado!
jjt
0

Puede usar imappara asignar cualquier tecla en modo de inserción a una de las teclas del cursor. Al igual que:

imap h <Left>

Ahora h funciona como en modo normal, moviendo el cursor. (Mapear h de esta manera es obviamente una mala elección)

Habiendo dicho eso, no creo que la forma estándar de moverse en el texto usando VIM "no sea productiva". Hay muchas formas muy poderosas de recorrer el texto en modo normal (como usar w y b, o / y?, O f y F, etc.)

Peter van der Heijden
fuente
1
No dije que la forma estándar de moverse a través del texto en vim no es productiva; lo que dije fue que era un poco "molesto" tener que salir del modo de inserción para retroceder algunos caracteres y luego tener que retroceder para insertar nuevamente; pero, de nuevo, tal vez esto se debe a que no tengo muy acostumbrado a VIM todavía :)
Andreas Grech
Esta es la solución que estaba buscando. Uso imap <Ch> <Left> (sé que elimina un carácter, pero tengo retroceso), que es todo lo que necesito, gracias.
user4052054
0

Para algunos movimientos y acciones de uso frecuente, he definido las siguientes asignaciones. Esto ahorra una combinación de teclas en comparación con la combinación CTRL + O y, dado que las necesito con frecuencia, merecen la pena a largo plazo.

inoremap <A-$> <C-o>$
inoremap <A-^> <C-o>^
inoremap <A-h> <Left>
inoremap <A-l> <Right>
inoremap <A-O> <C-O>O
inoremap <A-o> <C-o>o
Alexander van Trijffel
fuente