フレームが削除されたときにバッファを殺す


12

フレームを閉じるとき、そのバッファを削除したいです。

バッファが他のフレームに表示されている場合、バッファを強制終了しないでください。

フレームに複数のバッファが表示されている場合は、何もしません。

これを設定する良い方法は何ですか?


すべての答えは私には個別に機能しません。ただし、3つすべてを保持する場合は、実際に機能します。
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)

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)

2番目の要件については不明です。

  • することにより、複数のバッファがフレーム内に表示、あなたはフレーム)が二つ以上のウィンドウを持っている意味ですか、および b)のウィンドウが異なるバッファは、それらの中に表示されていますか?
  • することで何もしない、あなたは)意味のフレームを削除してもないんではない現在のバッファ、殺すか、 b)は、本当にすべてで何もしない:フレームを削除したり、現在のバッファを殺しませんの?

こんにちはダン。フレーム内の複数のウィンドウを介してフレームに複数のバッファが表示される場合、バッファは削除されませんが、フレームは削除されます。
dharmatech

しかし、私は他の動作が役に立つのを見ることができました。つまり、他のフレームに表示されていない限り、表示されているすべてのバッファーを強制終了します。
dharmatech 14年

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.