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
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.
extender
'undo
de entender una nueva entrada en la lista de deshacer, un marcadormacro-begin
y un elementomacro-end
consejo/cambiar la reproducción de macro para insertar los marcadores al comienzo/final de la reproducción macro
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 seredo
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
ymacro-end
en la lista de deshacer.
Huelga decir que este es un esfuerzo complicado. Te deseo suerte.
- 1. ¿Cómo deshacer el párrafo de relleno en emacs?
- 2. Emacs: Limpiar el árbol de deshacer
- 3. ¿Hay alguna manera de deshacer ventana dividida debajo en emacs?
- 4. Cómo deshacer '&' en Jade
- 5. ¿Cómo cambiar el nivel de granularidad de deshacer en emacs evil-mode con undo-tree?
- 6. ¿Cómo creo "deshacer" en C++?
- 7. Cómo deshacer event.stopPropagation en jQuery?
- 8. Deshacer
- 9. Cómo deshacer bzr add
- 10. Cómo deshacer `hg pull`?
- 11. cómo deshacer commit
- 12. ¿Cómo funciona Deshacer?
- 13. Deshacer en Vinculaciones WPF
- 14. ¿Cómo se puede deshacer "surroundContents" en javascript?
- 15. ¿Cómo puedo deshacer un objeto en Perl?
- 16. ¿Cómo puedo deshacer "Resolver" en TortoiseGit?
- 17. ¿Cómo puedo deshacer una sesión en ScalaQuery?
- 18. Cómo deshacer la cadena Unicode en C#
- 19. ¿Cómo obtengo deshacer fino en Vim?
- 20. Cómo: deshacer la variable en C#?
- 21. Git: Cómo "deshacer" una fusión
- 22. Cómo deshacer un Git rollback
- 23. TortoiseSVN - Cómo deshacer una reversión
- 24. Deshacer en Subversion
- 25. Deshacer eliminar en GIT
- 26. Deshacer/Rehacer en WPF?
- 27. ¿Cómo deshacer git update-index?
- 28. Cómo deshacer la actualización RequestFactory
- 29. JAXB: ¿cómo deshacer este XML?
- 30. Deshacer una confirmación en TortoiseSVN
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. –
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' . –