检测Emacs窗口已经拆分

时间:2012-06-13 19:19:25

标签: emacs configuration elisp

如何检测Emacs窗口是否已被拆分?

在我的.emacs文件中,我有:

(when (display-graphic-p)
  (set-frame-size (selected-frame) 166 85)
  (split-window-horizontally))

允许我并排放置两个缓冲区,每个缓冲区恰好有80个字符宽。

每隔一段时间我就会更改我的.emacs文件,并希望将其重新加载到位,因此我在.emacs文件上运行M-x load-file,我所在的窗口会被重新拆分。

是否有某种命令可以调用以检查帧是否已被拆分,如果没有则只调用(split-window-horizontally)?类似的东西:

(when (window-is-root)
  (split-window-horizontally))

(when (not (window-is-already-split))
  (split-window-horizontally))

2 个答案:

答案 0 :(得分:10)

window-list会返回一个窗口列表(对于当前帧),所以你应该可以这样做:

(when (= (length (window-list)) 1)
  (split-window-horizontally))

查看relevant documentation for windows

答案 1 :(得分:-3)

这是一个毫无意义的问题,窗户不会拆分。

是的,有一些名为split-window ...的函数,但他们所做的只是减小窗口的大小,并在这样释放的空间中创建一个新窗口。

你不能只使用(= 1(长度(窗口列表))),因为每帧至少有一个窗口(不计算迷你缓冲区的simili窗口)。

你可以尝试:

(< (length (frame-list)) (length (window-list)))

但是这并没有告诉你所选框架中是否有多个窗口,这是你实际要问的,因为很明显它可能是另一个包含几个窗口的框架。

因此,如果您正确地提出问题,“如何知道所选框架是否包含多个窗口”,您可以轻松找到答案:

(require 'cl)

(defun complement (fun)
  (byte-compile `(lambda (&rest args) (not (apply ',fun args)))))

(defun* more-than-one-window-in-frame-p (&optional (frame (selected-frame)))
  (< 1 (length (remove* frame (window-list)
                        :key (function window-frame)
                        :test (complement (function eql))))))