2011-02-07 29 views
7

Làm thế nào tôi có thể làm cho Emac giữ lại lịch sử hoàn tác cho bộ đệm của tôi sau khi hoàn nguyên bộ đệm hoặc sử dụng chế độ tự động hoàn nguyên?Có cách nào để giữ lại danh sách hoàn tác trong Emacs sau khi hoàn nguyên bộ đệm từ tệp không?

Trong Vim, nếu một tệp đang mở trong bộ đệm được thay đổi trên đĩa, Vim nhắc tôi tải lại tệp. Sau đó tôi có thể chỉ cần nhấp vào 'u' để hoàn tác việc tải lại nếu tôi muốn và thậm chí quay lại xa hơn nữa. Emacs dường như để thùng rác tất cả các thông tin hoàn tác thời điểm tôi trở lại bộ đệm.

Trả lời

2

Tôi đoán phương pháp hiển nhiên sẽ là một chức năng mà giết chết nội dung đệm hiện nay, và sau đó gọi insert-file để đọc nội dung hiện tại từ tệp.

Nếu thay đổi đối với tệp bao gồm các thay đổi đối với mã hóa ký tự, có thể có sự cố? Tôi chưa thử nghiệm điều đó.

Đây là nỗ lực hiện tại của tôi. Đó là một chút IMO lông, nhưng nó hoạt động được.

;; Allow buffer reverts to be undone 
(defun my-revert-buffer (&optional ignore-auto noconfirm preserve-modes) 
    "Revert buffer from file in an undo-able manner." 
    (interactive) 
    (when (buffer-file-name) 
    ;; Based upon `delphi-save-state': 
    ;; Ensure that any buffer modifications do not have any side 
    ;; effects beyond the actual content changes. 
    (let ((buffer-read-only nil) 
      (inhibit-read-only t) 
      (before-change-functions nil) 
      (after-change-functions nil)) 
     (unwind-protect 
      (progn 
      ;; Prevent triggering `ask-user-about-supersession-threat' 
      (set-visited-file-modtime) 
      ;; Kill buffer contents and insert from associated file. 
      (widen) 
      (kill-region (point-min) (point-max)) 
      (insert-file-contents (buffer-file-name)) 
      ;; Mark buffer as unmodified. 
      (set-buffer-modified-p nil)))))) 

(defadvice ask-user-about-supersession-threat 
    (around my-supersession-revert-buffer) 
    "Use my-revert-buffer in place of revert-buffer." 
    (let ((real-revert-buffer (symbol-function 'revert-buffer))) 
    (fset 'revert-buffer 'my-revert-buffer) 
    ;; Note that `ask-user-about-supersession-threat' calls 
    ;; (signal 'file-supersession ...), so we need to handle 
    ;; the error in order to restore revert-buffer. 
    (unwind-protect 
     ad-do-it 
     (fset 'revert-buffer real-revert-buffer)))) 

(ad-activate 'ask-user-about-supersession-threat) 

Khó chịu, tôi chỉ mới nhận thấy tất cả các thông tin liên quan-tìm kiếm trong revert-buffer tài liệu, do đó có thể là một nhiều cách đơn giản hơn để làm điều này.

Nếu giá trị revert-buffer-function không phải là không, nó được gọi là làm tất cả công việc cho lệnh này. Nếu không, các móc before-revert-hookafter-revert-hook được chạy ở đầu và kết thúc, và nếu revert-buffer-insert-file-contents-function là không phải là nil, nó được gọi thay vì đọc lại nội dung tệp đã truy cập.

+0

Tôi nghĩ đây là một cách tiếp cận rất tốt. Tôi sẽ có một tinh chỉnh mà bản thân mình. Cảm ơn! – Sarah

+0

Bạn được chào đón. Tôi đã tìm ra giải pháp cho một số vấn đề với mã đó, và đã cập nhật câu trả lời: nó bây giờ thiết lập bộ đệm cập nhật là chưa sửa đổi, và tôi thấy rằng '(set-visited-file-modtime)' là cách để ngăn chặn nó khỏi vấn đề. Điều này có nghĩa là nếu bạn hoàn tác việc hoàn nguyên, nó sẽ không còn hỏi bạn câu hỏi nữa nếu bạn cố chỉnh sửa lại tệp, điều này chắc chắn sẽ phù hợp hơn với chức năng ban đầu. Nếu bạn đưa ra giải pháp cải tiến, vui lòng đăng câu trả lời mới tại đây. – phils

3

Bạn có thể sử dụng trước-móc để lưu đệm-nội dung trước đó để giết-ring:

(add-hook 'before-revert-hook (lambda() (kill-ring-save (point-min) (point-max)))) 
8

Emacs cho phép bạn đặt chức năng đệm-bộ đệm để ghi đè hành vi. Đây là một triển khai thực hiện lại bộ đệm lưu giữ lịch sử.

;; emacs doesn't actually save undo history with revert-buffer 
;; see http://lists.gnu.org/archive/html/bug-gnu-emacs/2011-04/msg00151.html 
;; fix that. 
(defun revert-buffer-keep-history (&optional IGNORE-AUTO NOCONFIRM PRESERVE-MODES) 
    (interactive) 

    ;; tell Emacs the modtime is fine, so we can edit the buffer 
    (clear-visited-file-modtime) 

    ;; insert the current contents of the file on disk 
    (widen) 
    (delete-region (point-min) (point-max)) 
    (insert-file-contents (buffer-file-name)) 

    ;; mark the buffer as not modified 
    (not-modified) 
    (set-visited-file-modtime)) 

(setq revert-buffer-function 'revert-buffer-keep-history) 
+0

Sẽ rất tuyệt nếu vị trí điểm được giữ nguyên;) –

3

Emacs-24.4 sắp tới làm những gì bạn muốn theo mặc định.

Các vấn đề liên quan