In emacs, a volte invoco per errore call-last-kbd-macro. In caso di annullamento mi sarei aspettato l'annullamento per annullare l'intero effetto della macro della tastiera atomicamente, ma ciò non accade. Invece mi ritrovo a dover annullare ogni passaggio di una macro alla volta. Come posso ottenere emacs per tornare allo stato del buffer prima dell'esecuzione della macro?Come annullare call-last-kbd-macro in emacs
risposta
Ho paura di non poterlo fare solo con il meccanismo integrato 'undo
. Il sistema macro in Emacs riproduce effettivamente le cose come se l'utente stesse effettivamente digitando le sequenze di tasti (o gli eventi del mouse), e così undo history (buffer-undo-list
) viene aggiornato normalmente.
Ecco un suggerimento su come estendere l'attuale meccanismo undo
per fare quello che vuoi.
estendere
'undo
per capire una nuova voce nella lista di undo, un marcatoremacro-begin
e un elementomacro-end
consiglio/modificare la riproduzione macro per inserire i marcatori all'inizio/fine della riproduzione macro
hanno la
undo
codice di trattare tutte annullare eventi tra i due marcatori come unità e li annulla (e aggiungere i marcatori appropriati sulla fine della storia undo quindi, quando siredo
le cose, sono ancora trattata come un unico blocco)
Caveats:
- Ciò funziona solo per le macro che operano in un singolo buffer, se la macro buffer commutata (o ha avuto effetti collaterali in altri buffer), quelli le modifiche non sarebbero trattate come un blocco.
- Se la tua macro è finita in un buffer diverso da quello in cui è stata avviata, dovresti gestirla in modo pulito - non vuoi che i marcatori "squilibrati" e
macro-end
siano presenti nell'elenco di annullamento.
Inutile dire che si tratta di uno sforzo complicato. Ti auguro buona fortuna.
- 1. Come annullare il paragrafo di riempimento in emacs?
- 2. C'è un modo per annullare split-window-below in emacs?
- 3. Come annullare/annullare attività TPL?
- 4. Come annullare in Prolog
- 5. Come annullare bzr add
- 6. Come annullare Alamofire.upload
- 7. Come posso annullare Task.WhenAll?
- 8. Come annullare "hg qnew"?
- 9. Come annullare hg init?
- 10. "Annullare elimina" in webapplication?
- 11. come annullare commit
- 12. Come annullare `hg pull`?
- 13. Come annullare l'ultima impegnarsi
- 14. Come annullare l'aggiornamento RequestFactory
- 15. C'è un modo per annullare la definizione di una funzione in emacs lisp?
- 16. Come posso annullare un puntatore in Vai?
- 17. Come posso annullare più commit in Mercurial?
- 18. Come annullare popState in determinate condizioni
- 19. Come annullare> 1 in Squeak
- 20. Come annullare l'ultimo commit in git
- 21. Come abilito annullare in eclipse ant editor?
- 22. Come annullare l'evento CellEnter/CellLeave in C#?
- 23. Come annullare fino all'ultimo scrivere in vim?
- 24. Come annullare l'evidenziazione della ricerca in Eclipse
- 25. Come annullare la visualizzazione divisa in VS2013?
- 26. come annullare i cookie in PHP?
- 27. Come annullare soft delete in Sequelize.js
- 28. Come annullare un'esecuzione di query in phpmyadmin
- 29. Come annullare una richiesta in BeforeSendRequest
- 30. Come annullare/ignorare un'azione in redusso
Grazie Trey. In effetti una risposta complessa. Una soluzione più semplice ma più hacker nello stesso spirito sarebbe quella di rendere call-last-kbd-macro (o un wrapper) inserire un qualche tipo di marcatore no-op nella lista di annullamenti. E quindi creare una nuova funzione clear-to-macro-marker che annullerebbe tutte le modifiche fino a quando il marker non è stato colpito. –
Lungo queste linee è http://www.panix.com/~harley/elisp/undo-group.el che aggiunge un marker cioè due 'nil's che poi usa come limite per un comando' undo-group' . –