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     ┃
┃     ↓     ┃
┗━━━━━━━━━━━┛
unidadsaltar al principiosaltar al final
palabrabe
linea0$
párrafo{}
archivoggG
ventanaHL

palabras vs PALABRAS

comandodescripción
wir al principio de la siguiente palabra
Wir al principio de la siguiente PALABRA
eir al final(end) de la siguiente palabra
Eir al final(end) de la siguiente PALABRA
bir al principio de la anterior(back) palabra
Bir 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 :

comandodescripción
:help dayuda para el comando “d”
:wguardar archivo (write)
:w fooguardar como “foo”
:qsalir de vim
:q!salir de vim sin guardar (forzar)
:wqguardar y salir de vim
:e fooabrir archivo “foo”
:!lsejecutar comando de shell “ls”
:r !lsejecutar 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
3tercera linea
$última linea
%todas las lineas
.+1linea después de la actual
1,10rango entre 1 y 10

flags

gremplazar todo
cpreguntar por confirmación
iignorar mayúsculas
Ino 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

comandodescripción
:earlier 10mDeshacer cambios en los últimos 10 minutos
:ea 2dDeshacer cambios en los últimos 2 días
:later 10mReshacer cambios en los últimos 10 minutos
:lat 10sReshacer cambios en los últimos 10 segundos
:ea 3fDeshacer 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

xborrar caracter
rremplazar caracter
ccambiar (change)
yyank (copiar)
dborrar (delete)
ppegar
vselección visual

Modificadores

identro (inside)
aalrededor (around)
NUMcualquier número (0,1,2..)
tbusca un caracter y acaba antes de él (to —)
fbusca un caracter y acaba en él (find)

Nombres

wprincipio de la próxima palabra (word)
bprincipio de la previa palabra (before)
efinal de la palabra (end)
sfrase (sentence)
ppárrafo
ttag (HTML)
bbloque de código
h,j,k,lizquierda, abajo, arriba, derecha
$final de la línea
0principio 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

  1. Para empezar a grabar una macro usamos q en Normal Mode
  2. Escogemos el registro donde guardarla por ejemplo a
  3. Ejecutamos los comando a grabar
  4. 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

registrodescripción
=última expresión evaluada
+portapapeles del sistema
_(vacío) borra todo lo que peguemos

Splits y pestañas

Splits

Ctr-w vsplit vertical
Ctr-w ssplit horizontal
Ctr-w hmoverse a la ventana a la izquierda
Ctr-w jmoverse a la ventana debajo
Ctr-w kmoverse a la ventana encima
Ctr-w lmoverse a la ventana a la derecha
Ctr-w ccerrar (borrar) split

Pestañas

Ctrl-w Tmover split actual a una nueva pestaña
gtmoverse a la siguiente pestaña
gTmoverse a la anterior pestaña

File management

Vim cuenta con un navegador de archivos integrado: netrw

comandodescripción
:ExAbrir directorio actual en ventana actual
:Ex dirAbrir <dir> en ventana actual
:Sex(sí, leiste bien) como :Ex pero en eun split horizontal
:VexComo :Ex pero en un split vertical
:TexComo :Ex pero en una pestaña nueva

Comandos en netrw

comandodescripción
<Enter>abrir archivo en vim
Dborrar(delete) archivo
Rrename archivo
Xejecutar 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

comandodescripción
:args file1 file2 ...popular la lista de argumentos con archivos
:args *.txtpopular la lista de argumentos con todos los .txt
:arga file.txtañ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:

nnoremapmap keys in normal mode
inoremapmap keys in insert mode
vnoremapmap 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