2012-10-04 17 views
5

Tôi đã nhận thấy rằng trong các phiên chỉnh sửa dài, hãy gọi undo-tree (C-x C-u) trở nên chậm hơn và chậm hơn. Tôi đoán rằng lý do là khi cây phát triển lớn hơn, nó sẽ mất nhiều thời gian hơn để phân tích cú pháp (vì nó theo dõi tất cả các chỉnh sửa của tôi kể từ khi tôi mở tệp)Emacs: Dọn dẹp hoàn tác cây

Có cách nào để xóa cây undos trên một mở tập tin? Tôi đã cố gắng C-x C-v (find-alternate-file), nhưng điều này lại mở tập tin mà resets con trỏ (và trong chế độ như org-mode sụp đổ danh sách của tôi)

Trả lời

6

Thiết lập lại buffer-undo-tree biến sử dụng M-: (setq buffer-undo-tree nil). Điều này loại bỏ toàn bộ lịch sử hoàn tác của bộ đệm, như được ghi lại bởi undo-tree.el.

này cũng có thể được làm thành một lệnh và ràng buộc với một chìa khóa với mã như thế này:

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

Cảm ơn. Bạn có biết sự khác biệt giữa câu trả lời của bạn và của @npostavs không? –

+1

Một sự khác biệt là 'undo-tree-discard-history' cố gắng cắt lược sử theo các biến' undo-limit', 'undo-strong-limit' và' undo-outer-limit', trong khi giải pháp của tôi xóa toàn bộ lịch sử hoàn tác. Quan trọng hơn, 'undo-tree-discard-history' được tự động gọi trên mọi hoạt động undo/redo/switch-branch, vì vậy rõ ràng nó không hoạt động cho bạn. – user4815162342

+0

Cảm ơn! Tôi chỉ chấp nhận câu trả lời của bạn –

1

Bạn có thể tỉa cây thay vì loại bỏ toàn bộ điều:

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

Sự khác nhau giữa việc gọi hàm '(undo-tree-discard-history)' và thiết lập biến '(buffer-undo-tree)' thành 'nil' là gì? (như trong câu trả lời @ user4815162342) –

+1

@ user273158: giảm so với loại bỏ hoàn toàn theo nhận xét của người dùng4815162342. Tôi đã không nhận thấy nó được gọi là tất cả các undo/redo. Có lẽ, bạn có thể hạ thấp các giới hạn để làm cho nó hiệu quả hơn. – npostavs

3

Lưu ý rằng mẹo này có thể đã lỗi thời trong các phiên bản hoàn tác gần đây của cây. Từ phiên bản 0.6 trở đi, undo-tree sử dụng "lazy tree-drawing" theo mặc định. Điều này làm tăng tốc độ hiển thị đáng kể của các cây hoàn tác lớn, bằng cách chỉ vẽ phần có thể nhìn thấy (và mở rộng nó khi cần thiết khi bạn di chuyển quanh cây). Xem chuỗi tài liệu cho biến số undo-tree-visualizer-lazy-drawing để biết thêm chi tiết.

Nếu bạn vẫn muốn hủy toàn bộ cây hoàn tác, hãy đặt buffer-undo-tree thành nil là giải pháp một lần tốt. Giải pháp dài hạn là giảm các giá trị của undo-limit, undo-strong-limitundo-outer-limit để giới hạn kích thước cây hoàn tác, bằng cách giới hạn số tiền mà lịch sử lưu trữ trước khi loại bỏ dữ liệu cũ hơn.

Gọi thủ công undo-tree-discard-history là vô nghĩa. Nó được gọi tự động bất cứ khi nào bạn làm bất cứ điều gì liên quan đến undo.

1

Thỉnh thoảng tôi phải xóa bỏ hoàn tác của bộ đệm vì tôi đã dán một số văn bản chứa các ký tự không thể hiển thị trong mã hóa hiện tại của bộ đệm/tệp. Vì vậy, tôi thấy chức năng của @Amelio Vazquez-Reina rất hữu ích. Tuy nhiên, tôi không muốn chức năng này được gọi một cách ngẫu nhiên, do đó, thêm một dấu nhắc xác nhận và kiểm tra rằng buffer-undo-tree thực sự là biến cục bộ bộ đệm:

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