Eliminar el búfer cuando se elimina el marco


12

Cuando cierro un marco, me gustaría que se elimine su búfer.

Si el búfer se muestra en otros cuadros, el búfer no debe ser eliminado.

No haga nada si se muestra más de un búfer en un marco.

¿Cuál es una buena manera de configurar esto?


Todas las respuestas no funcionan individualmente para mí. Sin embargo, si me quedo con los tres, en realidad funciona.
phonycollectibles

Respuestas:


11

Si he entendido la pregunta, aquí hay una función que hace lo que quieres:

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

Puede agregarlo como un gancho que se llama cada vez que se cierra un marco usando:

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

5

A continuación se muestra una función (probada, pero no exhaustiva) que cumple con su primer requisito: mata el búfer actual cuando cierra un marco A MENOS QUE el búfer también sea visible en otro marco.

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

No estoy claro sobre el segundo requisito:

  • Por más de un buffer de muestra en el marco , es lo que significa el marco tiene a) dos o más ventanas, y b) las ventanas tienen diferentes tampones se muestra en ellas?
  • Por no hacer nada , ¿quiere decir a) eliminar el marco pero no eliminar el búfer actual, o b) realmente no hacer nada en absoluto: no eliminar el marco o eliminar el búfer actual?

Hola dan La idea es que si se muestra más de un búfer en un marco, a través de múltiples ventanas en ese marco, entonces no se eliminará ningún búfer, pero el marco aún se eliminará.
dharmatech

Pero pude ver que otros comportamientos son útiles. Es decir, eliminar todos los buffers mostrados, siempre que no se muestren en otros cuadros.
dharmatech

1

Aquí hay un enfoque simple:

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

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

Sin embargo, matará un búfer incluso si está abierto en otro marco.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.