Ниже приведена функция (протестированная, но не полностью), которая отвечает вашему первому требованию: она убивает текущий буфер при закрытии кадра, ЕСЛИ БУК не виден и в другом кадре.
(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
Но я мог видеть, что другое поведение было полезным. Т.е. убить все показанные буферы, пока они не показаны в других кадрах.
Ответы:
Если я понял вопрос, вот функция, которая делает то, что вы хотите:
Вы можете добавить его как ловушку, которая вызывается всякий раз, когда фрейм закрывается, используя:
источник
Ниже приведена функция (протестированная, но не полностью), которая отвечает вашему первому требованию: она убивает текущий буфер при закрытии кадра, ЕСЛИ БУК не виден и в другом кадре.
Мне неясно второе требование:
источник
Вот простой подход:
Однако он убьет буфер, даже если он открыт в другом кадре.
источник