Kill buffer quando o quadro é excluído


12

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?


Todas as respostas não funcionam individualmente para mim. No entanto, se eu mantiver os três, ele realmente funciona.
Phonycollectibles

Respostas:


11

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)

5

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:

  • Por mais de um tampão exibido no quadro , você quer dizer o quadro tem a) duas ou mais janelas, e b) as janelas têm diferentes tampões exibidos neles?
  • Por não fazer nada , você quer dizer a) excluir o quadro, mas não matar o buffer atual, ou b) realmente não fazer nada: não excluir o quadro ou matar o buffer atual?

Oi Dan. A idéia é que, se mais de um buffer for mostrado em um quadro, através de várias janelas nesse quadro, nenhum buffer será eliminado, mas o quadro ainda será excluído.
Dharmatech

Mas pude ver outros comportamentos sendo úteis. Ou seja, mate todos os buffers mostrados, desde que não sejam mostrados em outros quadros.
Dharmatech

1

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.