7

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

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

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

这允许我有两个并排的缓冲区,每个缓冲区正好 80 个字符宽。

每隔一段时间我都会更改我的 .emacs 文件并想重新加载它,所以我M-x load-file在我的 .emacs 文件上运行并且我所在的那个窗口会被重新分割。

是否有某种命令我可以调用来检查框架是否已经被分割并且只有在没有分割的情况下才调用(split-window-horizontally)?就像是:

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

或者

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

2 回答 2

11

window-list将返回一个窗口列表(对于当前帧),所以你应该能够做到:

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

查看windows 的相关文档

于 2012-06-13T19:23:15.773 回答
-3

这是一个无意义的问题,windows 没有拆分。

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

您不能只使用 (= 1 (length (window-list))) 因为每帧至少有一个窗口(不包括 minibuffer 的 simili-window)。

你可以试试:

(< (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))))))
于 2012-06-13T21:33:23.657 回答