¿Cómo 'rehace' los cambios después de 'deshacer' con Emacs?

268

Este artículo dice que "Emacs ha rehacido porque puede revertir la dirección mientras deshace, deshaciendo así la deshacer".

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

prosseek
fuente
3
La respuesta debajo de la respuesta aceptada le dice cómo , si es por eso que está viendo esta respuesta, que, dada la forma en que está escrita, esperaría que la mayoría de las personas realmente la estén buscando.
Aaron Hall
Acabo de presionar la barra espaciadora, y luego deshago deshacer el espacio y rehacer lo que hiciste hasta que llega al final y luego comienza a volver de nuevo ... Sé que hay formas mucho más complicadas, pero esto es rápido y fácil, y así es como ruedo.
nroose

Respuestas:

294

Versión corta: deshaciendo el deshacer. Si deshace y luego hace un comando de no edición como C-f, entonces el siguiente deshacer deshacerá el deshacer, lo que dará como resultado un rehacer.

Versión más larga:

Puede pensar en deshacer como operando en una pila de operaciones. Si realiza algún comando (incluso un comando de navegación como C-f) después de una secuencia de operaciones de deshacer, todas las operaciones de deshacer se envían a la pila de operaciones. Entonces, 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 te deshaces. Deshace la última acción, dando como resultado la siguiente lista:

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

Si hace algo diferente a deshacer en este punto, por ejemplo C-f, la pila de operaciones se ve así:

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

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

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

Si realiza un comando de modificación para romper la secuencia de deshacer, ese comando se agrega después de deshacer y, por lo tanto, es lo primero que se deshace después. Suponga que retrocede sobre "barra" en lugar de golpear C-f. Entonces hubieras tenido

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

Esta adición / re-adición ocurre hasta el infinito. Cuesta un poco acostumbrarse, pero realmente le da a Emacs un mecanismo de deshacer / rehacer altamente flexible y poderoso.

Michael Ekstrand
fuente
117
En caso de que esto suene molesto, la principal ventaja es que siempre puede recuperar un estado anterior. En la mayoría de los editores, deshacer varios cambios y luego escribir accidentalmente un personaje lo dejaría 'varado' sin forma de rehacer lo que había deshecho. Emacs hace esto trivial.
phils
3
Supongo que en su construcción, si una persona quisiera hacerlo en papel, necesitaría dos pilas. Porque, por ejemplo, en el punto donde escribió "Ahora, deshace. Deshace la última acción, lo que resulta en lo siguiente lista: "usted (comprensiblemente) no mostró la acción de deshacer, y si él hubiera hecho muchas acciones de deshacer, no las mostraría hasta que se hiciera algo para romper la secuencia de deshacer, entonces las agregaría. Otra forma de mostrarlo sería tener una lista y agregar deshacer a la lista, incluso antes de que se rompan, pero tener en cuenta dónde está el cursor en la lista, para que sepamos desde dónde están trabajando las
deshacer
25
Suena molesto.
Felipe
13
No sé por qué esta respuesta fue aceptada cuando ni siquiera te dice CÓMO .
Aaron Hall
8
Lamentablemente, esta respuesta no dice nada sobre el comando rehacer que es Cg C- /.
vishnuprasanth
211

Deshacer: C-_

Para rehacer después de deshacer: C-g C-_

Escriba varias veces C-_ para rehacer lo que se ha deshecho C-_ Para rehacer un comando de emacs varias veces, ejecute su comando y luego escriba C-xzy luego escriba muchas veces en la ztecla para repetir el comando (interesante cuando desea ejecutar varias veces una macro)

Jérôme Radix
fuente
44
Para repetir cosas, también puede usar C-u, por ejemplo C-u 8 *(inserta ocho * donde está el cursor). Entonces puedes usar C-u x C-_para deshacer x pasos.
Patrick
10
Esto no tiene nada que ver con la pregunta original, pero justo después de ejecutar una macro de teclado (con C-x e), puede presionar etantas veces como sea necesario para ejecutarla nuevamente.
Christian Berg
77
Además, C-/y C-x uson combinaciones de teclas de deshacer alternativas, equivalentes a C-_. Prefiero C-/ya que es más fácil golpear.
Rory O'Kane
8
Advertencia: cuando esta respuesta dice que C-g C-_"rehacerá después de deshacer", eso solo se aplica la primera vez que golpeas la combinación. Después de eso, repita su clave de deshacer sin C-g. Entonces, para rehacer tres veces justo después de deshacer, escriba C-g C-_ C-_ C-_. Si escribe C-g C-_ C-g C-_ C-g C-_, simplemente irá dando vueltas, deshaciendo su rehacer de su deshacer ...
Rory O'Kane
@ RoryO'Kane No sé mucho sobre emacs, así que corrígeme donde estoy equivocado, pero dado que Cg C-_ no tiene ningún efecto después de un rehacer, podría ser porque solo funciona después de un deshacer (como sugiere su descripción "rehacer después de deshacer". Por lo tanto, no es tanto que va en círculos rehacer un deshacer o rehacer, etc., no está haciendo nada porque un deshacer no se acaba de hacer antes. entonces Cg C- _ _ CG-C no va en un círculo después de la primera, que es, literalmente, no hacer nada.
barlop
56
  • Para deshacer una vez:C-/
  • Para deshacer dos veces: C-/ C-/
  • Para rehacer una vez, inmediatamente después de deshacer:C-g C-/
  • Para rehacer dos veces, inmediatamente después de deshacer: C-g C-/ C-/. Tenga en cuenta que C-gno se repite.
  • Para deshacer de nuevo inmediatamente , una vez:C-g C-/
  • Para deshacer de nuevo inmediatamente, dos veces: C-g C-/ C-/
  • Para rehacer de nuevo , lo mismo ...

Si ha presionado alguna tecla (ya sea escribiendo caracteres o simplemente moviendo el cursor) desde su último comando de deshacer, no hay necesidad de escribir C-gantes de su próximo deshacer / rehacer. C-ges solo una tecla segura para golpear que no hace nada por sí misma, sino que cuenta como una tecla de no deshacer para indicar el final de su secuencia de deshacer. Presionando otro comando tal como C-ffuncionaría también; es solo que movería el cursor desde donde lo tenía.

Si golpeas C-gu otro comando cuando no querías hacerlo, y ahora estás deshaciendo en la dirección incorrecta, simplemente golpea C-gpara invertir tu dirección nuevamente. Tendrá que deshacer todo el proceso de rehacer y deshacer accidentalmente antes de llegar a lo que desea deshacer, pero si sigue presionando C-/, eventualmente alcanzará el estado que desea. De hecho, cada estado en el que el buffer ha estado es accesible, si presiona C-guna vez y luego presionaC-/ suficientes veces.

Atajos alternativos para undo, excepto C-/, son C-_, C-x uyM-x undo .

Vea Deshacer en el Manual de Emacs para más detalles sobre el sistema de deshacer de Emacs.

Rory O'Kane
fuente
38

Para aquellos que desean tener la funcionalidad de deshacer / rehacer más común, 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 pasado de un búfer (mientras que el sistema de deshacer / rehacer estándar puede perder estados pasados ​​tan pronto como lo rehace). Sin embargo, este poder tiene un precio: muchas personas encuentran que el sistema de deshacer de Emacs es confuso y difícil de usar, generando una serie de paquetes que lo reemplazan con el sistema de deshacer / rehacer menos potente pero más intuitivo.

Tanto la pérdida de datos con deshacer / rehacer estándar, como la confusión de deshacer de Emacs, se derivan de tratar de tratar el historial de deshacer como una secuencia lineal de cambios. No es. El 'modo de árbol de deshacer' proporcionado por 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 ramificado. Esta idea simple permite que el comportamiento más intuitivo del sistema estándar de deshacer / rehacer se combine con el poder de nunca perder ningún historial. Una ventaja adicional es que el historial de deshacer puede almacenarse en algunos casos de manera más eficiente, permitiendo que se acumulen más cambios antes de que Emacs comience a descartar el historial.

Trey Jackson
fuente
3
¡Fantástico! ¿Quién dijo que emacs deshacer era insondable? :-)
Peter.O
¡Asombroso! Conceptualmente sólido e intuitivo para el usuario. Esto debería estar en los paquetes predeterminados. Un comentario: deseo que también se muestre algún mensaje de alerta al rehacer desde un punto de bifurcación, no solo al volver a él. Por ejemplo, cuando el usuario llama a rehacer: 'Rehacer desde un punto de bifurcación' o 'Bifurcación de rehacer predeterminada utilizada', solo para alertar al usuario de que hay más de una bifurcación.
Basel Shishani
1
Otro enfoque para este problema que es mucho más simple de implementar y no requiere un visualizador es mantener SOLO el último punto de bifurcación y proporcionar 3 comandos: deshacer, rehacer, cambiar de bifurcación. Deshacer / rehacer alertará cuando se golpee THE branch, y switch-branch simplemente cambiará si en una rama más solo emite un mensaje 'no en una rama'. Si se produce una ramificación en cualquier momento, se pierde el punto de ramificación anterior. Esto resolvería el problema de pérdida de estado razonablemente bien y con una complejidad mínima.
Basilea Shishani
1
Tenga en cuenta que esto tiene un error de larga data en rehacer que puede fallar al azar: github.com/syl20bnr/spacemacs/issues/9903 - conocido desde 2014
ideasman42
@ ideasman42 Aparentemente este es un "no error": dr-qubit.org/Lost_undo-tree_history.html
Dalker
19

¡Cuidado con un capricho de deshacer árbol para rehacer !

Muchos populares "kits de inicio" (preludio, purcell, spacemacs) vienen con undo-tree. La mayoría (¿todo?) Incluso lo habilita automáticamente. Como se mencionó, undo-tree es una forma práctica de visualizar y recorrer el árbol de deshacer / rehacer. Preludio incluso le da un acorde clave ( uu), y también C-x u.

El problema es: deshacer-árbol parece destruir por defecto de Emacs y conocido vinculante para rehacer :C-g 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.

Micah Elliott
fuente
Esta. Estoy usando Spacemacs y no pude entender por qué no funcionaba para mí. ¡Gracias!
mghaoui
11

Me resulta redo.elextremadamente útil para hacer / deshacer "normal", y generalmente lo asocio a CSz y deshago a Cz, así:

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

(global-set-key (kbd "C-z") 'undo)

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

monotux
fuente
Los comentarios en el encabezado de redo.el dicen que está hecho para XEmacs. ¿Hay algún problema al usarlo en GNU Emacs y otros Emacsen relacionados?
A. Levy el
Todavía no he tenido ningún problema, y ​​lo he estado usando durante al menos 6 meses :)
monotux
44
De emacswiki.org/emacs/RedoMode : Sin embargo, redo.el está desactualizado y a menudo destruye el contenido de "buffer" porque el comportamiento de 'primitive-undo' ha sido ligeramente diferente del anterior desde Emacs 22. RedoPlus es un tenedor de redo.el y funciona correctamente en la versión más reciente de Emacs. Puede obtener RedoPlus aquí: emacswiki.org/emacs/redo+.el
rofrol
2

Emacs 28 agrega un comando rehacer (llamado undo-redo).

Si desea tener deshacer / rehacer más típico, se pueden usar los siguientes comandos.

(global-set-key (kbd "C-z") 'undo-only)
(global-set-key (kbd "C-S-z") 'undo-redo)
ideasman42
fuente
1

Si desea rehacer la última operación, haga lo siguiente.

  1. ESC
  2. Hacer otro deshacer ( C + /)
vineeshvs
fuente
0

Por defecto, rehacer en Emacs requiere presionar Cg, luego deshacer.

Sin embargo, es posible usar el deshacer incorporado de Emacs para implementar un comando rehacer también.

El paquete undo-fu , utiliza la funcionalidad de deshacer incorporada de Emacs para exponer tanto deshacer como rehacer.

ideasman42
fuente