私の経験では、これは人が考えるかもしれないより難しい問題です。何が賢明であるかという直観的な考えは、正確な言葉で表現することが必ずしも容易ではないからです。私が何をしてしまったのかを説明しますが、いじる必要があるかもしれません。
まず、既存のsplit-window-sensibly
関数は常に、ウィンドウの水平方向のスタックで終わることを好みます(分割は水平方向ですが、混乱を招き、垂直方向の「分割」と呼ばれます...)。逆の設定を持つ関数を作成するのは簡単です。基本的にsplit-window-sensibly
は、設定が反転された単なるコピーです。
(defun split-window-sensibly-prefer-horizontal (&optional window)
"Based on split-window-sensibly, but designed to prefer a horizontal split,
i.e. windows tiled side-by-side."
(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
;; If WINDOW is the only usable window on its frame (it is
;; the only one or, not being the only one, all the other
;; ones are dedicated) and is not the minibuffer window, try
;; to split it horizontally disregarding the value of
;; `split-height-threshold'.
(let ((frame (window-frame window)))
(or
(eq window (frame-root-window frame))
(catch 'done
(walk-window-tree (lambda (w)
(unless (or (eq w window)
(window-dedicated-p w))
(throw 'done nil)))
frame)
t)))
(not (window-minibuffer-p window))
(let ((split-width-threshold 0))
(when (window-splittable-p window t)
(with-selected-window window
(split-window-right))))))))
したがって、2つの関数があります。垂直スタックを「優先」する元の関数と、水平スタックを「優先」する新しい関数です。
次に、使用したい関数を優先する傾向がある関数が必要です。
(defun split-window-really-sensibly (&optional window)
(let ((window (or window (selected-window))))
(if (> (window-total-width window) (* 2 (window-total-height window)))
(with-selected-window window (split-window-sensibly-prefer-horizontal window))
(with-selected-window window (split-window-sensibly window)))))
ここで値をいじる必要がありますが、基本的な考え方は、高さの少なくとも2倍の幅がある場合は常に垂直配置を好むということです。既存のウィンドウが高さよりも広い場所ならどこでもそれを望んでいたと思うかもしれませんが、私の経験ではそれは正しくなく、結局は非常に細いウィンドウになってしまいます。
最後に、適切な最小値も必要です。a split-height-threshold
を4(つまり、不可避でない限り、ウィンドウ内の行が2行未満になることを望まない)およびa split-width-threshold
を40(つまり、不可避でない限り、20文字未満にすることは望まない)ウィンドウ内)-少なくとも私はそれがこれらの意味だと思います。
次に、バインドsplit-window-preferred-function
しますsplit-window-really-sensibly
(setq
split-height-threshold 4
split-width-threshold 40
split-window-preferred-function 'split-window-really-sensibly)
別のアイデア(あなたが好むかもしれません)は、「並べて表示するための設定」を置き換えsplit-width-threshold
て80に設定することです。そうすれば、スペースがあるときはいつでもウィンドウを並べて表示できます。
split-window-preferred-function
、カスタム関数を使用するように設定できます。関数split-window-sensibly
をよく見て、質問で述べたように特定の変数を調整することでニーズに合うかどうかを確認し、その関数のdoc-stringも読んでください...ニーズに合わせることができない場合は、あなたは別のものを書いたり、別の関数を書くための助けを得たりすることができます...