proyectos ejemplos emacs undo-redo

emacs - ejemplos - django



¿Cómo "rehacer" los cambios después de "deshacer" con Emacs? (6)

¡Cuidado con una peculiaridad de undo-tree para rehacer !

Muchos "kits de inicio" populares (preludio, purcell, spacemacs) vienen con undo-tree. La mayoría (¿todos?) Incluso lo habilitan automáticamente. Como se mencionó, deshacer árbol es una forma útil de visualizar y atravesar el árbol deshacer / rehacer. Prelude incluso le da un acorde clave ( uu ), y también Cx u .

El problema es que: undo-tree parece arruinar el enlace predeterminado y conocido de Emacs para rehacer : Cg C-/ .

En su lugar, puede usar estas teclas simétricas para deshacer / rehacer :

C-/ undo C-S-/ redo

Estos son útiles ya que a veces desea rehacer rápidamente sin abrir el visualizador.

Este artículo dice que "Emacs se ha rehecho porque puedes revertir la dirección mientras deshaces, deshaciendo así el deshacer".

¿Qué significa esto? ¿Cómo puede un usuario ''rehacer'' con Emacs?


Encuentro redo.el extremadamente útil para hacer deshacer / rehacer "normal", y generalmente lo ato con CSz y lo deshago con Cz, como esto:

(when (require ''redo nil ''noerror) (global-set-key (kbd "C-S-z") ''redo)) (global-set-key (kbd "C-z") ''undo)

Solo descargue el archivo, póngalo en su ruta de acceso y pegue lo anterior en su .emacs .


Para aquellos que desean tener la funcionalidad más común de deshacer / rehacer, alguien ha escrito undo-tree.el . Proporciona la apariencia de deshacer sin Emacs, pero proporciona acceso a todo el ''árbol'' del historial de deshacer.

Me gusta el sistema de deshacer incorporado de Emacs, pero este paquete me parece muy intuitivo.

Aquí está el comentario del archivo en sí:

Emacs tiene un poderoso sistema de deshacer. A diferencia del sistema estándar de deshacer / rehacer en la mayoría de los programas, le permite recuperar cualquier estado anterior de un búfer (mientras que el sistema estándar de deshacer / rehacer puede perder los estados anteriores tan pronto como lo haga). Sin embargo, este poder tiene un precio: muchas personas encuentran el sistema de deshacer de Emacs confuso y difícil de usar, generando una serie de paquetes que lo reemplazan con el sistema de deshacer / rehacer menos poderoso pero más intuitivo.

Tanto la pérdida de datos con deshacer / rehacer estándar, como la confusión de deshacer de Emacs, provienen de tratar el historial de deshacer como una secuencia lineal de cambios. No es. El ''modo de deshacer-árbol'' que proporciona este paquete reemplaza el sistema de deshacer de Emacs con un sistema que trata el historial de deshacer como lo que es: un árbol de cambios de ramificación. Esta simple idea permite que el comportamiento más intuitivo del sistema estándar de deshacer / rehacer se combine con el poder de no perder ningún historial. Una ventaja adicional es que el historial de deshacer se puede almacenar en algunos casos de manera más eficiente, lo que permite que se acumulen más cambios antes de que Emacs comience a descartar el historial.


Para deshacer: C-_

Para rehacer después de un deshacer: Cg C-_

Escriba varias veces en C-_ para rehacer lo que C-_ ha deshecho. Para rehacer un comando de emacs varias veces, ejecute su comando, luego escriba Cx z y luego escriba muchas veces en la tecla z para repetir el comando (interesante cuando desee ejecutar varias veces una macro)


Versión corta: deshaciendo el deshacer. Si deshace y luego ejecuta un comando de no edición como Cf , el siguiente deshacer deshará el deshacer, lo que resultará en un rehacer.

Versión más larga:

Puedes pensar en deshacer como operando en una pila de operaciones. Si ejecuta algún comando (incluso un comando de navegación como Cf ) después de una secuencia de operaciones de deshacer, todas las acciones de deshacer se insertan en la pila de operaciones. Así que el siguiente deshacer deshace el último comando. Supongamos que tiene una secuencia de operación que se ve así:

  1. Insertar "foo"
  2. Insertar "barra"
  3. Insertar "Me encanta el spam"

Ahora, deshacer. Deshace la última acción, resultando en la siguiente lista:

  1. Insertar "foo"
  2. Insertar "barra"

Si hace otra cosa que no sea deshacer en este punto, digamos, Cf , la pila de operaciones se ve así:

  1. Insertar "foo"
  2. Insertar "barra"
  3. Insertar "Me encanta el spam"
  4. Deshacer insertar "Me encanta el spam"

Ahora, cuando deshaces, lo primero que se deshace es deshacer. Resultando en su pila original (y el estado del documento):

  1. Insertar "foo"
  2. Insertar "barra"
  3. Insertar "Me encanta el spam"

Si ejecuta un comando de modificación para romper la secuencia de deshacer, ese comando se agrega después del deshacer y, por lo tanto, es lo primero que se deshace después. Supongamos que has retrocedido en "barra" en lugar de pulsar Cf. Entonces habrías tenido

  1. Insertar "foo"
  2. Insertar "barra"
  3. Insertar "Me encanta el spam"
  4. Deshacer insertar "Me encanta el spam"
  5. Eliminar "barra"

Esta adición / re-adición sucede infinitamente. Se tarda un poco en acostumbrarse, pero realmente le da a Emacs un mecanismo de deshacer / rehacer altamente flexible y poderoso.


  • Para deshacer una vez: C-/
  • Para deshacer dos veces: C-/ C-/
  • Para rehacer una vez, inmediatamente después de deshacer: Cg C-/
  • Para rehacer dos veces, inmediatamente después de deshacer: Cg C-/ C-/ . Tenga en cuenta que Cg no se repite.
  • Para deshacer inmediatamente de nuevo , una vez: Cg C-/
  • Para deshacer inmediatamente de nuevo, dos veces: Cg C-/ C-/
  • Para rehacer de nuevo , lo mismo ...

Si ha pulsado alguna tecla (ya sea escribiendo caracteres o simplemente moviendo el cursor) desde su último comando de deshacer, no es necesario que escriba Cg antes de su siguiente deshacer / rehacer. Cg es solo una tecla segura para golpear que no hace nada por sí misma, pero cuenta como una tecla de no deshacer para señalar el final de su secuencia de deshacer. Presionar otro comando como Cf también funcionaría; es solo que movería el cursor desde donde lo tenías.

Si presionas Cg u otro comando cuando no querías, y ahora estás deshaciendo en la dirección incorrecta, simplemente presiona Cg para revertir tu dirección nuevamente. Tendrá que deshacer todo el camino a través de sus rehacer y deshacer accidentalmente antes de llegar a las ejecuciones que desea, pero si sigue presionando C-/ , eventualmente alcanzará el estado que desea. De hecho, se puede alcanzar cada estado en el que haya estado el búfer, si presionas Cg una vez y luego presionas C-/ suficiente tiempo.

Los accesos directos alternativos para undo , aparte de C-/ , son C-_ , Cx u y Mx undo .

Consulte Undo en el Manual de Emacs para obtener más detalles sobre el sistema de deshacer de Emacs.