Saltar al contenido

El modo Insertar a fondo

Lo que puedes hacer sin salir de Insertar: borrar por palabras y por líneas con punto de deshacer, pegar registros, indentar, completar palabras del proyecto sin ningún plugin, insertar caracteres que no están en tu teclado, copiar de la línea de arriba, escapar a Normal por una sola orden, y las abreviaturas que corrigen tus erratas mientras escribes.

Las dos lecciones anteriores han tratado el modo Insertar como un sitio del que hay que salir cuanto antes, y esa es la actitud correcta el 90% del tiempo. Pero el 10% restante lo pasas ahí dentro, escribiendo, y ahí también hay un editor: teclas para borrar la palabra que acabas de teclear mal, para pegar sin salir, para completar el nombre de una variable de trescientas líneas más arriba, para meter un é o un → que no tienes en el teclado, y para escaparte a Normal a hacer una cosa y volver. Casi ningún curso las enseña, y son las que separan escribir en Neovim de escribir en el Bloc de notas con modos.

  • Corregir sin salir del modo: borrar palabra, borrar línea, y por qué eso no arruina tu u.
  • Pegar un registro desde Insertar, y elegir entre las tres variantes según qué quieras.
  • Completar sin ningún plugin con Ctrl-n y el submodo Ctrl-x.
  • Insertar caracteres que no están en tu teclado: dígrafos y códigos Unicode.
  • Controlar los bloques de deshacer con Ctrl-g``u, que es lo que hace útil a u.
  • Definir abreviaturas que corrijan tus erratas y expandan tus plantillas.

Entrar por el sitio correcto

Antes de lo que se hace dentro, lo que decide cuánto tendrás que hacer: por dónde entras. Elegir bien ahorra los movimientos que luego intentarías hacer desde Insertar, que es donde se pierde el tiempo.

Tecla Entra…
i / a antes / después del cursor
I / A al primer carácter no blanco / al final de la línea
gI a la columna 1, ignorando la indentación
o / O abriendo línea nueva debajo / encima
gi donde saliste la última vez
s / S borrando el carácter / la línea
cc / C cambiando la línea / de aquí al final

A y o son las dos que más se usan y las que más gente sustituye por $a y j0i sin darse cuenta. Y gi es la que nadie conoce: te devuelve exactamente a donde estabas escribiendo, aunque te hayas ido a leer al otro extremo del fichero.

El conteo también funciona al entrar

3ihola + Esc escribe holaholahola. 5o- + Esc abre cinco líneas con un guion cada una. 30i= + Esc te dibuja un separador de treinta signos igual.

El conteo se aplica al salir, repitiendo todo lo que hayas escrito en la sesión de inserción. Es la forma más rápida de generar texto repetido, y funciona con i, a, o, O y A.

Corregir sin salir

Estas cuatro son las que más vas a usar y las que convierten Insertar en algo habitable.

Ctrl-w borra la palabra anteriorCtrl-u borra lo escrito en esta líneaCtrl-h borra un carácter (= retroceso)Ctrl-t / Ctrl-d indenta / desindenta la línea

Ctrl-w es la que cambia la vida: has tecleado getUserByIdentifer, ves la errata a mitad de palabra, y en vez de dar quince retrocesos borras la palabra entera de un golpe y la reescribes. Ctrl-u hace lo mismo con todo lo que llevas escrito en la línea.

Ctrl-t y Ctrl-d mueven la línea entera un nivel de indentación, sin importar dónde tengas el cursor. Son mejores que teclear espacios porque respetan 'shiftwidth' y funcionan igual en un fichero con tabuladores.

Por qué esas dos teclas no te destrozan el deshacer, y en Vim sí

Aquí hay un detalle pequeño que explica una diferencia grande, y que es un buen ejemplo de la filosofía de Neovim.

En Vim, una sesión de inserción entera es un solo bloque de deshacer. Entras con i, escribes tres párrafos, sales con Esc, y un único u se lo lleva todo. Y si en mitad de esos tres párrafos usaste Ctrl-u para borrar una línea que estaba bien, ese borrado tampoco se puede deshacer por separado: o deshaces los tres párrafos, o nada.

Neovim viene con dos mapeos por defecto que arreglan exactamente eso: Ctrl-u y Ctrl-w insertan un punto de deshacer antes de actuar. Están en :h i_CTRL-U-default y :h i_CTRL-W-default, y son literalmente <C-G>u<C-U> y <C-G>u<C-W>.

Fíjate en el tipo de decisión que es. No añade ninguna funcionalidad: u ya existía y Ctrl-u ya existía. Lo que hace es cambiar el tamaño del grano de una operación para que coincida con la intención del usuario. Nadie que borra una línea por error piensa «acabo de hacer una parte de una edición grande»; piensa «acabo de hacer una cosa», y espera poder deshacer esa cosa. Un sistema de deshacer que agrupa por sesión técnica en vez de por unidad de intención es correcto y es inútil, y esa distancia entre lo correcto y lo útil es donde vive la mitad del diseño de interfaces.

Es la misma pregunta que te haces al decidir qué entra en un commit, qué envuelve una transacción o qué es un paso en un asistente. La respuesta nunca sale del sistema: sale de qué considera «una cosa» la persona que lo usa. Y en un minuto la vas a poder tomar tú, porque Ctrl-g u te deja poner esos puntos donde quieras.

Pegar sin salir

Ctrl-r seguido del nombre de un registro inserta su contenido ahí mismo. Los registros los verás a fondo en el Nivel 1; hoy basta con tres:

Texto
Ctrl-r "     lo último que copiaste o borrasteCtrl-r 0     lo último que copiaste con y (no lo borrado)Ctrl-r +     el portapapeles del sistemaCtrl-r %     el nombre del fichero actualCtrl-r =     una expresión: Ctrl-r = 2*21 <Enter> escribe 42

Ese último es una calculadora dentro del editor: Ctrl-r``= abre una minilínea de comandos, escribes la expresión, y el resultado se inserta.

En 0.12 esto cambió, y es un cambio silencioso

Hasta la 0.11, Ctrl-r insertaba el registro como si lo tecleases: se aplicaban la indentación automática, las abreviaturas y los mapeos. Con un bloque de código indentado, el resultado era la famosa escalera de indentación creciente.

Desde la 0.12 inserta literalmente, como un pegado. Es lo que casi siempre quieres, es más rápido y no rompe el formato. Si alguna vez necesitas el comportamiento antiguo —por ejemplo para que se dispare una abreviatura—, está en <C-r>=@x.

Y hay dos variantes que conviene conocer: Ctrl-r``Ctrl-p pega ajustando la indentación al contexto, y Ctrl-r``Ctrl-o pega sin tocarla en absoluto.

Completar sin ningún plugin

Esto sorprende a casi todo el mundo: Neovim completa desde el primer arranque, sin configurar nada y sin instalar nada.

Ctrl-n busca hacia adelante una palabra que empiece como lo que llevas escrito; Ctrl-p, hacia atrás. Busca en el buffer actual, en los demás buffers abiertos, en las ventanas visibles y en tus ficheros de etiquetas —eso lo decide la opción 'complete'—. Pulsa varias veces para ir pasando candidatos, y Ctrl-e para cancelar el menú y quedarte con lo que habías escrito.

Escribe usu y pulsa Ctrl-n: si en el fichero hay usuarioAutenticado, te lo ofrece. En un fichero de mil líneas eso ya es el 80% de lo que hace un autocompletado, y no ha costado nada.

Y detrás hay un submodo entero. Ctrl-x abre un menú de fuentes específicas:

Combinación Completa
Ctrl-x``Ctrl-f rutas de fichero — la más útil con diferencia
Ctrl-x``Ctrl-l líneas enteras que ya existan en el proyecto
Ctrl-x``Ctrl-n palabras solo del buffer actual
Ctrl-x``Ctrl-o omni: lo que sepa el lenguaje. Con LSP, tu código
Ctrl-x``Ctrl-k el diccionario del sistema
Ctrl-x``Ctrl-s sugerencias de corrección ortográfica
Ctrl-x``Ctrl-v comandos de la línea de comandos

Ctrl-x``Ctrl-f merece que la pruebes ahora mismo: escribe ./ y púlsala. Te lista el directorio y vas navegando. Escribir rutas a mano después de conocer esto se hace insoportable.

Y así se conecta con el completado moderno

Estas teclas son el cimiento sobre el que se construye todo lo demás. Cuando en el Nivel 3 montes el LSP, lo que hará será rellenar 'omnifunc', y Ctrl-x``Ctrl-o pasará a completar con el conocimiento real de tu lenguaje sin que cambie ninguna tecla.

Y la opción 'autocomplete' de la 0.12 —que verás en la lección 0.7— no inventa nada nuevo: dispara este mismo mecanismo automáticamente mientras escribes, en vez de esperar a que pulses Ctrl-n. Todo el completado de Neovim, con plugins o sin ellos, es esta maquinaria con más o menos automatismo encima.

Caracteres que no están en tu teclado

Dos mecanismos, y los dos viven solo aquí dentro.

Dígrafos, con Ctrl-k y dos caracteres:

Texto
Ctrl-k e '   →  é          Ctrl-k -> →  →Ctrl-k n ?   →  ñ          Ctrl-k OK →  ✓Ctrl-k a :   →  ä          Ctrl-k 12 →  ½Ctrl-k Eu    →  €          Ctrl-k SE →  §

La lógica es «la letra base, luego el signo». La lista completa —son cientos— está en :digraphs, y en :h digraph-table.

Códigos directos, con Ctrl-v:

Texto
Ctrl-v u 00e9    →  é       (Unicode, 4 dígitos hex)Ctrl-v U 0001F600 →  😀     (Unicode, 8 dígitos)Ctrl-v 233       →  é       (decimal)Ctrl-v <Tab>     →  un tabulador de verdad, aunque tengas expandtab

Ese último es el uso más frecuente de todos: insertar un carácter literal que normalmente haría otra cosa. Si tienes expandtab puesto, Tab mete espacios; Ctrl-v``Tab mete un tabulador de verdad.

Copiar de la línea de arriba o de abajo

Ctrl-y inserta el carácter que está justo encima del cursor; Ctrl-e, el que está justo debajo. Pulsándolas repetidamente vas copiando la línea de referencia carácter a carácter.

Suena a curiosidad y es de las más prácticas que hay: cuando escribes la segunda de dos líneas casi idénticas —un import parecido al de arriba, otra fila de una tabla, un caso más de un switch—, copias el prefijo común con Ctrl-y y solo tecleas lo que cambia.

Escaparse a Normal, y volver

Ya viste Ctrl-o en la lección 0.3: ejecuta una orden de modo Normal y vuelve a Insertar. Merece verse con sus casos, porque es la que evita el ciclo de salir, hacer y volver a entrar:

Texto
Ctrl-o zz      centra la pantalla y sigues escribiendoCtrl-o A       salta al final de la línea sin romper la inserciónCtrl-o dd      borra la línea enteraCtrl-o >>      indenta la líneaCtrl-o :w      guarda sin salir del modo

Y dos parientes que resuelven el problema del deshacer y el del cursor:

  • Ctrl-g``u corta el bloque de deshacer aquí. Todo lo escrito antes y lo escrito después pasan a ser dos cosas distintas para u. Es lo que hacen internamente Ctrl-w y Ctrl-u, y ahora puedes ponerlo tú donde tenga sentido: al acabar un párrafo, antes de un bloque grande.
  • Ctrl-g``U justo lo contrario para el cursor: hace que el siguiente movimiento no rompa la sesión de inserción, con lo que . sigue funcionando después. Es la pieza que usan por dentro los plugins de autoparéntesis.

Moverse con las flechas rompe la repetición

Si estando en Insertar mueves el cursor con las flechas o con el ratón, Neovim cierra la sesión de inserción y abre otra. Consecuencia: u deshace solo el último trozo, y . repite solo esa parte.

Es una de las razones de fondo para desterrar las flechas, más allá de la ergonomía: no cambian solo cómo te mueves, cambian dónde caen las fronteras de tus ediciones. La forma correcta de moverte a mitad de inserción es salir a Normal, o usar Ctrl-o.

Abreviaturas: corregir antes de equivocarte

Una abreviatura sustituye una palabra por otra en cuanto terminas de escribirla, dentro del modo Insertar. Se define con :iabbrev —abreviado, :iab—:

VIM
:iabbrev qeu que:iabbrev fucntion function:iabbrev @@ correo@ejemplo.com:iabbrev ffs function() {<CR>}<Esc>O

Las dos primeras son el caso más rentable: tus propias erratas recurrentes, corregidas antes de que las veas. Todo el mundo tiene tres o cuatro palabras que teclea mal siempre; ponlas ahí y dejan de existir.

La tercera ahorra escribir cosas largas. La cuarta es una plantilla, y enseña dónde está el límite: para plantillas de verdad, con saltos entre huecos, existen los snippets, que Neovim trae desde la 0.10 y que verás al montar el completado.

Tres detalles que evitan sorpresas

Las abreviaturas solo se disparan tras un carácter no-palabra —espacio, coma, punto, Enter—. Por eso qeu no se expande mientras estás en mitad de qeutzal.

Si necesitas escribir la palabra literal sin que se expanda: Ctrl-v antes del espacio.

Y hay tres familias: :iabbrev solo en Insertar, :cabbrev solo en la línea de comandos, y :abbrev en las dos. Para corregir erratas quieres :iabbrev; usar :abbrev a secas te expandirá la palabra también cuando la escribas en un :s, que rara vez es lo que quieres.

Hoy las pruebas escribiéndolas a mano y se pierden al cerrar. En el Nivel 2 irán a tu configuración.

El modo Reemplazo, en dos párrafos

R entra en un modo hermano donde lo que escribes sobrescribe en vez de empujar. Cada carácter que tecleas sustituye al que había, y el retroceso restaura el original en lugar de borrar. Se sale con Esc.

Sirve para lo que su nombre dice y poco más: tablas de texto alineadas, cabeceras ASCII, ficheros de ancho fijo. Y tiene un primo que casi nadie conoce, gR, el reemplazo virtual, que trata los tabuladores como el espacio que ocupan en pantalla en vez de como un carácter —lo cual, en un fichero con tabuladores, es la diferencia entre alinear y destrozar la alineación—.

Ctrl-w borra la palabra anterior entera sin salir de Insertar: un golpe en vez de dieciocho retrocesos.

Escribe ./ y púlsala. Completa por directorios; sigue pulsando para bajar niveles.

Ctrl-y copia el carácter que tienes justo encima. Repite hasta donde el texto deja de coincidir.

Ctrl-v inserta el siguiente carácter literalmente, saltándose mapeos y opciones.

% es el registro que guarda el nombre del buffer. Con Ctrl-r se pega sin salir del modo.

Corta el bloque de deshacer en ese punto. A partir de ahí, u deshace solo lo nuevo.

El conteo se aplica al salir de Insertar, repitiendo todo lo escrito en la sesión. Seis pulsaciones, cuarenta caracteres.

Una sesión entera sin salir de Insertar

Abre un fichero de código de verdad y resuelve todo esto sin pulsar Esc hasta el final:

  1. Entra con A al final de una línea y escribe algo. Comprueba que no tuviste que pulsar $ antes.
  2. Teclea mal una palabra a propósito y corrígela con Ctrl-w. Luego pulsa Esc y u: comprueba que recupera la palabra sin deshacer todo lo demás. Ese es el punto de deshacer de Neovim en acción.
  3. Escribe una ruta de tu proyecto usando solo Ctrl-x``Ctrl-f.
  4. Completa el nombre de una variable que esté a doscientas líneas de distancia con Ctrl-n. Sin plugins, sin LSP.
  5. Inserta un → con Ctrl-k``-> y un € con Ctrl-k``Eu.
  6. Centra la pantalla con Ctrl-o``zz y sigue escribiendo en la misma sesión.
  7. Escribe una línea casi igual a la de arriba copiando el prefijo con Ctrl-y.
  8. Define :iabbrev para las dos palabras que sueles teclear mal, y compruébalas.
  9. Por último, la comprobación que importa: entra en Insertar, escribe una frase, muévete con una flecha, escribe otra, sal y pulsa u una vez. Verás que solo deshace la segunda mitad. Ahora repítelo usando Ctrl-o en lugar de la flecha y compara.