# Referencia Rápida de Vim

*Modos, navegación, edición, búsqueda, macros, buffers*

> Source: Vim Documentation (vimdoc.sourceforge.net) · MIT

## Modos

### Cambio de Modo

| Command | Description |
|---------|-------------|
| `i` | Modo inserción (antes del cursor) |
| `a` | Modo inserción (después del cursor) |
| `o` | Insertar línea abajo y entrar en modo inserción |
| `O` | Insertar línea arriba y entrar en modo inserción |
| `v` | Modo visual (carácter) |
| `V` | Modo visual (línea) |
| `Ctrl+v` | Modo bloque visual |
| `:` | Modo línea de comandos |
| `R` | Modo reemplazo |
| `Esc` | Volver al modo normal |

## Navegación

### Movimiento por Carácter y Línea

| Command | Description |
|---------|-------------|
| `h j k l` | Izquierda, abajo, arriba, derecha |
| `0 / ^` | Inicio de línea / primer carácter no vacío |
| `$` | Fin de línea |
| `w / W` | Siguiente palabra / PALABRA |
| `b / B` | Palabra anterior / PALABRA |
| `e / E` | Fin de palabra / PALABRA |
| `f{c} / F{c}` | Buscar carácter hacia adelante / atrás |
| `t{c} / T{c}` | Hasta carácter hacia adelante / atrás |

### Movimiento por Pantalla y Archivo

| Command | Description |
|---------|-------------|
| `gg / G` | Ir a primera / última línea |
| `:{n}` | Ir a línea n |
| `Ctrl+d / Ctrl+u` | Media página abajo / arriba |
| `Ctrl+f / Ctrl+b` | Página completa abajo / arriba |
| `H / M / L` | Parte superior / media / inferior de la pantalla |
| `%` | Saltar al corchete coincidente |

## Edición

### Insertar y Añadir

| Command | Description |
|---------|-------------|
| `I` | Insertar al principio de la línea |
| `A` | Añadir al final de la línea |
| `ea` | Añadir al final de la palabra |
| `gi` | Insertar en la última posición de inserción |

### Eliminar y Cambiar

| Command | Description |
|---------|-------------|
| `x / X` | Eliminar carácter bajo / antes del cursor |
| `dd` | Eliminar línea |
| `dw` | Eliminar palabra |
| `d$ / D` | Eliminar hasta el final de la línea |
| `cc / S` | Cambiar línea entera |
| `cw` | Cambiar palabra |
| `c$ / C` | Cambiar hasta el final de la línea |
| `ci" / ci(` | Cambiar dentro de comillas / paréntesis |

### Copiar y Pegar

| Command | Description |
|---------|-------------|
| `yy` | Copiar (yank) línea |
| `yw` | Copiar palabra |
| `y$` | Copiar hasta el final de la línea |
| `p / P` | Pegar después / antes del cursor |
| `J` | Unir la línea de abajo a la actual |

### Deshacer y Repetir

| Command | Description |
|---------|-------------|
| `u` | Deshacer |
| `Ctrl+r` | Rehacer |
| `.` | Repetir último comando |

## Buscar y Reemplazar

### Búsqueda

| Command | Description |
|---------|-------------|
| `/pattern` | Buscar hacia adelante |
| `?pattern` | Buscar hacia atrás |
| `n / N` | Siguiente / coincidencia anterior |
| `*` | Buscar palabra bajo el cursor (adelante) |
| `#` | Buscar palabra bajo el cursor (atrás) |

### Sustitución

```
:s/old/new/       " reemplazar primero en línea
:s/old/new/g      " reemplazar todos en línea
:%s/old/new/g     " reemplazar todos en archivo
:%s/old/new/gc    " reemplazar todos, confirmar cada uno
```

## Modo Visual

### Selección

| Command | Description |
|---------|-------------|
| `v` | Iniciar selección de carácter |
| `V` | Iniciar selección de línea |
| `Ctrl+v` | Iniciar selección de bloque |
| `o` | Moverse al otro extremo de la selección |
| `gv` | Reseleccionar última selección visual |

### Acciones sobre la Selección

| Command | Description |
|---------|-------------|
| `d` | Eliminar selección |
| `y` | Copiar selección |
| `c` | Cambiar selección |
| `>` | Indentar selección |
| `<` | Quitar indentación de selección |
| `~` | Alternar mayúsculas/minúsculas |
| `U / u` | Mayúsculas / minúsculas de selección |

## Buffers y Ventanas

### Buffers

| Command | Description |
|---------|-------------|
| `:ls` | Listar buffers abiertos |
| `:bn / :bp` | Siguiente / buffer anterior |
| `:b{n}` | Ir al buffer n |
| `:bd` | Cerrar buffer actual |
| `:e file` | Abrir archivo en nuevo buffer |

### Ventanas

| Command | Description |
|---------|-------------|
| `:sp file` | División horizontal |
| `:vsp file` | División vertical |
| `Ctrl+w h/j/k/l` | Navegar a ventana |
| `Ctrl+w =` | Igualar tamaños de ventana |
| `Ctrl+w q` | Cerrar ventana |

### Pestañas

| Command | Description |
|---------|-------------|
| `:tabnew file` | Abrir archivo en nueva pestaña |
| `gt / gT` | Siguiente / pestaña anterior |
| `:tabclose` | Cerrar pestaña actual |

## Registros

### Usar Registros

| Command | Description |
|---------|-------------|
| `"ay` | Copiar en registro a |
| `"ap` | Pegar desde registro a |
| `"Ay` | Añadir copia al registro a |
| `:reg` | Mostrar todos los registros |

### Registros Especiales

| Command | Description |
|---------|-------------|
| `""` | Sin nombre (último eliminado/copiado) |
| `"0` | Última copia |
| `"+` | Portapapeles del sistema |
| `"/"` | Último patrón de búsqueda |
| `".` | Último texto insertado |
| `"_` | Agujero negro (descartar) |

## Macros

### Grabar y Reproducir

| Command | Description |
|---------|-------------|
| `q{a}` | Iniciar grabación de macro en registro a |
| `q` | Detener grabación |
| `@{a}` | Reproducir macro desde registro a |
| `@@` | Repetir última macro |
| `5@a` | Reproducir macro a 5 veces |

### Ejemplo de Macro

```
qa        " iniciar grabación en a
I//       " insertar // al inicio de línea
Esc j     " volver a normal, bajar
q         " detener grabación
10@a      " comentar las siguientes 10 líneas
```

## Configuración

### Opciones Comunes

```
:set number         " mostrar números de línea
:set relativenumber  " números de línea relativos
:set tabstop=4      " ancho de tabulación
:set expandtab      " espacios en lugar de tabulaciones
:set ignorecase     " búsqueda sin distinción de mayúsculas
```

### Visualización y Comportamiento

```
:set wrap / nowrap   " alternar ajuste de línea
:set hlsearch        " resaltar coincidencias de búsqueda
:set incsearch       " búsqueda incremental
:set cursorline      " resaltar línea actual
:syntax on           " activar resaltado de sintaxis
```

## Operaciones de Archivo

### Guardar y Salir

| Command | Description |
|---------|-------------|
| `:w` | Guardar |
| `:w file` | Guardar como archivo |
| `:q` | Salir (falla si hay cambios sin guardar) |
| `:q!` | Salir sin guardar |
| `:wq / :x / ZZ` | Guardar y salir |
| `:wa` | Guardar todos los buffers |
| `:qa` | Salir de todos los buffers |

### Información de Archivo y Externo

| Command | Description |
|---------|-------------|
| `Ctrl+g` | Mostrar información del archivo |
| `:!cmd` | Ejecutar comando de shell |
| `:r !cmd` | Insertar salida de comando |
| `:r file` | Insertar contenido de archivo |

## Objetos de Texto

### Objetos Internos y Alrededor

| Command | Description |
|---------|-------------|
| `iw / aw` | Dentro / alrededor de la palabra |
| `is / as` | Dentro / alrededor de la oración |
| `ip / ap` | Dentro / alrededor del párrafo |
| `i" / a"` | Dentro / alrededor de comillas dobles |
| `i' / a'` | Dentro / alrededor de comillas simples |
| `i( / a(` | Dentro / alrededor de paréntesis |
| `i{ / a{` | Dentro / alrededor de llaves |
| `it / at` | Dentro / alrededor de etiqueta HTML |

### Combinaciones Comunes

```
ciw     " cambiar palabra interna
di"     " eliminar dentro de comillas
ya{     " copiar alrededor de llaves
vip     " seleccionar párrafo interno
```

## Marcas y Saltos

### Marcas

| Command | Description |
|---------|-------------|
| `m{a}` | Establecer marca a en posición del cursor |
| `'a` | Saltar a la línea de la marca a |
| ``a` | Saltar a la posición exacta de la marca a |
| `:marks` | Listar todas las marcas |

### Lista de Saltos

| Command | Description |
|---------|-------------|
| `Ctrl+o` | Saltar a posición anterior |
| `Ctrl+i` | Saltar a siguiente posición |
| `:jumps` | Mostrar lista de saltos |
| `''` | Saltar a la última posición de salto |
