Links: Vim
Notas de la charla
https://wiki.migueldeoleiros.com/notes/20250309132443-vim

Presentación completa en formato web
https://wiki.migueldeoleiros.com/notes/20250310101020-vim_presentation

Qué es Vim?
Según su página oficial:
” Vim es un editor de texto altamente configurable diseñado para crear y modificar cualquier tipo de texto de manera muy eficiente ”
Pero, Cual es la diferencia entre Vim y otros editores de texto?
Y porqué es más eficiente?
Modos en Vim
-
Normal mode
-
Insert mode
-
Visual mode
-
Command mode
Comandos para moverse
┏━━━━━━━━━━━┓
┃ ↑ ┃
┃ k ┃
┃ ← h l → ┃
┃ j ┃
┃ ↓ ┃
┗━━━━━━━━━━━┛| unidad | saltar al principio | saltar al final |
|---|---|---|
| palabra | b | e |
| linea | 0 | $ |
| párrafo | { | } |
| archivo | gg | G |
| ventana | H | L |
palabras vs PALABRAS
| comando | descripción |
|---|---|
| w | ir al principio de la siguiente palabra |
| W | ir al principio de la siguiente PALABRA |
| e | ir al final(end) de la siguiente palabra |
| E | ir al final(end) de la siguiente PALABRA |
| b | ir al principio de la anterior(back) palabra |
| B | ir al principio de la anterior(back) PALABRA |
Buscar
Similar a Ctr-f en vim usamos /
Para movernos en la selección usamos n y N
Para buscar en el otro sentido (encima) usamos ?
Podemos buscar la palabra actual con * o # para el sentido inverso
Insert Mode
para entrar en Insert Mode usamos i
Para volver a el modo Normal ESC
Si queremos entrar en el siguiente caracter a
Para una nueva linea o
Para empezar al principio de la linea I
Para empezar al final de la linea A
Comandos de edición
Para remplazar un caracter usamos r
Mejor usar el comando c (change)
Para remplazar una palabra cw
Copiar, pegar, y borrar
Similar a Ctr-c y Ctr-v en Vim usamos:
y yank (copy)
p paste
Para cortar o borrar usamos d (delete)
yy copiar una linea
dd borrar una linea
p pegar
Visual mode
Es el modo para selección
Para entrar en Visual Mode usamos v
Para el el modo Visual Line usamos V
Para el el modo Visual Block usamos Ctr-v
podemos ejecutar comandos en la selección como y, d o c
TIP Inserción multiple usando Visual Bloc + I o A
Command mode
Para entrar en el modo de comandos usamos :
| comando | descripción |
|---|---|
| :help d | ayuda para el comando “d” |
| :w | guardar archivo (write) |
| :w foo | guardar como “foo” |
| :q | salir de vim |
| :q! | salir de vim sin guardar (forzar) |
| :wq | guardar y salir de vim |
| :e foo | abrir archivo “foo” |
| :!ls | ejecutar comando de shell “ls” |
| :r !ls | ejecutar comando de shell “ls” e insertarlo |
Comando :Sex ?
Búsqueda y remplazo
:[rango] s[ubstitute]/patrón/string/[flags] [count]
Ejemplos:
:%s/bad/good/g
:%s/\<good\>/bad/g
:%s/bad/good/gc
:%s/\(bad\|good\)/great/g
:1,10s/bad/good/g
Rango
| . | linea actual |
|---|---|
| 3 | tercera linea |
| $ | última linea |
| % | todas las lineas |
| .+1 | linea después de la actual |
| 1,10 | rango entre 1 y 10 |
flags
| g | remplazar todo |
|---|---|
| c | preguntar por confirmación |
| i | ignorar mayúsculas |
| I | no ignorar mayúsculas |
El comando “global”
Ejecuta un cómando en la línea que contenga un patrón
:[rango]g/patrón/comando
Ejemplos:
:g/error/d
Para invertir la búsqueda :g!/error/d
Podemos combinar comandos :g/bad/s/good/great/g
Podemos ejecutar un comando de Normal Mode con el prefijo normal
:g/something/normal @a
Deshacer, Rehacer y Viajar en el tiempo
Deshacemos cambios con u (podemos añadir modificador 3u)
Rehacemos cambios con Ctr-r
| comando | descripción |
|---|---|
| :earlier 10m | Deshacer cambios en los últimos 10 minutos |
| :ea 2d | Deshacer cambios en los últimos 2 días |
| :later 10m | Reshacer cambios en los últimos 10 minutos |
| :lat 10s | Reshacer cambios en los últimos 10 segundos |
| :ea 3f | Deshacer cambios en las últimas 3 escrituras del archivo |
Gramática en VIM
En Vim podemos mezclar comandos y modificadores para ejecutar diferentes
acciones.
Dividiremos las partes de un comando en 3:
Verbos
| x | borrar caracter |
|---|---|
| r | remplazar caracter |
| c | cambiar (change) |
| y | yank (copiar) |
| d | borrar (delete) |
| p | pegar |
| v | selección visual |
Modificadores
| i | dentro (inside) |
|---|---|
| a | alrededor (around) |
| NUM | cualquier número (0,1,2..) |
| t | busca un caracter y acaba antes de él (to —) |
| f | busca un caracter y acaba en él (find) |
Nombres
| w | principio de la próxima palabra (word) |
|---|---|
| b | principio de la previa palabra (before) |
| e | final de la palabra (end) |
| s | frase (sentence) |
| p | párrafo |
| t | tag (HTML) |
| b | bloque de código |
| h,j,k,l | izquierda, abajo, arriba, derecha |
| $ | final de la línea |
| 0 | principio de la línea |
Crear “frases”
Podemos repetir un comando N veces añadiendo un modificador antes: 2w
Podemos añadir un verbo antes del modificador: d2w
- vap Seleccionar un párrafo (visual around paragraph)
- ci” Cambiar texto entre comillas (change inside quote)
- ca” Cambiar texto alrededor de comillas (change around quote)
- dt, Borrar texto hasta siguiente coma en linea (delete to coma)
- dj Borrar esta y la siguiente linea (delete down)
- d/algo Borrar hasta la palabra “algo” (delete find “algo”)
El “punto”
Puedes repetir el último comando en Normal Mode con .
Esto no tendrá en cuenta los comandos de movimiento, solo los que editan texto
Puedes repetirlo tantas veces como quieras o usar un modificador de número
Macros
Grabar una macro
- Para empezar a grabar una macro usamos q en Normal Mode
- Escogemos el registro donde guardarla por ejemplo a
- Ejecutamos los comando a grabar
- Pulsamos q otra vez
Ejecutar una macro
En Normal Mode usamos @ + el registro, por ejemplo a : @a
Podemos ejecutar la repetir la última macro con @@ en lugar de .@
Podemos usar recursión en una macro para ejecutarla en todo un archivo
Registros
Para acceder a un registro usamos ” + el registro, por ejemplo a : “a
Podemos añadir texto a un registro con y : “ay
Podemos imprimir el texto de un registro con p : “ap
Para ver la lista de los registros en uso podemos ejecutar :reg o :register
Yank, delete y los registros numerados
Yank y delete guardan su contenido ambos en el registro ”
""p es lo mismo que p
Por el contrario, solo el texto copiado se guarde en el registro 0
Puedes acceder al último texto copiado con “0p
Tanto el texto copiado como el borrado se guarda por orden en los registros del
1 al 9. por lo que podemos acceder al texto copiado anterior.
Registros de solo lectura
| . | último texto insertado |
|---|---|
| % | path del archivo actual |
| : | último comando ejecutado |
| # | previo archivo editado |
Registros alfabéticos y macros
Una macro no es más que ejecutar el contenido de un registro con @
En los mísmos registros que las macros podemos guardas cualquier cosa
Con el comando :let puedes introducir texto directamente : :let @a=‘hola’
Los registros a y A son el mismo, pero con A concatenamos y con a sobreescribimos
Other registers
| registro | descripción |
|---|---|
| = | última expresión evaluada |
| + | portapapeles del sistema |
| _ | (vacío) borra todo lo que peguemos |
Splits y pestañas
Splits
| Ctr-w v | split vertical |
|---|---|
| Ctr-w s | split horizontal |
| Ctr-w h | moverse a la ventana a la izquierda |
| Ctr-w j | moverse a la ventana debajo |
| Ctr-w k | moverse a la ventana encima |
| Ctr-w l | moverse a la ventana a la derecha |
| Ctr-w c | cerrar (borrar) split |
Pestañas
| Ctrl-w T | mover split actual a una nueva pestaña |
|---|---|
| gt | moverse a la siguiente pestaña |
| gT | moverse a la anterior pestaña |
File management
Vim cuenta con un navegador de archivos integrado: netrw
| comando | descripción |
|---|---|
:Ex | Abrir directorio actual en ventana actual |
:Ex dir | Abrir <dir> en ventana actual |
:Sex | (sí, leiste bien) como :Ex pero en eun split horizontal |
:Vex | Como :Ex pero en un split vertical |
:Tex | Como :Ex pero en una pestaña nueva |
Comandos en netrw
| comando | descripción |
|---|---|
| <Enter> | abrir archivo en vim |
| D | borrar(delete) archivo |
| R | rename archivo |
| X | ejecutar archivo |
| % | crear nuevo archivo |
Puedes usar visual mode para seleccionar multiples archivos
Multifile editing
args contiene los argumentos pasados por comando al iniciar vim, pero podemos añadir o cambiar los elementos
| comando | descripción |
|---|---|
:args file1 file2 ... | popular la lista de argumentos con archivos |
:args *.txt | popular la lista de argumentos con todos los .txt |
:arga file.txt | añadir archivo a la lista de argumentos |
Para ejecutar un comando en la lista de argumentos: :argdo command
Para ejecutar un comando en la lista de buffers abiertos :bufdo command
Ejemplos
:argdo %s/foo/bar/g | update
:argdo exe "normal @a" | update
:bufdo %s/foo/bar/gc | update
:bufdo exe '%!sort' | update
Crear atajos de teclado Vim Classic
map_mode <atajo> <comando original>
Los map_mode puede ser:
| nnoremap | map keys in normal mode |
|---|---|
| inoremap | map keys in insert mode |
| vnoremap | map keys in visual mode |
Ejemplos:
" Resize split windows using arrow keys by pressing:
" CTRL+UP, CTRL+DOWN, CTRL+LEFT, or CTRL+RIGHT.
noremap <c-up> <c-w>+
noremap <c-down> <c-w>-
noremap <c-left> <c-w>>
noremap <c-right> <c-w><Crear atajos de teclado Neovim
En neovim podemos usar lua en lugar de vimscript
Ejemplos:
-- Resize split windows using arrow keys by pressing:
-- CTRL+UP, CTRL+DOWN, CTRL+LEFT, or CTRL+RIGHT.
vim.keymap.set("n", "<c-up>", "<c-w>+")
vim.keymap.set("n", "<c-down>", "<c-w>-")
vim.keymap.set("n", "<c-left>", "<c-w>>")
vim.keymap.set("n", "<c-right>", "<c-w><")Distribuciones preconfiguradas
Para empezar a usar Neovim con una configuración IDE-like
- LazyVim
- NVChad
- LunarVim
- Astrovim
VSCode Neovim usa Neovim como backend para máxima compatibilidad