删除帧时杀死缓冲区


12

当我关闭框架时,我希望它的缓冲区被杀死。

如果缓冲区显示在其他框架中,则不应终止该缓冲区。

如果在一帧中显示多个缓冲区,则不执行任何操作。

进行此设置的好方法是什么?


所有的答案对我来说都不行。但是,如果我保留所有三个选项,则它实际上可以工作。
phonycollectibles

Answers:


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)

我不清楚第二个要求:

  • 通过在框架中显示多个缓冲区,您是否表示框架具有a)两个或更多窗口,并且 b)窗口中显示了不同的缓冲区?
  • 通过什么都不做,您是说a)删除帧但杀死当前缓冲区,还是 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)

即使它在另一个框架中打开,它也会杀死一个缓冲区。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.