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?


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)

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?

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.