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-ny el submodoCtrl-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 au. - 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 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:
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 42Ese ú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:
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:
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 expandtabEse ú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:
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 modoY dos parientes que resuelven el problema del deshacer y el del cursor:
Ctrl-g``ucorta el bloque de deshacer aquí. Todo lo escrito antes y lo escrito después pasan a ser dos cosas distintas parau. Es lo que hacen internamenteCtrl-wyCtrl-u, y ahora puedes ponerlo tú donde tenga sentido: al acabar un párrafo, antes de un bloque grande.Ctrl-g``Ujusto 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—:
:iabbrev qeu que:iabbrev fucntion function:iabbrev @@ correo@ejemplo.com:iabbrev ffs function() {<CR>}<Esc>OLas 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:
- Entra con
Aal final de una línea y escribe algo. Comprueba que no tuviste que pulsar$antes. - Teclea mal una palabra a propósito y corrígela con
Ctrl-w. Luego pulsaEscyu: comprueba que recupera la palabra sin deshacer todo lo demás. Ese es el punto de deshacer de Neovim en acción. - Escribe una ruta de tu proyecto usando solo
Ctrl-x``Ctrl-f. - Completa el nombre de una variable que esté a doscientas líneas de distancia con
Ctrl-n. Sin plugins, sin LSP. - Inserta un
→conCtrl-k``->y un€conCtrl-k``Eu. - Centra la pantalla con
Ctrl-o``zzy sigue escribiendo en la misma sesión. - Escribe una línea casi igual a la de arriba copiando el prefijo con
Ctrl-y. - Define
:iabbrevpara las dos palabras que sueles teclear mal, y compruébalas. - Por último, la comprobación que importa: entra en Insertar, escribe una frase, muévete con una flecha, escribe otra, sal y pulsa
uuna vez. Verás que solo deshace la segunda mitad. Ahora repítelo usandoCtrl-oen lugar de la flecha y compara.