Nach meiner Erfahrung ist dies ein schwierigeres Problem, als man denken könnte, da es nicht immer einfach ist, eine intuitive Vorstellung davon, was sinnvoll ist, genau zu formulieren. Ich werde nur beschreiben, was ich am Ende habe, aber Sie müssen vielleicht herumspielen.
Erstens: Die vorhandene split-window-sensibly
Funktion zieht es immer vor, einen horizontalen Stapel von Fenstern (der verwirrenderweise eine vertikale "Teilung" nennt, obwohl die Teilung horizontal ist ...) über eine nebeneinander angeordnete Anordnung zu erhalten. Es ist einfach genug, eine Funktion mit der entgegengesetzten Präferenz zu erstellen, die im Wesentlichen nur eine Kopie split-window-sensibly
mit umgekehrten Präferenzen ist:
(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))))))))
Jetzt haben wir zwei Funktionen: das Original, das einen vertikalen Stapel "bevorzugt", und das neue, das einen horizontalen Stapel "bevorzugt".
Als nächstes brauchen wir eine Funktion, die diejenige bevorzugt, die wir lieber verwenden würden.
(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)))))
Sie müssen hier mit den Werten herumspielen, aber die Grundidee ist, dass wir eine vertikale Anordnung bevorzugen, wenn mindestens doppelt so viel Breite wie Höhe vorhanden ist. Sie könnten denken, Sie wollten es überall dort haben, wo das vorhandene Fenster breiter als hoch ist, aber meiner Erfahrung nach ist das nicht richtig und lässt Sie mit viel zu dünnen Fenstern enden.
Schließlich brauchen wir auch ein paar vernünftige Mindestanforderungen. Ich setze eine split-height-threshold
von 4 (dh ich möchte nicht, wenn es nicht unvermeidlich ist, weniger als 2 Zeilen in einem Fenster zu haben) und eine split-width-threshold
von 40 (dh ich möchte nicht, wenn es nicht unvermeidlich ist, weniger als 20 Zeichen im Durchmesser haben in einem Fenster) - zumindest denke ich, dass dies das ist, was diese bedeuten.
Dann , eines nur bindet split-window-preferred-function
ansplit-window-really-sensibly
(setq
split-height-threshold 4
split-width-threshold 40
split-window-preferred-function 'split-window-really-sensibly)
Eine andere Idee (die Sie vielleicht bevorzugen) wäre, einfach die "Präferenz für Side-by-Side" -Anordnung zu ersetzen und split-width-threshold
auf 80 zu setzen: Dann würden Sie Side-by-Side-Fenster erhalten, wenn Platz für sie vorhanden ist, denke ich.
split-window-preferred-function
die so eingestellt werden kann, dass eine benutzerdefinierte Funktion verwendet wird. Schauen Sie sich die Funktion genau ansplit-window-sensibly
und prüfen Sie, ob sie Ihren Anforderungen entspricht, indem Sie bestimmte Variablen wie in Ihrer Frage erwähnt anpassen. Lesen Sie auch die Dokumentzeichenfolge dieser Funktion ... wenn sie nicht Ihren Anforderungen entsprechen kann, dann Sie können eine andere schreiben oder Hilfe beim Schreiben einer anderen Funktion erhalten ...