2012-10-04 25 views
5

He notado que en sesiones de edición prolongadas, llamar al undo-tree (C-x C-u) es cada vez más lento. Supongo que la razón es que a medida que el árbol crece, tarda más en analizarlo (ya que realiza un seguimiento de todas mis ediciones desde que abrí el archivo)Emacs: Limpiar el árbol de deshacer

¿Hay alguna forma de borrar el árbol de deshacer en un ¿abrir documento? He tratado C-x C-v (find-alternate-file), pero esto se vuelve a abrir el archivo que restablece el cursor (y en los modos como org-mode colapsa mis listas)

Respuesta

6

restablezca la variable buffer-undo-tree usando M-: (setq buffer-undo-tree nil). Esto descarta todo el historial de deshacer del buffer, según lo registrado por undo-tree.el.

Esto también se puede convertir en un comando y atado a una llave con código como este:

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

Gracias. ¿Sabes cuál es la diferencia entre tu respuesta y la de @npostavs? –

+1

Una diferencia es que 'undo-tree-discard-history' intenta podar la historia de acuerdo con las variables' undo-limit', 'undo-strong-limit', y' undo-outer-limit', mientras que mi solución elimina la todo el historial de deshacer. Más importante aún, 'undo-tree-discard-history' se invoca automáticamente en cada operación de deshacer/rehacer/cambiar de rama, por lo que obviamente no funciona para usted. – user4815162342

+0

¡Gracias! Iba a aceptar tu respuesta –

1

Usted puede podar el árbol en lugar de desechar todo el asunto:

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

¿Cuál es la diferencia entre llamar a la función '(deshacer-árbol-descartar-historial)' y establecer la variable '(buffer-undo-tree)' a 'nil'? (como en @ user4815162342 respuesta) –

+1

@ user273158: reducir vs eliminar por completo según el comentario user4815162342. No me había dado cuenta de que se llamaba cada deshacer/rehacer. Presumiblemente, podría reducir los límites para hacerlo más efectivo. – npostavs

3

Tenga en cuenta que este consejo puede estar obsoleto en las últimas versiones de deshacer árbol. A partir de la versión 0.6, Undo-Tree usa "draw-arbol perezoso" de forma predeterminada. Esto acelera significativamente la visualización de grandes árboles de deshacer, dibujando solo la parte visible (y extendiéndola según sea necesario a medida que se mueve alrededor del árbol). Consulte la docstring para la variable undo-tree-visualizer-lazy-drawing para obtener más detalles.

Si, no obstante, desea descartar todo el árbol de deshacer, establecer manualmente buffer-undo-tree en nil es una buena solución única. Una solución a largo plazo es reducir los valores de undo-limit, undo-strong-limit y undo-outer-limit para limitar el tamaño del árbol de deshacer, limitando la cantidad de historial de deshacer que almacena antes de descartar datos anteriores.

Llamar manualmente undo-tree-discard-history no tiene sentido. Se llama automáticamente cada vez que haces algo relacionado con deshacer.

1

Ocasionalmente tengo que purgar el árbol de deshacer de un búfer porque pegué texto que contenía caracteres que no se pueden mostrar en la codificación actual del búfer/archivo. Así que encontré la función de @Amelio Vázquez-Reina muy útil. Sin embargo, no quiero que la función a ser llamada por accidente, por lo que un agregó un mensaje de confirmación y un cheque que buffer-undo-tree realmente es una variable local búfer:

(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))))) 
Cuestiones relacionadas