2010-10-27 5 views
6

En emacs, a veces invoco call-last-kbd-macro por error. Al deshacer, habría esperado deshacer el efecto completo de la macro del teclado de forma atómica, pero eso no sucede. En cambio, me veo obligado a deshacer cada paso de la macro uno a la vez. ¿Cómo puedo hacer que emacs regrese al estado del buffer antes de la ejecución de la macro?Cómo deshacer call-last-kbd-macro en emacs

Respuesta

2

Me temo que no se puede hacer eso solo con el mecanismo incorporado 'undo. El macro sistema en Emacs en realidad reproduce las cosas como si el usuario estuviese realmente escribiendo las teclas (o los eventos del mouse), y así el undo history (buffer-undo-list) se actualiza como es normal.

Aquí hay una sugerencia de cómo extender el mecanismo actual undo para hacer lo que desee.

  1. extender 'undo de entender una nueva entrada en la lista de deshacer, un marcador macro-begin y un elemento macro-end

  2. consejo/cambiar la reproducción de macro para insertar los marcadores al comienzo/final de la reproducción macro

  3. tienen el placer undo código de deshacer todos los eventos entre los dos marcadores como una unidad y deshacer a todos ellos (y añadir los marcadores apropiados en el extremo de la historia de deshacer lo que cuando se redo cosas, siguen siendo tratado como un solo bloque)

Advertencias:

  • Esto sólo funcionaría para macros que operan en una única memoria intermedia, si su macro conmutación de buffers (o tenía efectos secundarios en otros tampones), aquellos los cambios no se tratarán como un bloque.
  • Si su macro finalizó en un búfer diferente de lo que comenzó, entonces tendría que manejarlo limpiamente; no desea los marcadores "desequilibrados" macro-begin y macro-end en la lista de deshacer.

Huelga decir que este es un esfuerzo complicado. Te deseo suerte.

+1

Gracias Trey. De hecho, una respuesta compleja. Una solución más simple pero más hackish en el mismo espíritu sería hacer que call-last-kbd-macro (o un contenedor) inserte algún tipo de marcador no operativo en la lista de deshacer. Y luego crea una nueva función clear-to-macro-marker que desharía todos los cambios hasta que se golpeara el marcador. –

+2

A lo largo de esas líneas está http://www.panix.com/~harley/elisp/undo-group.el que agrega un marcador, es decir, dos 'nil's que luego utiliza como límite para un comando' deshacer-grupo' . –