¿Cómo aprender a manejar Vi o Vim desde cero como editor de texto completo?

Aprender Certificado Fundación Linux en España contenido Técnicos desde Cero en CiberED

2.1. ¿Por qué Vi/Vim es imprescindible?

Vi (Visual Interface) y su evolución Vim (Vi Improved) son editores de texto modales presentes en prácticamente cualquier sistema Unix/Linux. Para un administrador de sistemas, dominar Vi/Vim no es una opción, es una necesidad:

  • Ubicuidad: está instalado por defecto en la mayoría de distribuciones y en entornos de recuperación.
  • Eficiencia: al ser modal y funcionar completamente con el teclado, permite editar a una velocidad inalcanzable con editores gráficos.
  • Potencia: incluye búsqueda con expresiones regulares, macros, múltiples buffers, división de ventanas y una capacidad de personalización inmensa.
  • Examen LFCS: es frecuente que las tareas impliquen editar archivos de configuración en servidores sin entorno gráfico. Saber salir de Vim no es suficiente; necesitas dominar la edición eficiente.

Este capítulo te convertirá en un usuario competente de Vim, cubriendo desde los modos básicos hasta configuraciones y trucos avanzados.

2.2. Modos de Vim

El concepto más importante (y la principal barrera para principiantes) es que Vim tiene varios modos de funcionamiento. Cada modo interpreta las teclas de forma distinta.

2.2.1. Modo Normal (o Comando)

Al abrir Vim entras en modo Normal. Aquí no escribes texto, sino que ejecutas comandos de movimiento, borrado, copiado, etc. Es tu centro de operaciones.

  • Desde cualquier modo, pulsa Esc para volver al modo Normal.
  • En modo Normal, las teclas como h, j, k, l son movimientos, no caracteres.

2.2.2. Modo Inserción

Es donde se introduce texto. Se accede desde el modo Normal mediante varias teclas:

  • i: insertar antes del cursor.
  • I: insertar al principio de la línea.
  • a: insertar después del cursor (append).
  • A: insertar al final de la línea.
  • o: abrir una nueva línea debajo y pasar a inserción.
  • O: abrir una nueva línea arriba y pasar a inserción.

En la parte inferior izquierda aparece -- INSERT --.

2.2.3. Modo Visual

Permite seleccionar texto para luego operar sobre él (copiar, cortar, cambiar mayúsculas, etc.). Se activa desde Normal con:

  • v: selección carácter a carácter.
  • V: selección línea a línea.
  • Ctrl+v: selección por bloques (columnas).

El texto seleccionado aparece resaltado. Tras la selección, se ejecuta un comando (ej. d borrar, y copiar, c cambiar).

2.2.4. Modo de Comandos (Ex)

Se usa para órdenes complejas: guardar, salir, buscar/sustituir global, ejecutar comandos externos. Se entra desde Normal con :. El cursor salta a la última línea, donde se escribe el comando, que se ejecuta al pulsar Enter.

2.2.5. Resumen de cambios de modo

Normal ────i, a, o, etc.────► Inserción
Normal ────v, V, Ctrl+v────► Visual
Normal ────:───────────────► Comandos (Ex)
Inserción/Visual/Comandos ──Esc (o Ctrl+c)──► Normal

Regla de oro: cuando no sepas qué está pasando, pulsa Esc un par de veces para volver al modo Normal.

2.3. Moverse por el archivo sin ratón

En modo Normal, el movimiento es ultra rápido.

2.3.1. Movimientos básicos (h, j, k, l)

k (arriba)
h (izq) l (der)
j (abajo)

Aunque las flechas también funcionan, usar h, j, k, l mantiene las manos en la fila central y es más eficiente.

2.3.2. Movimientos por palabras

  • w: inicio de la siguiente palabra.
  • b: inicio de la palabra anterior.
  • e: final de la palabra actual o siguiente.
  • W, B, E: igual pero consideran solo espacios (ignoran puntuación).

2.3.3. Movimientos de línea

  • 0: principio de línea (columna cero).
  • ^: primer carácter no blanco de la línea.
  • $: final de línea.
  • gg: ir al principio del archivo.
  • G: ir al final del archivo.
  • nG o :n: ir a la línea número n. Ej: 42G.

2.3.4. Movimientos de pantalla

  • Ctrl+f: avanzar una pantalla (forward).
  • Ctrl+b: retroceder una pantalla (backward).
  • Ctrl+d: avanzar media pantalla.
  • Ctrl+u: retroceder media pantalla.
  • H: ir a la línea superior de la pantalla (High).
  • M: línea media (Middle).
  • L: línea inferior (Low).
  • zt: traer la línea actual al tope de la pantalla.
  • zz: centrar la línea actual en la pantalla.
  • zb: llevarla al fondo.

2.3.5. Movimientos por párrafos y secciones

  • }: siguiente línea en blanco (fin de párrafo).
  • {: anterior línea en blanco (inicio de párrafo).
  • ]]: siguiente llave { en primera columna (útil en código).

2.4. Edición básica: borrar, cambiar y repetir

En modo Normal, la edición se compone de un operador + movimiento o un operador repetido para la línea actual.

2.4.1. Borrar (delete)

  • d seguido de un movimiento: borra desde el cursor hasta donde alcance el movimiento.
    • dw: borrar hasta el inicio de la siguiente palabra.
    • d$ o D: borrar hasta el final de línea.
    • d0: borrar hasta el principio de línea.
    • dgg: borrar desde el cursor hasta el principio del archivo.
    • dG: borrar desde el cursor hasta el final.
  • dd: borrar la línea completa.
  • ndd: borrar n líneas (ej. 5dd borra 5 líneas).

Lo borrado se guarda en el registro (portapapeles) y se puede pegar.

2.4.2. Cambiar (change)

Funciona como borrar, pero tras eliminar entra automáticamente en modo Inserción.

  • c + movimiento: cw (cambiar palabra), c$ o C (cambiar hasta final de línea), cc (cambiar línea entera).
  • s: borrar carácter bajo el cursor e insertar (equivale a cl).
  • S: borrar línea completa e insertar (equivale a cc).

2.4.3. Reemplazar (replace)

  • r: reemplazar el carácter bajo el cursor por el siguiente que pulses (sin entrar en modo Inserción).
  • R: entrar en modo Reemplazar (sobrescribe caracteres hasta pulsar Esc).

2.4.4. Copiar (yank)

  • y + movimiento: copiar.
    • yw: copiar palabra.
    • y$: copiar hasta final de línea.
    • yy o Y: copiar línea completa.
    • nyy: copiar n líneas.

2.4.5. Pegar (put)

  • p: pegar después del cursor (línea siguiente si se copió una línea entera).
  • P: pegar antes del cursor (línea anterior).

2.4.6. Deshacer y rehacer

  • u: deshacer el último cambio.
  • Ctrl+r: rehacer.
  • U: deshacer todos los cambios de la línea actual (si el cursor no ha cambiado de línea).

2.4.7. Repetir último comando

El punto . repite el último cambio realizado. Es extremadamente útil.

Por ejemplo, para comentar varias líneas: I#<Esc> en una línea, luego j.j.j..

2.5. Búsqueda y sustitución

2.5.1. Búsqueda simple

En modo Normal:

  • /patrón: busca hacia adelante. n siguiente coincidencia, N anterior.
  • ?patrón: busca hacia atrás.
  • *: busca la palabra bajo el cursor hacia adelante.
  • #: busca la palabra bajo el cursor hacia atrás.

Opciones durante la búsqueda:

  • \c: ignorar mayúsculas (ej. /error\c).
  • :set ic (ignore case) para toda la sesión, luego :set noic para desactivar.

2.5.2. Sustitución con :s

La sintaxis general en modo Ex:

:[rango]s/patrón/reemplazo/[flags]
  • rango: si se omite, solo la línea actual.
    • %: todo el archivo.
    • 1,5: líneas 1 a 5.
    • .,+3: desde la línea actual hasta tres líneas más abajo.
  • flags:
    • g: todas las ocurrencias en la línea (global).
    • c: pedir confirmación.
    • i: ignorar mayúsculas.
    • I: distinguir mayúsculas.

Ejemplos:

:s/viejo/nuevo/          " primera ocurrencia en línea actual
:s/viejo/nuevo/g         " todas en línea actual
:%s/viejo/nuevo/g        " todas en todo el archivo
:5,20s/Error/ERROR/g     " líneas 5-20
:%s/^/; /                " añadir '; ' al inicio de cada línea
:%s/\s\+$//               " eliminar espacios en blanco al final de líneas

Caracteres especiales en el patrón:
Vim usa su propio motor de expresiones regulares, muy similar al de sed. Algunas diferencias:

  • Hay que escapar (, ), {, }, + con \ en modo “mágico”. Pero se puede activar el modo “very magic” anteponiendo \v al patrón, donde casi todos los metacaracteres no necesitan escape. Ejemplo: :%s/\v(hola|adiós)/saludo/g.

2.6. Trabajar con múltiples archivos, buffers y ventanas

2.6.1. Abrir y gestionar archivos

  • Desde la terminal: vim archivo1 archivo2. Se abre el primer archivo.
  • Dentro de Vim: :e archivo (edit) para abrir otro archivo en el mismo buffer. Si el actual tiene cambios, pedirá guardar o :e! para forzar descartando cambios.
  • :ls o :buffers: lista los buffers abiertos.
  • :b N: cambiar al buffer número N.
  • :bn, :bp, :b#: buffer siguiente, anterior, último usado.
  • :bd: cerrar buffer (delete buffer).

2.6.2. Ventanas divididas

Vim permite partir la pantalla para editar varios archivos a la vez.

  • :sp [archivo]: división horizontal (split).
  • :vsp [archivo]: división vertical.
  • Ctrl+w w: saltar entre ventanas.
  • Ctrl+w h/j/k/l: moverse a la ventana en esa dirección.
  • Ctrl+w +, Ctrl+w -: aumentar/disminuir altura.
  • Ctrl+w >, Ctrl+w <: aumentar/disminuir anchura.
  • Ctrl+w =: igualar tamaños.
  • Ctrl+w q o :q: cerrar ventana actual.

Ejemplo: editar /etc/hosts y /etc/hostname en división vertical:

vim -O /etc/hosts /etc/hostname   # desde terminal

O dentro de Vim: :vsp /etc/hostname.

2.6.3. Pestañas

En versiones modernas de Vim:

  • :tabe archivo: abrir en nueva pestaña (tab).
  • gt, gT: siguiente pestaña, anterior.
  • :tabc: cerrar pestaña.

2.7. Macros: automatizar tareas repetitivas

Las macros graban una secuencia de comandos para repetirla cuantas veces quieras.

  • q + letra: comenzar a grabar en el registro letra (ej. qa).
  • Realiza las acciones en modo Normal.
  • q: detener la grabación.
  • @a: ejecutar la macro del registro a.
  • 10@a: ejecutar 10 veces.

Ejemplo: para convertir una lista de nombres en líneas como "nombre",, graba en a:
I" (insertar al inicio), Esc, A", (insertar al final), Esc, j (bajar una línea). Luego @a repetirá en la siguiente. O bien :%norm @a para ejecutarlo en todo el archivo.

2.8. Personalización y configuración esencial

El archivo ~/.vimrc guarda configuraciones que se cargan al iniciar Vim. (Para todo el sistema: /etc/vimrc o /etc/vim/vimrc). Unas líneas muy recomendadas:

" Activar sintaxis
syntax on

" Mostrar número de línea
set number

" Resaltar búsquedas
set hlsearch
" Búsqueda incremental mientras se escribe
set incsearch

" Ignorar mayúsculas en búsqueda
set ignorecase
" Pero si la búsqueda contiene mayúsculas, distinguir
set smartcase

" Indentación inteligente
set autoindent
set smartindent

" Tabulaciones como 4 espacios
set tabstop=4
set shiftwidth=4
set expandtab

" Mostrar paréntesis y llaves coincidentes
set showmatch

" Habilitar mouse en modo normal/visual (opcional)
set mouse=a

" Activar deshacer persistente (archivos undo)
set undofile

" Mapear líder a espacio (cómodo para combinaciones propias)
let mapleader = " "

Tras modificar ~/.vimrc, recarga con :source ~/.vimrc o reinicia Vim.

2.9. Trucos y combinaciones productivas

  • :%!comando: pasar todo el contenido del archivo por un filtro externo y reemplazarlo con la salida. Ej: :%!sort, :%!column -t.
  • :r!comando: insertar la salida de un comando debajo del cursor. Ej: :r!date.
  • :g/patrón/comando: ejecutar un comando en las líneas que coinciden con el patrón (global). Ejemplos:
    • :g/^$/d (eliminar líneas vacías).
    • :g/error/s//ERROR/g (sustituir ‘error’ por ‘ERROR’ solo en líneas que contengan ‘error’).
  • :v/patrón/comando: igual pero en líneas que NO coinciden.
  • ci", ci(, ci[: cambiar el contenido dentro de comillas, paréntesis, corchetes (el cursor debe estar dentro). Extremadamente útil para código.
  • di", yi", etc.: borrar o copiar lo de dentro.
  • % con cursor sobre un paréntesis/llave: salta al paréntesis/llave de cierre correspondiente.
  • ~: cambiar mayúscula/minúscula del carácter bajo el cursor.
  • gu + movimiento: pasar a minúsculas (ej. guw palabra, guG hasta el final).
  • gU + movimiento: pasar a mayúsculas.
  • xp: intercambiar el carácter bajo el cursor con el siguiente (para arreglar errores de tipeo: “ahce” → “hace”).

2.10. Recuperación de archivos y gestión de emergencias

  • Si Vim se cierra inesperadamente, usa vim -r archivo para ver opciones de recuperación.
  • Los archivos de intercambio .archivo.swp se crean al editar. Vim avisa si existen; puedes recuperar (R), abrir de solo lectura, editar de todos modos, etc.
  • :set nobackup y :set nowritebackup en .vimrc pueden reducir residuos, pero mejor mantener los backups por seguridad.

2.11. Ejercicios prácticos

  1. Abre un archivo de texto cualquiera. Practica movimientos: ve al inicio, final, línea 20, avanza 3 palabras, retrocede 2 párrafos, centra la pantalla.
  2. Borra la quinta línea y pégala al final del archivo. Después deshazlo y rehazlo.
  3. Cambia todas las ocurrencias de ERROR por CRITICAL en todo el archivo, pero solo en líneas que contengan 2024.
  4. Convierte las líneas de un archivo en una lista numerada: :%s/^/\=(line('.')).'. '/ (o usa un macro).
  5. Graba una macro que envuelva la palabra bajo el cursor con comillas dobles. Pista: bi" ea".
  6. Divide la ventana horizontalmente, abre otro archivo, y copia una línea de uno a otro usando yank y put entre ventanas.
  7. Usa :g para eliminar todas las líneas que no contengan la palabra importante.
  8. Formatea un archivo JSON desordenado con :%!python -m json.tool (si Python está instalado) o usa =% para indentar código.

2.12. Resumen y consejos LFCS

  • No memorices todo de golpe; practica diariamente al editar configuraciones. En una semana habrás interiorizado los movimientos básicos.
  • En el examen, la edición eficiente te hará ganar tiempo valioso. Por ejemplo, sabiendo buscar y reemplazar globalmente o usar macros.
  • Si te pierdes, Esc y u son tus mejores aliados.
  • Instala vim en lugar de vi básico (sudo apt install vim / sudo yum install vim) para tener características completas.
  • Aprende a salir correctamente: :wq (guardar y salir), :q! (salir sin guardar), :x (guardar solo si hay cambios).

Con esto completas la base de Vi/Vim. En el siguiente capítulo abordaremos herramientas de archivado y compresión junto con permisos y atributos de archivos, ampliando tus habilidades de manejo de datos y seguridad.

Vistas: 2
Scroll al inicio