Tuer le tampon lorsque le cadre est supprimé

12

Lorsque je ferme un cadre, j'aimerais que son tampon soit tué.

Si le tampon est affiché dans d'autres images, le tampon ne doit pas être supprimé.

Ne faites rien si plusieurs tampons sont affichés dans un cadre.

Quelle est la bonne façon de configurer cela?

dharmatech
la source
Toutes les réponses ne fonctionnent pas individuellement pour moi. Cependant, si je les garde tous les trois, cela fonctionne réellement.
phonycollectibles

Réponses:

11

Si j'ai compris la question, voici une fonction qui fait ce que vous voulez:

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

Vous pouvez l'ajouter en tant que hook appelé chaque fois qu'un cadre est fermé à l'aide de:

(add-to-list 'delete-frame-functions #'maybe-delete-frame-buffer)
glucas
la source
5

Vous trouverez ci-dessous une fonction (testée, mais pas de manière approfondie) qui répond à votre première exigence: elle tue le tampon actuel lorsque vous fermez une trame À MOINS que le tampon ne soit également visible dans une autre trame.

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

Je ne suis pas clair sur la deuxième exigence:

  • Par plus d'un tampon affiché dans le cadre , voulez-vous dire que le cadre a) deux ou plusieurs fenêtres, et b) les fenêtres ont des tampons différents affichés?
  • Par ne rien faire, voulez-vous dire a) supprimer le cadre mais ne pas tuer le tampon actuel, ou b) vraiment ne rien faire du tout: ne pas supprimer le cadre ou tuer le tampon actuel?
Dan
la source
Salut Dan. L'idée est que si plus d'un tampon est affiché dans un cadre, via plusieurs fenêtres dans ce cadre, aucun tampon ne sera supprimé, mais le cadre sera toujours supprimé.
dharmatech
Mais je pouvais voir d'autres comportements utiles. C'est à dire tuer tous les tampons affichés, tant qu'ils ne sont pas affichés dans d'autres cadres.
dharmatech
1

Voici une approche simple:

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

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

Cependant, il tuera un tampon même s'il est ouvert dans un autre cadre.

dharmatech
la source