Puffer löschen, wenn Bild gelöscht wird

12

Wenn ich einen Frame schließe, möchte ich, dass sein Puffer gelöscht wird.

Wenn der Puffer in anderen Frames angezeigt wird, sollte der Puffer nicht gelöscht werden.

Tun Sie nichts, wenn mehr als ein Puffer in einem Frame angezeigt wird.

Was ist ein guter Weg, um dies einzurichten?

Dharmatech
quelle
Alle Antworten funktionieren bei mir nicht individuell. Wenn ich jedoch alle drei behalte, funktioniert es tatsächlich.
phonycollectibles

Antworten:

11

Wenn ich die Frage verstanden habe, ist hier eine Funktion, die das tut, was Sie wollen:

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

Sie können es als Hook hinzufügen, der aufgerufen wird, wenn ein Frame geschlossen wird. Verwenden Sie dazu:

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

Im Folgenden finden Sie eine Funktion (getestet, aber nicht umfassend), die Ihre erste Anforderung erfüllt: Sie löscht den aktuellen Puffer, wenn Sie einen Frame schließen, OHNE dass der Puffer auch in einem anderen Frame sichtbar ist.

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

Die zweite Anforderung ist mir unklar:

  • Meinen Sie mit mehr als einem Puffer, der im Rahmen angezeigt wird , dass der Rahmen a) zwei oder mehr Fenster hat und b) in den Fenstern unterschiedliche Puffer angezeigt werden?
  • Durch do nichts , meinen Sie a) den Rahmen löschen aber nicht den aktuellen Puffer töten, oder b) wirklich tun nichts: nicht den Rahmen löschen oder den aktuellen Puffer zu töten?
Dan
quelle
Hallo Dan. Die Idee ist, dass, wenn mehr als ein Puffer in einem Frame über mehrere Fenster in diesem Frame angezeigt wird, kein Puffer gelöscht wird, der Frame jedoch trotzdem gelöscht wird.
Dharmatech
Aber ich konnte sehen, dass andere Verhaltensweisen nützlich waren. Dh töte alle gezeigten Puffer, solange sie nicht in anderen Frames gezeigt werden.
Dharmatech
1

Hier ist ein einfacher Ansatz:

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

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

Es wird jedoch einen Puffer löschen, auch wenn er in einem anderen Frame geöffnet ist.

Dharmatech
quelle