Emacs 中显示缓冲区 split-height-threshold 和 split-width-threshold 的反向求值顺序

Rom*_*rre 4 emacs emacs24

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

如果宽度足够高,有没有办法让 Emacs 先尝试将窗口并排放置?我可以设置split-height-thresholdnil完全禁止垂直拆分,但是如果当前窗口不够宽,这会使 Emacs 窃取另一个窗口。

its*_*eyd 5

您可以通过自定义变量让 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)
Run Code Online (Sandbox Code Playgroud)

变量 split-window-preferred-function

指定用于拆分窗口的函数,以便创建一个用于显示缓冲区的新窗口。display-buffer-pop-up-window动作函数使用它来实际分割窗口。

默认情况下,它设置为split-window-sensibly。我在上面提供的函数是split-window-sensibly(在 中定义的window.el)的修改版本,它只是颠倒了原始函数的步骤,导致 Emacs “更喜欢”并排窗口拆分而不是堆叠窗口拆分。