检测Emacs窗口是否已经分割

7

如何检测 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个回答

11

window-list会返回当前框架的窗口列表,因此您应该能够执行以下操作:

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

查看与窗口相关的文档


完美运行,谢谢!也感谢您提供的文档指针。我找到了这个页面:http://www.gnu.org/software/emacs/manual/html_node/elisp/Splitting-Windows.html#Splitting-Windows 但似乎没有任何有用的信息。 - sligocki

-3

这是一个毫无意义的问题,窗口不会被分割。

是的,有名为split-window...的函数,但它们所做的仅仅是减小窗口的尺寸,并在因此腾出的空间中创建一个新的窗口。

你不能只使用 (= 1 (length (window-list))),因为每个框架至少有一个窗口(不包括minibuffer的模拟窗口)。

你可以尝试:

(< (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))))))

2
函数:window-list&可选帧minibuffer窗口。 该函数返回属于帧frame的活动窗口列表。如果省略了frame参数或设置为nil,则默认为所选帧。因此,它只返回该帧中的窗口。我尝试在两个帧上使用(= (length (window-list)) 1),结果运行良好。 - sligocki
2
从:http://www.gnu.org/software/emacs/manual/html_node/elisp/Windows-and-Frames.html#Windows-and-Frames - sligocki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接