Mis apuntes sobre Vim

Cómo copiar objetos de texto

Yank: uso básico

  • yy copio toda la linea
  • yw o yW copio palabra (OJO: desde donde está el cursor al final de la palabra, ver yaw)
  • y$ copio desde el cursor hasta el final de la linea
  • y} 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 alrededor
  • yiw copia la palabra donde está el cursor, pero sin los espacios en blanco
  • yas copia toda la sentencia donde está el cursor
  • yap 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 corchetes
  • yi{ 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- y g+ 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.