Emacs中split-height-threshold和split-width-threshold的反求值顺序



display-buffer必须在现有窗格中创建一个新窗口时,Emacs手册声明首先查看split-height-threshold以确定新窗口是否可以低于当前窗口,然后 split-width-threshold以相同的方式评估并排窗口。

如果宽度足够高,是否有一种方法可以使Emacs首先尝试并排放置窗口?我可以将split-height-threshold设置为nil以完全抑制垂直分割,但如果当前窗口不够宽,则会使Emacs窃取另一个窗口。

您可以通过自定义变量split-window-preferred-function:

来使Emacs做到这一点
(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"更喜欢"并行窗口分割而不是堆叠窗口分割。