2012-10-04 11 views
5

Ich habe festgestellt, dass in langen Bearbeitungssitzungen Aufruf undo-tree (C-x C-u) wird immer langsamer. Ich nehme an, dass der Grund dafür ist, dass es länger dauert, den Baum zu analysieren, wenn der Baum größer wird (da er alle meine Bearbeitungen verfolgt, seit ich die Datei geöffnet habe)Emacs: Bereinigen rückgängig machen-Baum

Gibt es eine Möglichkeit, den Baum von Undos auf einem aufzuräumen Datei öffnen? Ich habe C-x C-v (find-alternate-file) versucht, aber diese wieder öffnet die Datei, die den Cursor zurücksetzt (und in Modi wie org-mode kollabiert meine Listen)

Antwort

6

Zurücksetzen der buffer-undo-tree Variable M-: (setq buffer-undo-tree nil). Dies verwirft die gesamte Undo-Geschichte des Puffers, wie sie von undo-tree.el aufgezeichnet wird.

(defun clear-undo-tree() 
    (interactive) 
    (setq buffer-undo-tree nil)) 
(global-set-key [(control c) u] 'clear-undo-tree) 
+0

Dank. Weißt du, was der Unterschied zwischen deiner Antwort und der von @npostavs ist? –

+1

Ein Unterschied ist, dass 'undo-tree-discard-history' versucht, den Verlauf nach den Variablen' undo-limit', 'undo-outer-limit' zu löschen, während meine Lösung den ganze Geschichte rückgängig machen. Noch wichtiger ist, dass 'Undo-Tree-Discard-History' automatisch bei jedem Undo/Redo/Switch-Branch-Vorgang aufgerufen wird, also funktioniert es offensichtlich nicht für Sie. – user4815162342

+0

Danke! Ich akzeptiere einfach deine Antwort –

1

Sie können den Baum anstatt die ganze Sache des Verwerfens beschneiden:

Dies kann auch in einen Befehl und gebunden an einen Schlüssel mit Code wie folgt vorgenommen werden

undo-tree-discard-history is a compiled Lisp function in 
`undo-tree.el'. 

(undo-tree-discard-history) 

Discard undo history until we're within memory usage limits 
set by `undo-limit', `undo-strong-limit' and `undo-outer-limit'. 
+0

Was ist der Unterschied zwischen dem Aufruf der Funktion '(undo-tree-discard-history)' und dem Setzen der Variable '(buffer-undo-tree)' auf 'nil'? (wie in @ user4815162342 antwort) –

+1

@ user273158: reduzieren vs vollständig nach user4815162342 Kommentar zu entfernen. Ich hatte nicht bemerkt, dass es jedes Undo/Redo genannt wurde. Vermutlich könnten Sie die Limits senken, um sie effektiver zu machen. – npostavs

3

Beachten Sie, dass Dieser Tipp ist möglicherweise in den letzten Undo-Tree-Versionen veraltet. Ab Version 0.6 verwendet Rückgängig-Baum standardmäßig "träge Baumzeichnung". Dies beschleunigt die Visualisierung von großen Rückgängig-Bäumen erheblich, indem nur der sichtbare Teil gezeichnet wird (und wenn nötig, wenn Sie sich um den Baum herum bewegen). Weitere Informationen finden Sie im Docstring für die Variable undo-tree-visualizer-lazy-drawing.

Wenn Sie dennoch den gesamten Undo-Baum verwerfen möchten, ist die manuelle Einstellung buffer-undo-tree auf nil eine gute einmalige Lösung. Eine längerfristige Lösung besteht darin, die Werte undo-limit, undo-strong-limit und undo-outer-limit zu reduzieren, um die Größe des Undo-Baums zu begrenzen, indem der Umfang des Rückgängigmachens des Verlaufs begrenzt wird, der gespeichert wird, bevor ältere Daten verworfen werden.

Manuell aufrufen undo-tree-discard-history ist sinnlos. Es wird automatisch aufgerufen, wenn Sie etwas rückgängig machen.

1

Gelegentlich muss ich den Undo-Baum eines Puffers leeren, weil ich Text eingefügt habe, der Zeichen enthält, die nicht in der aktuellen Kodierung des Puffers/der Datei angezeigt werden können. Daher fand ich die Funktion von @Amelio Vazquez-Reina sehr hilfreich. Aber ich will nicht die Funktion zufällig aufgerufen werden, so dass ein eine Sicherheitsabfrage und eine Überprüfung hinzugefügt, dass buffer-undo-tree wirklich ist ein Puffer lokaler Variable:

(defun clean-undo-tree() 
"Clear current buffer's undo-tree. 
Undo-tree can cause problems with file encoding when characters 
are inserted that cannot be represented using the files current 
encoding. This is even the case when characters are only 
temporarily inserted, e.g. pasted from another source and then 
instantly deleted. In these situations it can be necessary to 
clear the buffers undo-tree before saving the file." 
    (interactive) 
    (let ((buff (current-buffer))) 
    (if (local-variable-p 'buffer-undo-tree) 
     (if (y-or-n-p "Clear buffer-undo-tree? ") 
      (progn 
       (setq buffer-undo-tree nil) 
       (message "Cleared undo-tree of buffer: %s" (buffer-name buff))) 
      (message "Cancelled clearing undo-tree of buffer: %s" (buffer-name buff))) 
     (error "Buffer %s has no local binding of `buffer-undo-tree'" (buffer-name buff)))))