답변:
질문을 이해했다면 다음과 같이 원하는 기능을 수행하십시오.
(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)
아래는 첫 번째 요구 사항을 충족시키는 기능 (테스트는되었지만 광범위하지는 않음)입니다 . 버퍼가 다른 프레임에도 표시 되지 않는 한 프레임을 닫으면 현재 버퍼가 종료 됩니다.
(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)
두 번째 요구 사항이 확실하지 않습니다.