Kill bufora po usunięciu ramki

12

Kiedy zamykam ramkę, chciałbym, aby bufor został zabity.

Jeśli bufor jest wyświetlany w innych ramkach, bufor nie powinien zostać zabity.

Nie rób nic, jeśli w ramce jest wyświetlany więcej niż jeden bufor.

Jaki jest dobry sposób na skonfigurowanie tego?

dharmatech
źródło
Wszystkie odpowiedzi nie działają dla mnie indywidualnie. Jeśli jednak zachowam wszystkie trzy, to faktycznie zadziała.
phonycollectibles

Odpowiedzi:

11

Jeśli zrozumiałem pytanie, oto funkcja, która wykonuje to, co chcesz:

(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))))))

Możesz dodać go jako hak, który jest wywoływany za każdym razem, gdy rama jest zamykana, używając:

(add-to-list 'delete-frame-functions #'maybe-delete-frame-buffer)
glucas
źródło
5

Poniżej znajduje się funkcja (przetestowana, ale nie wyczerpująca), która spełnia twoje pierwsze wymaganie: zabija bieżący bufor, gdy zamykasz ramkę, JEŻELI bufor jest również widoczny w innej ramce.

(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)

Nie jestem pewien co do drugiego wymogu:

  • Przez więcej niż jeden bufor wyświetlana w ramce , to znaczy rama ma a) dwóch lub więcej okien, oraz b) okna mają różne bufory wyświetlane w nich?
  • Przez nic nie rozumiesz , czy masz na myśli a) usunięcie ramki, ale nie zabijanie bieżącego bufora, lub b) naprawdę nic nie rób: nie usuwaj ramki ani nie zabijaj bieżącego bufora?
Dan
źródło
Cześć Dan. Chodzi o to, że jeśli więcej niż jeden bufor jest wyświetlany w ramce, przez wiele okien w tej ramce, wówczas żaden bufor nie zostanie zabity, ale ramka nadal zostanie usunięta.
dharmatech
Ale widziałem, że inne zachowania są przydatne. Tj. Zabij wszystkie pokazane bufory, o ile nie są pokazane w innych ramkach.
dharmatech
1

Oto proste podejście:

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

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

Jednak zabije bufor, nawet jeśli jest otwarty w innej ramce.

dharmatech
źródło