Na minha experiência, esse é um problema mais difícil que se possa pensar, porque a idéia intuitiva do que é sensível nem sempre é fácil de colocar em termos precisos. Vou apenas descrever o que acabei, mas você pode ter que mexer.
Primeiro: a split-window-sensibly
função existente sempre prefere terminar com uma pilha horizontal de janelas (que, de maneira confusa, chama uma "divisão" vertical, embora a divisão seja horizontal ...) em um arranjo lado a lado. É fácil criar uma função que tenha a preferência oposta, que é essencialmente apenas uma cópia split-window-sensibly
com as preferências invertidas:
(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))))))))
Portanto, agora temos duas funções: a original que "prefere" uma pilha vertical e a nova que "prefere" uma pilha horizontal.
Em seguida, precisamos de uma função que tende a preferir a que preferimos usar.
(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)))))
Você precisa mexer nos valores aqui, mas a idéia básica é que preferimos um arranjo vertical sempre que houver pelo menos o dobro da largura e da altura. Você pode pensar que queria onde a janela existente é mais larga do que alta, mas, na minha experiência, isso não está certo e permite que você termine com janelas muito finas.
Finalmente, também precisamos ter alguns mínimos sãos. Defino um split-height-threshold
de 4 (ou seja, não quero, a menos que seja inevitável, ter menos de 2 linhas em uma janela) e um split-width-threshold
de 40 (ou seja, eu não quero, a menos que seja inevitável, ter menos de 20 caracteres numa janela) - pelo menos acho que é isso que isso significa.
Então se liga split-window-preferred-function
asplit-window-really-sensibly
(setq
split-height-threshold 4
split-width-threshold 40
split-window-preferred-function 'split-window-really-sensibly)
Outra idéia (que você pode preferir) seria apenas substituir a disposição "preferência por lado a lado" e definida split-width-threshold
como 80: então você teria janelas lado a lado sempre que houvesse espaço para elas, eu acho.
split-window-preferred-function
que pode ser configurada para usar uma função personalizada. Dê uma boa olhada na funçãosplit-window-sensibly
e veja se ela pode atender às suas necessidades, ajustando determinadas variáveis, como você mencionou na sua pergunta, e também leia a sequência de documentos dessa função ... se ela não puder ser feita para atender às suas necessidades, então você pode escrever outro, ou obter ajuda para escrever outra função ...