Quando fecho um quadro, gostaria que seu buffer fosse morto.
Se o buffer for exibido em outros quadros, ele não deve ser eliminado.
Não faça nada se mais de um buffer for exibido em um quadro.
Qual é uma boa maneira de configurar isso?
Quando fecho um quadro, gostaria que seu buffer fosse morto.
Se o buffer for exibido em outros quadros, ele não deve ser eliminado.
Não faça nada se mais de um buffer for exibido em um quadro.
Qual é uma boa maneira de configurar isso?
Respostas:
Se eu entendi a pergunta, aqui está uma função que faz o que você deseja:
(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))))))
Você pode adicioná-lo como um gancho que é chamado sempre que um quadro é fechado usando:
(add-to-list 'delete-frame-functions #'maybe-delete-frame-buffer)
Abaixo está uma função (testada, mas não extensivamente) que atende ao seu primeiro requisito: ela mata o buffer atual quando você fecha um quadro, A menos que o buffer também seja visível em outro quadro.
(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)
Não estou claro sobre o segundo requisito:
Aqui está uma abordagem simples:
(defun close-frame-buffer (frame)
(kill-buffer
(window-buffer
(frame-root-window frame))))
(add-hook 'delete-frame-functions 'close-frame-buffer)
No entanto, ele mata um buffer, mesmo que seja aberto em outro quadro.