Làm cách nào để tự động lưu bộ đệm khi Emacs mất tập trung?


26

Gần đây tôi đã có một người dùng Sublime Text dùng thử Emacs một thời gian và anh ta quan tâm đến việc có hành vi tự động lưu tương tự trong Emacs.

Về cơ bản, anh ta muốn tất cả các bộ đệm được lưu bất cứ khi nào khung bị mất tiêu điểm (thực sự được lưu, không chỉ sao lưu). Điều này bao gồm khi chuyển các cửa sổ sang một ứng dụng hoàn toàn khác.

Tôi không thể tìm thấy bất kỳ sự kiện nào được kích hoạt khi chuyển sang một ứng dụng khác. Có một sự kiện như vậy hoặc có một cách khác để đạt được hành vi tương tự?

Lưu ý rằng giải pháp dựa trên thời gian là không thỏa đáng và cũng không phải là hành vi sao lưu tự động mặc định. Ông đặc biệt muốn các bộ đệm được lưu (như trong save-buffer) cho tất cả các tệp.

Câu trả lời:


29

Thật không may, hành vi chính xác này không thể thực hiện được trong Emacs <= 24.3, nhưng bạn có thể lưu thay đổi cửa sổ / bộ đệm bằng cách sử dụng defadvice(như chi tiết trên blog của bbatsov ):

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

Trong Emacs 24.4, bạn cũng sẽ có thể lưu vào mất tiêu điểm khung hình nhờ các móc lấy nét mới : (add-hook 'focus-out-hook 'save-buffer)(để lưu bộ đệm hoạt động) hoặc (add-hook 'focus-out-hook (lambda () (save-some-buffers t)))(để lưu tất cả các bộ đệm đang mở).


1
Bạn có thể mở rộng một chút về defadvicephiên bản, trong trường hợp bài viết trên blog bị hỏng hoặc một cái gì đó? Cảm ơn!
Tikhon Jelvis

Thật không may, giải pháp đó về lưu bộ đệm hiện có thể nhìn thấy, không phải tất cả các bộ đệm.
b4hand

1
@ b4hand: Xin lỗi, không nhận ra đó là những gì bạn muốn. Trả lời cập nhật.
shosti

1
@shosti Nhân tiện, cảm ơn vì đã tìm thấy liên kết đó đến blog của bbatsov cho tôi. Tôi thực sự đã tìm thấy giải pháp đó trước đây, nhưng không thể tìm lại được. Tôi sẽ đưa nó vào như một trong những giải pháp không hoạt động trong câu hỏi của tôi.
b4hand

2
Tôi thích làm theo cách này để tránh làm hỏng bộ thu nhỏ (bỏ qua định dạng): (add-hook 'focus-out-hook (lambda () (flet ((message (format &rest args) nil)) (save-some-buffers t))))
Andreas

6

focus-autosave-modengay bây giờ. Nó có sẵn thông qua MELPA. Tại sao không cho nó cơ hội để hack cho bạn‽


Xin chào, nó hoạt động thế nào? Tôi đã cài đặt nó nhưng nó dường như không hoạt động.
Asme chỉ cần

@AsmeJust, tôi không sử dụng ngay bây giờ, hãy thử hỏi về trình theo dõi vấn đề của nó tại đây: github.com/vifon/f
Mark Karpov

Bạn hiện đang sử dụng một thay thế hoặc đôi khi như thế?
Asme chỉ cần

Không, tôi không sử dụng bất cứ thứ gì như vậy ngay bây giờ.
Mark Karpov

Nhưng bạn vẫn sử dụng Emacs, phải không?
Asme chỉ cần

3
(add-to-list 'focus-out-hook (lambda () (save-some-buffers t nil)))

Điều này sẽ lưu tất cả các bộ đệm chưa được lưu vào tệp, trên emacs 24.4


2
Đừng sử dụng add-to-listtrên móc, sử dụng add-hook. Câu trả lời của shosti đã chứa hình thức chính xác của đoạn trích này.
Gilles 'SO- ngừng trở nên xấu xa'

1

Đối với những người lang thang vấp phải điều này, tôi sử dụng mẫu này:

(eval-when-compile (require 'cl-lib))
;; [...]
(add-hook 'focus-out-hook
  (lambda ()
    (cl-letf (((symbol-function 'message) #'format))
      (save-some-buffers t))))

Việc sử dụng cl-letfgiữ cho các (No files need saving)thông điệp gây phiền nhiễu không làm tắc nghẽn khu vực tiếng vang của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.