2009-09-12 32 views
8

Gọi tôi là què, nhưng tôi mệt mỏi vì tiềm thức của tôi C-x C-s co giật thần kinh. Tôi đang chuyển đổi bộ đệm thường đủ và tôi nghĩ rằng tôi muốn lưu một bộ đệm nhất định ngay khi tôi chuyển sang bộ đệm khác. Tôi chưa có thời gian để tìm hiểu cơ bản về Emacs-Lisp.Emacs tự động lưu trên bộ đệm chuyển đổi

Bất kỳ gợi ý nào về cách thực hiện điều này hoặc giải pháp tốt hơn?

(Trên một lưu ý liên quan, tôi thấy một autosave workaround có thể lưu các bộ đệm hiện càng sớm càng tốt là nhàn rỗi trong một khoảng thời gian nhất định.)

Trả lời

16

Mở rộng trên Seth 's answer, tôi muốn làm điều này:

(defadvice switch-to-buffer (before save-buffer-now activate) 
    (when buffer-file-name (save-buffer))) 
(defadvice other-window (before other-window-now activate) 
    (when buffer-file-name (save-buffer))) 
(defadvice other-frame (before other-frame-now activate) 
    (when buffer-file-name (save-buffer))) 

Vui lòng cung cho buffer-file-name tránh tiết kiệm bộ đệm file w/out. Bạn cần phải tìm ra tất cả các điểm vào mà bạn sử dụng để chuyển vùng đệm mà bạn quan tâm (tôi cũng khuyên là other-window).

+0

+1 từ tôi ... quên tệp đệm -name – seth

+1

Hoàn hảo! Cảm ơn :) 6 năm sau và vẫn là một câu trả lời tuyệt vời –

6

tôi là loại mới để Emacs Lisp bản thân mình nhưng điều này làm việc trong thử nghiệm của tôi:

(defadvice switch-to-buffer (before save-buffer-now) 
    (save-buffer)) 

(ad-activate 'switch-to-buffer) 

đó là loại gây phiền nhiễu mặc dù bởi vì nó được gọi là sau mỗi bộ đệm (như xước). Vì vậy, hãy xem xét câu trả lời này một gợi ý.

Khi bạn muốn vô hiệu hóa nó, bạn sẽ cần phải gọi:

(ad-disable-advice 'switch-to-buffer 'before 'save-buffer-now) 
(ad-activate 'switch-to-buffer) 
2

Một vài ý tưởng.

Trước tiên, nếu bạn thấy mình gọi một lệnh như lưu với tần suất đủ cao, bạn có thể xem xét ràng buộc khóa ngắn hơn cho lệnh. Ví dụ, tôi cũng thấy mình có cùng một "co giật", vì vậy bây giờ tôi sử dụng f2 thay vì C-x C-s để lưu chỉnh sửa.

Chức năng mà tôi liên kết với f2 lưu mọi bộ đệm chưa lưu một cách vô điều kiện. Bạn có thể thấy hữu ích:

(defun force-save-all() 
    "Unconditionally saves all unsaved buffers." 
    (interactive) 
    (save-some-buffers t)) 

(global-set-key [f2] 'force-save-all) 

Hiện tại, về vấn đề chính. Bạn có thể thử một cái gì đó như thế này (chú ý rằng force-save-all được gọi):

(defun my-switch-to-buffer (buffer) 
    (interactive (list (read-buffer "Switch to buffer: " (cadr buffer-name-history) nil))) 
    (force-save-all) 
    (switch-to-buffer buffer)) 

(global-set-key "\C-xb" 'my-switch-to-buffer) 

Tất nhiên, bạn cũng có thể liên kết các chức năng chuyển đổi đệm phím khác, giống như một phím chức năng, do đó nó là một hoạt động một thao tác bấm.

Tôi nghĩ rằng @seth có ý tưởng tuyệt vời về cách sử dụng lời khuyên, nhưng tôi nhận thấy rằng hướng dẫn sử dụng ELisp gợi ý rằng advice not be used for key bindings. Tôi không hoàn toàn chắc chắn tại sao đây là trường hợp, nhưng đó là những gì hướng dẫn cho thấy FYI.

+0

Thú vị. Không thấy phần đó về keybindings khi tôi đọc hướng dẫn. Cảm ơn. – seth

+0

Vấn đề duy nhất với giải pháp này là khi bạn, ví dụ: bắt đầu sử dụng 'ido-switch-buffer', bạn cũng phải theo dõi các thay đổi trong hàm của mình. –

+0

Đó là sự thật, tôi cho rằng bạn có thể rebind biểu tượng chuyển đổi sang bộ đệm cho hàm mới này (lưu bản gốc trong một biểu tượng khác, ví dụ: orig-save-to-buffer) –

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