Убить буфер при удалении кадра

12

Когда я закрываю кадр, я бы хотел, чтобы его буфер был уничтожен.

Если буфер отображается в других кадрах, буфер не должен быть уничтожен.

Ничего не делать, если в кадре отображается более одного буфера.

Какой хороший способ настроить это?

dharmatech
источник
Все ответы не работают индивидуально для меня. Однако, если я оставлю все три из них, это на самом деле работает.
phonycollectibles

Ответы:

11

Если я понял вопрос, вот функция, которая делает то, что вы хотите:

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

Вы можете добавить его как ловушку, которая вызывается всякий раз, когда фрейм закрывается, используя:

(add-to-list 'delete-frame-functions #'maybe-delete-frame-buffer)
glucas
источник
5

Ниже приведена функция (протестированная, но не полностью), которая отвечает вашему первому требованию: она убивает текущий буфер при закрытии кадра, ЕСЛИ БУК не виден и в другом кадре.

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

Мне неясно второе требование:

  • Под более чем одним буфером, отображаемым в кадре , вы имеете в виду, что во фрейме есть а) два или более окон и б) окна имеют разные буферы, отображаемые в них?
  • Под « ничего не делать» вы имеете в виду: а) удалить кадр, но не уничтожить текущий буфер, или б) действительно ничего не делать: не удалять кадр или уничтожать текущий буфер?
Дэн
источник
Привет, Дэн. Идея состоит в том, что если в кадре показано более одного буфера через несколько окон в этом кадре, то ни один буфер не будет уничтожен, но кадр все равно будет удален.
dharmatech
Но я мог видеть, что другое поведение было полезным. Т.е. убить все показанные буферы, пока они не показаны в других кадрах.
dharmatech
1

Вот простой подход:

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

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

Однако он убьет буфер, даже если он открыт в другом кадре.

dharmatech
источник