HOWTO · Linux

Cómo realizar operaciones de deshacer y rehacer en Vim y Vi

Aprenda a deshacer y rehacer cambios en Vim y Vi, a usar `:undolist` y `:earlier` para navegar por el historial de deshacer y a comprender la agrupación de deshacer.

En esta página

En Vim, vuelva al modo Normal con Esc y luego pulse u para deshacer el cambio más reciente o Ctrl-R para rehacer un cambio que acaba de deshacer. Estas son teclas del modo Normal. Los comandos Ex como :undo y :redo se introducen en la línea de comandos de Vim después de :.

Deshacer cambios en Vim y Vi

Pulse Esc para entrar en el modo Normal y luego pulse u. Para deshacer varios cambios, use un conteo como 3u o pulse u repetidamente. Las formas Ex :u y :undo también deshacen un cambio; escriba los dos puntos como parte del comando.

Por ejemplo, comience con Hello World. En el modo Insertar, añada Beautiful entre las palabras y luego pulse Esc; la línea se convierte en Hello Beautiful World. Pulse u en el modo Normal para restaurar Hello World. Los grupos de deshacer dependen de las reglas de edición y del contexto de Vim, por lo que no se garantiza que una serie de escritura forme un solo paso de deshacer en todas las situaciones.

El pequeño ejemplo de shell siguiente modela los mismos estados de texto: antes, editado, deshecho y rehecho. Ilustra la secuencia de texto; las pulsaciones de Vim anteriores se realizan en el editor.

before='Hello World'
edited='Hello Beautiful World'
current=$edited
printf 'Edited: %s\n' "$current"
current=$before
printf 'After u: %s\n' "$current"
current=$edited
printf 'After Ctrl-R: %s\n' "$current"
Edited: Hello Beautiful World
After u: Hello World
After Ctrl-R: Hello Beautiful World

Rehacer cambios en Vim y Vi

Después de deshacer, pulse Ctrl-R en el modo Normal para rehacer el cambio. Un conteo como 3<C-R> rehace hasta tres cambios deshechos. También puede introducir :redo en la línea de comandos. En el ejemplo anterior, Ctrl-R restaura Hello Beautiful World.

Rehacer sigue el historial de deshacer actual. Si deshace y luego realiza una nueva edición, Vim cambia ese historial; no espere que Ctrl-R restaure una rama de ediciones abandonada.

Use :undolist para mostrar la información de la secuencia de deshacer. Para ir a un estado numerado, use :undo {N}; {N} es un número de secuencia de deshacer, no un ID de cambio arbitrario. Por ejemplo, :undo 3 va al número de secuencia 3.

Use :earlier {N} para retroceder {N} cambios; por ejemplo, :earlier 3 retrocede tres cambios. El comando del modo Normal g- va a estados de texto más antiguos, mientras que g+ avanza hacia estados más recientes. Estos comandos navegan por el historial de deshacer de Vim; no seleccionan entradas por los números que imprime :undolist.

Comprender los bloques de deshacer y el comando U

La u minúscula deshace un cambio en el historial de deshacer. La U mayúscula tiene un comportamiento diferente, centrado en la línea: en Vim restaura la línea actual a su estado anterior según las reglas de deshacer de Vim. No es otra forma de escribir u y no significa «deshacer todos los cambios de la línea» en todos los contextos de edición. La agrupación de deshacer puede variar según los comandos utilizados y el momento en que Vim registra un cambio.

Las implementaciones de Vi difieren, así que consulte la ayuda del editor que esté usando si un comando se comporta de forma diferente. El historial de deshacer de Vim normalmente está disponible mientras la sesión de edición permanece abierta. Entre sesiones, la persistencia depende de la configuración del archivo de deshacer de Vim; guardar con :w escribe el búfer, pero por sí solo no garantiza que el historial de deshacer persista.

Preguntas frecuentes

¿Cómo deshago varios cambios? Vuelva al modo Normal y use un conteo como 3u, o repita u.

¿Cuál es la tecla de rehacer? Pulse Ctrl-R en el modo Normal o introduzca :redo en la línea de comandos de Vim.

¿Cómo puedo inspeccionar o navegar por el historial de deshacer? :undolist enumera la información de la secuencia; :undo {N} apunta a un número de secuencia. :earlier 3 retrocede tres cambios, mientras que g- y g+ se mueven entre estados más antiguos y más recientes.

¿Conserva Vim el historial de deshacer después de cerrarse? Puede hacerlo cuando el deshacer persistente está configurado y el archivo de deshacer está disponible. Sin esa configuración, no dé por hecho que el historial de la sesión sobrevivirá al cierre de Vim. :w guarda el contenido del archivo, no es una promesa de historial de deshacer persistente.