프레임이 삭제 될 때 킬 버퍼


12

프레임을 닫을 때 버퍼를 죽이고 싶습니다.

버퍼가 다른 프레임에 표시되면 버퍼를 종료하지 않아야합니다.

프레임에 둘 이상의 버퍼가 표시되면 아무 것도 수행하지 마십시오.

이것을 설정하는 좋은 방법은 무엇입니까?


모든 답변이 개별적으로 작동하지는 않습니다. 그러나 세 가지를 모두 유지하면 실제로 작동합니다.
phonycollectibles 2012 년

답변:


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)

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)

두 번째 요구 사항이 확실하지 않습니다.

  • 하여 하나 개 이상의 버퍼가 프레임에 표시 , 당신은 프레임이) 두 개 이상의 창문이 뜻, 그리고 b)는 창은 서로 다른 버퍼는 그들에 표시 한?
  • 으로 할 일 아무것도 , 당신은)는 평균 프레임을 삭제하고합니까 되지 현재 버퍼, 죽일 또는 B) 정말로 전혀 아무것도하지 : 프레임을 삭제하거나 현재의 버퍼를 죽이지 않아을?

안녕 댄 아이디어는 프레임에 둘 이상의 버퍼가 해당 프레임의 여러 창을 통해 표시되면 버퍼가 종료되지 않지만 프레임은 여전히 ​​삭제된다는 것입니다.
dharmatech

그러나 다른 행동이 유용하다는 것을 알 수있었습니다. 즉, 다른 프레임에 표시되지 않는 한 표시된 모든 버퍼를 종료하십시오.
dharmatech

1

간단한 접근 방식은 다음과 같습니다.

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

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

그러나 다른 프레임에서 열려 있어도 버퍼를 종료합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.