Làm cách nào để tôi có thể tự động đóng bộ đệm khi tệp bên dưới bị xóa?


9

Tôi để Emacs chạy cả ngày và thường sẽ thực hiện nhiều thao tác hệ thống tệp trên các tệp được mở trong bộ đệm Emacs. Ví dụ: tôi có thể chuyển sang một nhánh khác trong Git có cấu trúc thư mục rất khác.

Thật không may, điều này cho tôi một loạt các bộ đệm mở mà Emacs hiện đăng ký là bộ đệm "đã sửa đổi" đề cập đến các tệp "mới". Trừ khi tôi cẩn thận đóng chúng theo cách thủ công mỗi khi tôi làm điều này, thật dễ dàng để phản xạ lưu những bộ đệm đó dẫn đến các tệp giả, có thể trùng lặp trong dự án của tôi. Tôi thậm chí không thể đóng emacs mà không trả lời câu hỏi "lưu bộ đệm này" cho mỗi người.

Có cách nào để tự động đóng bộ đệm chưa sửa đổi khi tệp bên dưới biến mất không? Tương tự về mặt tinh thần global-auto-revert-modecũng xử lý khi một tập tin bị xóa hoàn toàn?


Kiểm tra phần hướng dẫn sử dụng Emacs 38.20 Thông báo về thay đổi tệp
izkon

Câu trả lời:


6

Tôi nghĩ rằng một cái gì đó dọc theo những dòng này có thể làm việc:

(defun buffer-backed-by-file-p (buffer)
  (let ((backing-file (buffer-file-name buffer)))
    (if (buffer-modified-p buffer)
        t
      (if backing-file
          (file-exists-p (buffer-file-name buffer))
        t))))

(mapc 'kill-buffer (-remove 'buffer-backed-by-file-p (buffer-list)))

Các buffer-backed-by-file-pkiểm tra chức năng nếu tập tin được hỗ trợ bởi một tập tin - nếu không, trả về true, nếu không lợi nhuận nếu các tập tin sao lưu tồn tại. Sau đó, chúng tôi lấy danh sách các bộ đệm, lọc ra bất cứ thứ gì ngoại trừ những bộ đệm nên có tệp sao lưu, nhưng tệp không tồn tại và sau đó giết chúng.

Yêu cầu dash.el cho -remove, vì tôi quá lười biếng để tìm một tích hợp để đạt được điều tương tự.

Hi vọng điêu nay co ich!


Tuy nhiên, bạn vẫn phải chạy mapclệnh đó bất cứ khi nào bạn muốn xóa các bộ đệm không được hỗ trợ bởi các tập tin, phải không? Vì vậy, nó không hoàn toàn tự động. Để tự động hóa hoàn toàn, bạn phải đảm bảo rằng nó tự mapcchạy liên tục hoặc sử dụng một cái gì đó giống như inotifyđể chạy nó cho bạn khi một tệp thực sự bị xóa.
izkon

Có, người ta sẽ cần phải chạy định kỳ này hoặc để đáp ứng với các sự kiện inotify hoặc tương tự. Chính tôi, tôi chỉ chạy nó định kỳ, mỗi phút hoặc lâu hơn. Không hoàn hảo, nhưng đủ tốt cho hầu hết các trường hợp. (run-with-timer 60 60 (lambda () (mapc 'kill-buffer (-remove 'buffer-backed-by-file-p (buffer-list)))))là những gì tôi sẽ sử dụng như một xấp xỉ đầu tiên.
algernon

1
Thực hiện điều này, và nó đã làm việc tuyệt vời. Tôi đã sử dụng hàm bao bọc nhỏ này để gọi nó, trong trường hợp bất kỳ ai cũng cần một cái gì đó tương tự: `(defun kill-remove-buffers () (tương tác) (let ((to-kill (-remove 'buffer-back-by-file-p (danh sách bộ đệm)))) (mapc 'kill-buffer to-kill) (thông báo "Kills% s buffers" (length to-kill)))) Xin lỗi tôi không thể định dạng chính xác trong hộp bình luận .
levand
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.