当display-buffer
必须在现有窗格中创建一个新窗口时,Emacs手册声明首先查看split-height-threshold
以确定新窗口是否可以低于当前窗口,然后 split-width-threshold
以相同的方式评估并排窗口。
如果宽度足够高,是否有一种方法可以使Emacs首先尝试并排放置窗口?我可以将split-height-threshold
设置为nil
以完全抑制垂直分割,但如果当前窗口不够宽,则会使Emacs窃取另一个窗口。
您可以通过自定义变量split-window-preferred-function
:
(defun my-split-window-sensibly (&optional window)
(let ((window (or window (selected-window))))
(or (and (window-splittable-p window t)
;; Split window horizontally.
(with-selected-window window
(split-window-right)))
(and (window-splittable-p window)
;; Split window vertically.
(with-selected-window window
(split-window-below)))
(and (eq window (frame-root-window (window-frame window)))
(not (window-minibuffer-p window))
;; If WINDOW is the only window on its frame and is not the
;; minibuffer window, try to split it horizontally disregarding
;; the value of `split-width-threshold'.
(let ((split-width-threshold 0))
(when (window-splittable-p window t)
(with-selected-window window
(split-window-right))))))))
(setq split-window-preferred-function 'my-split-window-sensibly)
变量split-window-preferred-function
指定了一个函数,用于拆分窗口,以便创建一个显示缓冲区的新窗口。它被
display-buffer-pop-up-window
动作函数用于实际分割窗口。
默认设置为split-window-sensibly
。我上面提供的函数是split-window-sensibly
的修改版本(在window.el
中定义),它简单地逆转了原始函数的步骤,导致Emacs"更喜欢"并行窗口分割而不是堆叠窗口分割。