En mi experiencia, este es un problema más difícil que uno podría pensar, porque la idea intuitiva de lo que es sensible no siempre es fácil de expresar en términos precisos. Solo describiré con qué terminé, pero es posible que tengas que jugar un poco.
Primero: la split-window-sensibly
función existente siempre prefiere terminar con una pila horizontal de ventanas (que, de manera bastante confusa, llama una "división" vertical, aunque la división es horizontal ...) sobre una disposición de lado a lado. Es bastante fácil crear una función que tenga la preferencia opuesta, que es esencialmente solo una copia de split-window-sensibly
las preferencias 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))))))))
Así que ahora tenemos dos funciones: la original que "prefiere" una pila vertical y la nueva que "prefiere" una pila horizontal.
Luego necesitamos una función que tiende a preferir la 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)))))
Debe jugar con los valores aquí, pero la idea básica es que preferimos una disposición vertical siempre que haya al menos el doble de ancho que de altura. Puede pensar que lo quería donde la ventana existente es más ancha que alta, pero en mi experiencia eso no es correcto y le permite terminar con ventanas que son demasiado delgadas.
Finalmente, también necesitamos tener algunos mínimos sanos. Establezco un split-height-threshold
4 (es decir, no quiero, a menos que sea inevitable, tener menos de 2 líneas en una ventana) y un split-width-threshold
40 (es decir, no quiero, a menos que sea inevitable, tener menos de 20 caracteres de ancho en una ventana), al menos creo que eso es lo que significan.
Entonces uno solo se une 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)
Otra idea (que podría preferir) sería simplemente sustituir la disposición de "preferencia de lado a lado" y establecerla split-width-threshold
en 80: entonces obtendría ventanas de lado a lado siempre que hubiera espacio para ellos, creo.
split-window-preferred-function
que se puede configurar para usar una función personalizada. Eche un buen vistazo a la funciónsplit-window-sensibly
y vea si puede satisfacer sus necesidades ajustando ciertas variables como mencionó en su pregunta, y también lea la cadena de documentos de esa función ... si no se puede hacer para satisfacer sus necesidades, entonces se puede escribir otra, u obtener ayuda para escribir otra función ...