aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorRichard M. Stallman <[email protected]>1993-06-14 07:11:15 +0000
committerRichard M. Stallman <[email protected]>1993-06-14 07:11:15 +0000
commit7162c5c4dc3c0f92f14d179b3592a630173b0263 (patch)
tree37705786f8bd23b9a84ef25847980f0115670972 /lisp
parent0def0403ca727619f461d20d9cb78becab70c8ac (diff)
(balance-windows): Total rewrite.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/window.el56
1 files changed, 41 insertions, 15 deletions
diff --git a/lisp/window.el b/lisp/window.el
index a69c20018d..dae61f66f5 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -33,26 +33,52 @@ even if it is active."
count))
(defun balance-windows ()
- "Makes all visible windows the same size (approximately)."
+ "Makes all visible windows the same height (approximately)."
(interactive)
- (let ((count 0))
+ (let ((count -1) levels newsizes size)
+ ;; Find all the different vpos's at which windows start,
+ ;; then count them. But ignore levels that differ by only 1.
+ (save-window-excursion
+ (let (tops (prev-top -2))
+ (walk-windows (function (lambda (w)
+ (setq tops (cons (nth 1 (window-edges w))
+ tops))))
+ 'nomini)
+ (setq tops (sort tops '<))
+ (while tops
+ (if (> (car tops) (1+ prev-top))
+ (setq prev-top (car tops)
+ count (1+ count)))
+ (setq levels (cons (cons (car tops) count) levels))
+ (setq tops (cdr tops)))
+ (setq count (1+ count))))
+ ;; Subdivide the frame into that many vertical levels.
+ (setq size (/ (frame-height) count))
+ (walk-windows (function
+ (lambda (w)
+ (select-window w)
+ (let ((newtop (cdr (assq (nth 1 (window-edges))
+ levels)))
+ (newbot (or (cdr (assq (+ (window-height)
+ (nth 1 (window-edges)))
+ levels))
+ count)))
+ (setq newsizes
+ (cons (cons w (* size (- newbot newtop)))
+ newsizes))))))
(walk-windows (function (lambda (w)
- (setq count (+ count 1))))
- 'nomini)
- (let ((size (/ (frame-height) count)))
- (walk-windows (function (lambda (w)
- (select-window w)
- (enlarge-window (- size (window-height)))))
- 'nomini))))
+ (select-window w)
+ (let ((newsize (cdr (assq w newsizes))))
+ (enlarge-window (- newsize
+ (window-height))))))
+ 'nomini)))
;;; I think this should be the default; I think people will prefer it--rms.
-
(defvar split-window-keep-point t
- "*If non-nil, split windows so that both windows keep the original
-value of point. This is often more convenient for editing.
-If nil, split windows to minimize redisplay. This is convenient on
-slow terminals, but point may be moved strangely to accommodate the
-redisplay.")
+ "*If non-nil, split windows keeps the original point in both children.
+This is often more convenient for editing.
+If nil, adjust point in each of the two windows to minimize redisplay.
+This is convenient on slow terminals, but point can move strangely.")
(defun split-window-vertically (&optional arg)
"Split current window into two windows, one above the other.