vim: edición desde la terminal sin rendirse

Cuando entras a un servidor de producción por SSH y necesitas editar un archivo de configuración, es muy probable que la única opción disponible sea vim o su predecesor vi. No hay gedit, no hay nano en algunas instalaciones mínimas, no hay IDE. Solo el terminal y un editor que, si no sabes cómo funciona, parece roto desde el primer segundo.

La confusión inicial con vim viene de una decisión de diseño deliberada: es un editor modal. Eso significa que el mismo teclado hace cosas completamente distintas dependiendo del modo en el que estés. Cuando abres un archivo, vim no te pone directamente a escribir texto — te pone en modo normal, donde las teclas mueven el cursor, borran, copian, pegan. Si pulsas k pensando que vas a escribir una “k”, lo que harás es mover el cursor hacia arriba. Esto es lo que hace que la gente piense que el editor está roto.

El diseño modal existe por una razón histórica y práctica: los teclados de los años 70 no tenían teclas de dirección ni modificadores como los de hoy. Pero la consecuencia es que vim separa dos actividades que solemos mezclar sin pensarlo — navegar y editar versus escribir texto. Una vez que eso encaja en tu cabeza, el editor deja de ser un obstáculo.

Los cuatro modos que necesitas conocer son: modo normal (donde aterrizas al abrir), modo inserción (donde escribes texto como en cualquier editor), modo visual (donde seleccionas texto) y modo comando (donde ejecutas órdenes como guardar o salir). Si en algún momento no sabes en qué modo estás, pulsa Escape — siempre te devuelve al modo normal. Esa tecla es tu ancla.

¿Cuándo usas vim? Exactamente en ese escenario: servidor con instalación mínima, necesitas cambiar una línea en /etc/ssh/sshd_config o en un archivo de configuración de nginx, y no hay alternativa. También cuando editas archivos como root en sistemas donde nano no está instalado. No necesitas dominar vim para ese trabajo — necesitas saber el mínimo para entrar, cambiar lo que toca, guardar y salir sin romper nada.

Lo que se rompe si no sabes lo que haces: puedes editar accidentalmente el archivo sin querer (pulsando teclas en modo normal que modifican texto), guardar cambios que no pretendías hacer, o quedarte atrapado en el editor sin saber cómo salir — la broma más antigua de Unix. La salida de emergencia es siempre :q! — los dos puntos abren el modo comando, q es “quit” y ! fuerza la salida descartando todo. Si has hecho cambios que quieres conservar, es :wq o simplemente :x.

Sesión de trabajo real en vim

El escenario: estás en un servidor Debian y necesitas editar /etc/ssh/sshd_config para cambiar el puerto SSH de 22 a 2222, verificar que PasswordAuthentication esté en no, y salir limpiamente.

# Abre el archivo como root
sudo vim /etc/ssh/sshd_config

Una vez dentro del editor, todo lo siguiente ocurre en el teclado — no hay ratón, no hay menús:

# ── MODO NORMAL (donde estás al entrar) ──────────────────────────────

# Buscar la línea con "Port"
/Port

# vim resalta la primera coincidencia y mueve el cursor ahí.
# Pulsa Enter para confirmar el salto.
# Si hay varias coincidencias, n te lleva a la siguiente, N a la anterior.

# ── EDITAR LA LÍNEA ───────────────────────────────────────────────────

# Muévete con h (izquierda) j (abajo) k (arriba) l (derecha)
# hasta estar sobre el número 22.

# Pulsa i para entrar en MODO INSERCIÓN — verás "-- INSERT --" abajo.
# Borra el 22 con Backspace y escribe 2222.

# Pulsa Escape para volver a MODO NORMAL.

# ── SUSTITUCIÓN GLOBAL ────────────────────────────────────────────────

# En lugar de buscar manualmente PasswordAuthentication,
# usamos sustitución desde el modo comando.
# Los dos puntos activan el modo comando:

:%s/^#PasswordAuthentication yes/PasswordAuthentication no/g

# % significa "en todo el archivo"
# ^ ancla al inicio de línea para no tocar comentarios en medio de línea
# /g aplica el cambio en todas las ocurrencias, no solo la primera

# ── AÑADIR UNA LÍNEA NUEVA ────────────────────────────────────────────

# Navega hasta el final de la sección de autenticación con j/k.
# o (minúscula) abre una línea nueva DEBAJO y entra en modo inserción.
# O (mayúscula) haría lo mismo pero ENCIMA.

# Escribe lo que necesites, luego Escape para volver a modo normal.

# ── GUARDAR Y SALIR ───────────────────────────────────────────────────

:wq

# :w  escribe el archivo (write)
# :q  sale (quit)
# Juntos: guarda y sale. Equivalente a :x

Si en cualquier momento metes la pata y quieres salir sin guardar nada:

:q!

Lo que está pasando realmente

La búsqueda con /Port no es solo un salto de cursor — vim entra en un mini-modo de búsqueda incremental: mientras escribes, va resaltando coincidencias en tiempo real. Cuando pulsas Enter, el cursor queda sobre la primera coincidencia. A partir de ahí, n y N navegan entre ellas sin necesidad de volver a escribir el patrón.

La sustitución :%s/^#PasswordAuthentication yes/PasswordAuthentication no/g merece atención. El % que va delante de s es el rango: le dice a vim que opere sobre todo el archivo. Sin él, solo afecta a la línea actual. El ^ dentro del patrón es una expresión regular que ancla la coincidencia al inicio de la línea — así no tocas líneas de comentario que tengan ese texto precedido por espacios u otros caracteres. Es el tipo de precaución que evita ediciones accidentales en archivos de configuración con comentarios explicativos.

La diferencia entre i, a y o para entrar en modo inserción importa más de lo que parece. i (insert) inserta antes del carácter donde está el cursor. a (append) inserta después. o (open) abre una línea nueva debajo y te mete directamente en inserción — es el más cómodo cuando quieres añadir contenido nuevo sin preocuparte de la posición exacta del cursor en la línea actual.

El movimiento hjkl parece arbitrario hasta que recuerdas que en los terminales originales no había flechas de dirección. Hoy puedes usar las flechas del teclado en modo normal y funcionan igual, pero hjkl tiene la ventaja de que nunca tienes que mover la mano de la fila central del teclado — en sesiones largas de edición marca diferencia, aunque para el uso puntual de supervivencia en servidores da igual cuál uses.

Cuando ejecutas :wq y vim te devuelve al prompt, el archivo ya está escrito en disco. No hay confirmación, no hay diálogo de “¿guardar cambios?”. Por eso :q! existe y por eso es importante saber cuál de los dos usas antes de pulsar Enter.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio