Hủy bỏ bộ đệm khi khung hình bị xóa


12

Khi tôi đóng một khung, tôi muốn bộ đệm của nó bị giết.

Nếu bộ đệm được hiển thị trong các khung khác, bộ đệm sẽ không bị giết.

Không làm gì nếu có nhiều hơn một bộ đệm được hiển thị trong một khung.

Cách tốt để thiết lập điều này là gì?


Tất cả các câu trả lời không làm việc riêng cho tôi. Tuy nhiên nếu tôi giữ cả ba người trong số họ, nó thực sự hoạt động.
phonycollectibles

Câu trả lời:


11

Nếu tôi đã hiểu câu hỏi, đây là một chức năng thực hiện những gì bạn muốn:

(defun maybe-delete-frame-buffer (frame)
  "When a dedicated FRAME is deleted, also kill its buffer.
A dedicated frame contains a single window whose buffer is not
displayed anywhere else."
  (let ((windows (window-list frame)))
    (when (eq 1 (length windows))
      (let ((buffer (window-buffer (car windows))))
        (when (eq 1 (length (get-buffer-window-list buffer nil t)))
          (kill-buffer buffer))))))

Bạn có thể thêm nó dưới dạng một cái móc được gọi bất cứ khi nào khung được đóng bằng:

(add-to-list 'delete-frame-functions #'maybe-delete-frame-buffer)

5

Dưới đây là một chức năng (đã được thử nghiệm, nhưng không mở rộng) đáp ứng yêu cầu đầu tiên của bạn: nó sẽ giết bộ đệm hiện tại khi bạn đóng khung KHÔNG GIỚI HẠN bộ đệm cũng hiển thị trong một khung khác.

(defun kill-buffer-when-frame-delete-dwim (frame)
  "Kill current buffer unless it's visible in another frame
besides current FRAME."
  (unless (delq nil (mapcar #'(lambda (x)
                                (memq (current-buffer)
                                      (mapcar #'window-buffer x)))
                            (mapcar #'window-list
                                    (delq frame (frame-list)))))
    (kill-buffer (current-buffer))))

(add-hook 'delete-frame-functions 'kill-buffer-when-frame-delete-dwim)

Tôi không rõ ràng về yêu cầu thứ hai:

  • Bởi nhiều hơn một bộ đệm được hiển thị trong khung , bạn có nghĩa là khung có a) hai hoặc nhiều cửa sổ b) các cửa sổ có bộ đệm khác nhau được hiển thị trong chúng?
  • Không làm gì cả , ý bạn là a) xóa khung nhưng không giết được bộ đệm hiện tại, hoặc b) thực sự không làm gì cả: không xóa khung hoặc giết bộ đệm hiện tại?

Chào Dân. Ý tưởng là nếu nhiều hơn một bộ đệm được hiển thị trong một khung, thông qua nhiều cửa sổ trong khung đó, thì sẽ không có bộ đệm nào bị giết, nhưng khung vẫn sẽ bị xóa.
dharmatech

Nhưng tôi có thể thấy các hành vi khác là hữu ích. Tức là giết tất cả các bộ đệm được hiển thị, miễn là chúng không được hiển thị trong các khung khác.
dharmatech

1

Đây là một cách tiếp cận đơn giản:

(defun close-frame-buffer (frame)
  (kill-buffer
    (window-buffer
      (frame-root-window frame))))

(add-hook 'delete-frame-functions 'close-frame-buffer)

Nó sẽ giết một bộ đệm ngay cả khi nó mở trong một khung khác.

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.