删除窗口的更智能的替代方案?

时间:2013-08-20 02:15:42

标签: emacs elisp

有时我会为同一个缓冲区(或类似的缓冲区)打开多个窗口,我必须在决定杀死它或删除窗口之前区分窗口中的缓冲区是否与另一个缓冲区相同。

只有当缓冲区已存在于另一个窗口中时,emacs中是否还有一种方法可以简单地删除窗口?理想情况下,如果它是窗口中唯一的缓冲区实例,我希望同样的函数也可以杀死缓冲区和窗口。

4 个答案:

答案 0 :(得分:2)

(defun delete-extra-windows ()
  (interactive)
  (let* ((selwin  (selected-window))
         (buf     (window-buffer selwin)))
    (walk-windows (lambda (ww)
                    (unless (eq ww selwin)
                      (when (eq (window-buffer ww) buf)
                        (delete-window ww))))
                  'NO-MINI 'THIS-FRAME)))

答案 1 :(得分:1)

我在15年前添加了quit-window(通常绑定到非自插入的 q - AKA special - 缓冲区)来解决类似的问题。 您可以尝试它或它的兄弟quit-windows-on

答案 2 :(得分:1)

您对所需内容的说明并不清楚。你说“只有当缓冲区已存在于另一个窗口时才删除窗口”。这意味着如果缓冲区不存在于另一个窗口中,则删除窗口。然而你还说“如果它是窗口中缓冲区的唯一实例,则杀死缓冲区和窗口”,这与第一个要求相矛盾。

我想通过“只删除一个窗口......”你的意思是“只删除窗口(不是缓冲区),如果......”。

(defun delete-window-maybe-kill-buffer ()
  "Delete selected window.
If no other window shows its buffer, kill the buffer too."
  (interactive)
  (let* ((selwin  (selected-window))
         (buf     (window-buffer selwin)))
    (delete-window selwin)
    (unless (get-buffer-window buf 'visible) (kill-buffer buf))))

答案 3 :(得分:0)

这是我正在寻找的行为。感谢您帮助我们完成基本的功能和逻辑。 Elisp仍然很难与之合作,我很感激帮助我们度过难关。

请参阅解释行为的代码消息。您还应该能够直接从源中理解它。

我已经投了你之前的答案,其中包括我使用的大部分代码。

;;; Delete the selected window without killing the buffer if the buffer is open
;;; in another; otherwise close the window and its buffer. If called on the
;;; last visible window then the buffer will simply be killed and replaced by
;;; the next available buffer.
(defun delete-window-maybe-kill-buffer ()
  "Delete selected window.
If no other window shows its buffer, kill the buffer too."
  (interactive)
  (let* ((selwin (selected-window))
         (buf (window-buffer selwin)))

    (if (> (length (window-list)) 1)
        (delete-window selwin)
      (unless (get-buffer-window buf 'visible) (kill-buffer buf))
      (kill-buffer buf))))