# 103.8 - Edición básica de archivos

<table data-header-hidden data-full-width="true"><thead><tr><th width="148"></th><th></th></tr></thead><tbody><tr><td><strong>Importancia</strong></td><td>3</td></tr><tr><td><strong>Descripción</strong></td><td>El candidato debe ser capaz de editar archivos de texto usando vi. El objetivo incluye la navegación en vi, los modos básicos de vi, así como insertar, editar, borrar, copiar y encontrar texto utilizando vi. También se incluye el conocimiento de otros editores de texto populares y saber establecer el editor predeterminado.</td></tr></tbody></table>

#### *Áreas de conocimiento clave:*

* Navegar por un documento usando vi.
* Entender y usar los modos de vi.
* Insertar, editar, borrar, copiar y encontrar texto usando vi.
* Conocimientos de Emacs, nano y vim.
* Configurar el editor estándar.

### *Contenidos*

### Editor vi

`vi` es un editor de texto modal, potente y ampliamente utilizado en sistemas Unix y Linux. Su nombre proviene de "visual" y es conocido por ser ligero y estar disponible por defecto en casi todos los sistemas Unix.

Tienes varias modalidades de funcionamiento

* **Modo Normal**: En este modo, las teclas funcionan como comandos para mover el cursor, borrar texto, copiar y pegar, etc. Para entrar solo pulsa "`ESC`"
* **Modo Inserción**: Permite insertar texto en el archivo. Se entra en este modo con comandos como `i` (insertar antes del cursor) o `a` (insertar después del cursor).
* **Modo Línea de Comando**: Permite realizar operaciones de archivo, búsqueda y reemplazo, y otras tareas mediante comandos iniciados con `:`.

Lo primero es empezar por secuencias de teclas `ESC + ESC + ESC + :q!` -> **Panic mode**, cuidado, no usar *Ctrl+Z* ya que esto significa pausar el proceso, podemos seguir viendo con `ps`. Este proceso se puede ver como un fichero abierto como `.test.swp` en archivos ocultos

Tenemos tres tipos de trabajo:

* Navegación
* Inserción
* Ejecución

***

### 🔥 **Abrir `vi`**

```bash
vi nombre_archivo
```

Si el archivo no existe, `vi` lo creará.

***

### 🎯 **Navegación básica en el Modo Normal**

* `h` → Mueve el cursor a la izquierda
* `l` → Mueve el cursor a la derecha
* `j` → Mueve el cursor hacia abajo
* `k` → Mueve el cursor hacia arriba

#### ✅ Movimiento rápido:

* `w` → Mueve al principio de la siguiente palabra
* `b` → Mueve al principio de la palabra anterior
* `0` → Mueve al principio de la línea
* `$` → Mueve al final de la línea
* `G` → Salta al final del archivo
* `gg` → Salta al principio del archivo
* `:n` → Salta a la línea `n`

***

### ✨ **Modo Inserción (Insert Mode)**

Para entrar en modo inserción, usa uno de estos comandos:

* `i` → Inserta antes del cursor
* `I` → Inserta al inicio de la línea
* `a` → Inserta después del cursor
* `A` → Inserta al final de la línea
* `o` → Abre una nueva línea debajo
* `O` → Abre una nueva línea arriba

Para salir del modo inserción, presiona `Esc`.

***

### 🛑 **Eliminar texto**

* `x` → Borra el carácter bajo el cursor
* `dw` → Borra una palabra
* `dd` → Borra una línea
* `d$` → Borra desde el cursor hasta el final de la línea
* `dG` → Borra desde la línea actual hasta el final del archivo

***

### 📝 **Copiar, Cortar y Pegar**

* `yy` → Copia la línea actual
* `y$` → Copia desde el cursor hasta el final de la línea
* `yw` → Copia una palabra
* `p` → Pega después del cursor
* `P` → Pega antes del cursor
* `dd` → Corta una línea

***

### 🔎 **Búsqueda de texto**

* `/palabra` → Busca "palabra" hacia adelante
* `?palabra` → Busca "palabra" hacia atrás
* `n` → Repite la búsqueda en la misma dirección
* `N` → Repite la búsqueda en dirección opuesta

***

### 💾 **Guardar y salir**

* `:w` → Guarda el archivo
* `:q` → Salir
* `:wq` → Guarda y sale
* `:q!` → Salir sin guardar
* `:x` → Guarda y sale (similar a `:wq`)

***

### 🌟 **Deshacer y rehacer**

* `u` → Deshacer
* `Ctrl + r` → Rehacer

***

### 🎯 **Seleccionar texto (Modo Visual)**

* `v` → Selección de texto carácter por carácter
* `V` → Selección de texto línea por línea
* `Ctrl + v` → Selección por bloque (modo visual rectangular)

***

### 🔧 **Editar múltiples archivos**

Abrir varios archivos:

```bash
vi archivo1 archivo2
```

* `:n` → Ir al siguiente archivo
* `:prev` → Ir al archivo anterior
* `:buffers` → Listar todos los archivos abiertos
* `:buffer <n>` → Ir al archivo número `n`

***

### 🚀 **Comandos avanzados**

* `:!comando` → Ejecuta un comando del sistema, por ejemplo `:!ls`
* `:r archivo.txt` → Inserta el contenido de otro archivo.
* `:g/palabra/d` → Borra todas las líneas que contienen "palabra".
* `:s/viejo/nuevo/g` → Reemplaza "viejo" por "nuevo" en la línea actual.
* `:%s/viejo/nuevo/g` → Reemplaza en todo el archivo.

***

### 📚 Recursos adicionales

* `man vi` → Manual oficial en la terminal

A continuación tienes una chuleta visual de algunos atajos pero te insto a probar el comando `vimtutor` (viene instalado con `vim`, sino instálalo de forma normal).

<figure><img src="https://727141126-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGDxv9DabSo9OMw53A4vS%2Fuploads%2FsVJA89VYEh8y8pZyKMaf%2Fimage.png?alt=media&#x26;token=f44d93c1-f8a4-47ab-bf80-cf81c2cba48c" alt=""><figcaption><p>Vim editor cheatsheet Fuente: sysexplore</p></figcaption></figure>

Aqui está la chuleta en texto de comandos de vi:

<details>

<summary>Chuleta de vi</summary>

```
Navegacion
----------
[N]h,j,k,l   --> N movimientos izda,abajo.arriba,dcha

[N]G         --> Ve a la línea N
gg           --> Ve al inicio del fichero
G            --> Ve al final del fichero
:$           --> Ve al final del fichero

^            --> Inicio de línea
0            --> Inicio de línea
$            --> Fin de línea

[N]w  ()       --> N desplazamientos entre palabras hacia delante
[N]W  ()      --> N desplazamientos entre espacios hacia delante
[N]b  (back)       --> N desplazamientos entre palabras hacia atras
[N]B         --> N desplazamientos entre espacios hacia atras
[N]e         --> N desplazaminetos al final de palabra

[N]dd  (delete)      --> cortar N lineas
[N]dw        --> cortar N palabras
d0           --> cortar hasta inicio de linea
d$           --> cortar hasta final de linea

x            --> borrar carácter aunque no borra la linea

y0           --> copiar hasta inicio de linea
y$           --> copiar hasta final de linea
[N]yy        --> copiar N lineas
[N]yw        --> copiar N palabras

p            --> pegar a continuación o en una linea nueva si se crea
P            --> pegar antes de la linea

u            --> deshacer última operación

Insercion
---------
i            --> insertar texto a la izda del cursor
a            --> insertar texto a la dcha del cursor

I            --> insertar texto al inicio de la linea 
A            --> insertar texto al final de la linea

o            --> insertar nueva linea a continuacion
O            --> insertar nueva linea previa


Ejecucion
---------
:w                         guardar
:q                         salir
:x                         guardar y salir (:wq)
ZZ                         guardar y salir
:q!                        salir sin guardar
:w!                        forzar guardado
:x!                        forzar salir guardando

:w [PATH]                  guardar como en la ruta designada, util para cuando se abre sin privilegios

:! [COMMAND]               'abrir' una shell y ejecutar comandos
:r! [COMMAND]              'abrir' una shell y volcar stdout de un comando en mi fichero

/pattern:                  busca el patron indicado en sentido descendente
?pattern:                  busca el patron indicado en sentido ascendente
   - n:                    siguiente coincidencia
   - N:                    anterior coincidencia
:set number                mostrar numeros de linea

:s/pattern1/pattern2/      busca la 1a coincidencia de 'pattern1' y lo reemplazamos por 'patern2' en la línea actual
:N,Ms/pattern1/pattern2/   busca la 1a coincidencia de 'pattern1' y lo reemplazamos por 'patern2' en el rango de líneas indicadas

:s/pattern1/pattern2/g     busca todas las coincidencias de 'pattern1' y lo reemplazamos por 'patern2' en la línea actual
:N,Ms/pattern1/pattern2/g  busca todas las coincidencias de 'pattern1' y lo reemplazamos por 'patern2' en el rango de líneas indicadas
  Por ejemplo, :1,$s/pattern1/pattern2/g -> para que lo haga en todo el texto

:ab pattern1 pattern2      Sustituye automaticamente el pattern1 por el pattern2 en esta instancia de vi


```

</details>

Y también por último tienes un juego sobre su funcionamiento: <https://vim-adventures.com/>
