Kill buffer quando il frame viene eliminato


12

Quando chiudo un frame, vorrei che il suo buffer venisse ucciso.

Se il buffer viene visualizzato in altri frame, il buffer non deve essere ucciso.

Non fare nulla se viene visualizzato più di un buffer in un frame.

Qual è un buon modo per configurarlo?


Tutte le risposte non funzionano individualmente per me. Tuttavia, se li tengo tutti e tre, funziona davvero.
phonycollectibles

Risposte:


11

Se ho capito la domanda, ecco una funzione che fa quello che vuoi:

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

Puoi aggiungerlo come hook che viene chiamato ogni volta che un frame viene chiuso usando:

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

5

Di seguito è una funzione (testata, ma non esaustiva) che soddisfa il tuo primo requisito: uccide il buffer corrente quando chiudi un frame A MENO CHE il buffer sia visibile anche in un altro frame.

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

Non sono chiaro il secondo requisito:

  • Con più di un buffer visualizzato nel frame , vuoi dire il telaio ha a) due o più finestre, e b) le finestre hanno diversi tamponi visualizzati in loro?
  • Per niente , intendi a) cancellare il frame ma non uccidere il buffer corrente, oppure b) davvero non fare nulla: non eliminare il frame o uccidere il buffer corrente?

Ciao Dan L'idea è che se più di un buffer viene mostrato in un frame, tramite più finestre in quel frame, allora nessun buffer verrà ucciso, ma il frame verrà comunque eliminato.
Dharmatech,

Ma ho potuto vedere utili altri comportamenti. Vale a dire uccidere tutti i buffer mostrati, purché non siano mostrati in altri frame.
Dharmatech,

1

Ecco un approccio semplice:

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

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

Ucciderà un buffer anche se è aperto in un altro frame.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.