Theo kinh nghiệm của tôi, đây là một vấn đề khó hơn mà người ta có thể nghĩ, bởi vì ý tưởng trực quan của một người về những gì hợp lý không phải lúc nào cũng dễ dàng đưa ra những thuật ngữ chính xác. Tôi sẽ chỉ mô tả những gì tôi đã kết thúc, nhưng bạn có thể phải loay hoay.
Đầu tiên: split-window-sensibly
hàm hiện có luôn thích kết thúc với một chồng các cửa sổ nằm ngang (mà khá khó hiểu, nó gọi là "chia" dọc, mặc dù phần tách là nằm ngang ...) trên một bố trí cạnh nhau. Thật dễ dàng để tạo ra một chức năng có sở thích ngược lại, về cơ bản chỉ là một bản sao split-window-sensibly
với các sở thích được đảo ngược:
(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))))))))
Vì vậy, bây giờ chúng ta có hai chức năng: bản gốc "thích" một ngăn xếp dọc và một chức năng mới "thích" một ngăn xếp ngang.
Tiếp theo, chúng ta cần một chức năng có xu hướng thích cái mà chúng ta muốn sử dụng.
(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)))))
Bạn cần phải xoay quanh các giá trị ở đây, nhưng ý tưởng cơ bản là chúng tôi thích sắp xếp theo chiều dọc bất cứ khi nào có chiều rộng ít nhất gấp đôi chiều cao. Bạn có thể nghĩ rằng bạn muốn nó ở bất cứ nơi nào cửa sổ hiện tại rộng hơn chiều cao của nó, nhưng theo kinh nghiệm của tôi thì không đúng, và cho phép bạn kết thúc với các cửa sổ quá mỏng.
Cuối cùng, chúng ta cũng cần phải có một số mức tối thiểu lành mạnh. Tôi đặt một split-height-threshold
trong 4 (tức là tôi không muốn, trừ khi không thể tránh khỏi, có ít hơn 2 dòng trong một cửa sổ) và split-width-threshold
40 (nghĩa là tôi không muốn, trừ khi không thể tránh khỏi, có ít hơn 20 ký tự trong một cửa sổ) - ít nhất tôi nghĩ đó là những gì có nghĩa.
Sau đó, người ta chỉ liên kết split-window-preferred-function
vớisplit-window-really-sensibly
(setq
split-height-threshold 4
split-width-threshold 40
split-window-preferred-function 'split-window-really-sensibly)
Một ý tưởng khác (mà bạn có thể thích) sẽ chỉ là thay thế sự sắp xếp "ưu tiên cho việc bên cạnh" và được đặt split-width-threshold
thành 80: sau đó bạn sẽ có được các cửa sổ cạnh nhau bất cứ khi nào có không gian cho chúng, tôi nghĩ vậy.
split-window-preferred-function
có thể được thiết lập để sử dụng một chức năng tùy chỉnh. Có một cái nhìn tốt về chức năngsplit-window-sensibly
và xem liệu nó có thể phù hợp với nhu cầu của bạn hay không bằng cách điều chỉnh các biến nhất định như bạn đã đề cập trong câu hỏi của mình và cũng đọc chuỗi doc của hàm đó ... nếu nó không thể được thực hiện phù hợp với nhu cầu của bạn, thì bạn có thể viết một cái khác, hoặc nhờ trợ giúp viết một chức năng khác ...