Mis apuntes sobre Vim
Cómo copiar objetos de texto
Yank: uso básico
yy
copio toda la lineayw
oyW
copio palabra (OJO: desde donde está el cursor al final de la palabra, veryaw
)y$
copio desde el cursor hasta el final de la lineay}
copio desde el cursos hasta el final de párrafo
Luego, para pegar uso p
(después) o P
(antes).
Yank en contexto (bloques determinados por delimitadores)
yaw
copia la palabra donde está el cursor, incluyendo los espacios en blanco alrededoryiw
copia la palabra donde está el cursor, pero sin los espacios en blancoyas
copia toda la sentencia donde está el cursoryap
copia todo el párrafo.
Nota: el uso de la “a” para definir un contexto hace que el delimitador sea incluido en la copia (and), mientras que el uso de la “i” hace que el delimitador sea excluido (inside). Así que para cada comando de copia, tenemos dos versiones: con la “a” o con la “i”
Delimitadores: aparte de los espacios en blanco, se pueden emplear otros delimitadores para definir bloques
- delimitadores: (, [, {, <, “, ', `
Así tenemos todo tipo de comandos que determinan qué bloque de texto va a ser copiado, dependiendo de esos delimitadores. Por ejemplo:
ya{
copia el texto delimitado por{..}
, incluyendo los corchetesyi{
copia el texto delimitado por{..}
, excluyendo los corchetes
Yank con Regex
y/<regex><CR>
copia desde la posición del cursor hasta donde encuentre por primera vez la regex (incluida).
Deshacer cambios (UNDO)
- UNDO:
u
- REDO:
Ctrl-R
Branches (ramas alternativas de cambios)
Elemental… salvo un detalle: si hago un cambio, lo deshago y escribo otra cosa, las nuevas versiones de vim abren una nueva historia de cambios (branching) y recuerda los cambios realizados en cada rama de la historia.
Normalmente el undo y redo funcionan sobre la última rama de cambios realizados, pero los comandos:
g-
yg+
permiten saltar entre ramas y por lo tanto es posible recuperar los cambios que se realizaron en una determinada rama. No sé qué tan útil pueda ser esto, pero es interesante saber que existe.
Branches 2: volver al estado del buffer hace t tiempo...
:earlier <time_offset>
:later <time_offset>
Ejemplos:
:earlier 15m :later 50s
Los <time_offset>
siempre son relativos (obviamente). Estos dos comandos parecen ser más razonables que g+
y g-
, porque te ubica temporalmente en el estado en que tenías el buffer y no se maneja por rama de cambios. Uno puede usar “bisección”, saltando hacia adelante y hacia atrás en el tiempo hasta recuperar el estado que prefiera.