ram-ashwin@YALE.ARPA (Ashwin Ram) (11/16/87)
Here's a nice abstraction that lets you do things like count-windows and
balance-windows pretty easily. The function walk-windows applies its
argument, a procedure of one argument, to every visible window.
Now it's trivial to define count-windows (pass down a lambda that increments
a count), Mike's balance-windows (pass down a lambda that does an
enlarge-window on each window). Etc. etc...
-- Ashwin Ram --
ARPA: Ram-Ashwin@cs.yale.edu
UUCP: {decvax,linus,seismo}!yale!Ram-Ashwin
BITNET: Ram@yalecs
----------------------------------- cut -----------------------------------
;; walk-windows and friends.
;; Ashwin Ram, 11/12/87.
(defun walk-windows (proc &optional no-mini)
"Applies PROC to each visible window.
Optional arg NO-MINI non-nil means don't apply PROC to the minibuffer
even if it is active."
(let ((start (selected-window))
(current (next-window (selected-window) no-mini)))
(while (not (eq current start))
(funcall proc current)
(setq current (next-window current no-mini)))))
(defun count-windows (&optional no-mini)
"Returns the number of visible windows.
Optional arg NO-MINI non-nil means don't count the minibuffer
even if it is active."
(let ((count 1))
(walk-windows (function (lambda (w) (ignore w)
(setq count (+ count 1))))
no-mini)
count))
(defun balance-windows ()
"Makes all visible windows the same size."
(interactive)
(let ((start (selected-window))
(size (/ (screen-height) (count-windows))))
(walk-windows (function (lambda (w)
(select-window w)
(enlarge-window (- size (window-height)))))
'no-mini)
(select-window start)))
----------------------------------- cut -----------------------------------
P.S. enlarge-window really should take a window as its argument, rather than
making you have to select the window first. When called interactively, that
argument should default to the current window.ram-ashwin@YALE.ARPA (Ashwin Ram) (11/17/87)
Oops... The starting count for count-windows should indeed be 0. There was a
minor bug in walk-windows. Here's the corrected code:
(defun walk-windows (proc &optional no-mini)
"Applies PROC to each visible window.
Optional arg NO-MINI non-nil means don't apply PROC to the minibuffer
even if it is active."
(let ((start (selected-window))
(current (next-window (selected-window) no-mini)))
(funcall proc start)
(while (not (eq current start))
(funcall proc current)
(setq current (next-window current no-mini)))))
(defun count-windows (&optional no-mini)
"Returns the number of visible windows.
Optional arg NO-MINI non-nil means don't count the minibuffer
even if it is active."
(let ((count 0))
(walk-windows (function (lambda (w) (ignore w)
(setq count (+ count 1))))
no-mini)
count))
Thanks for the feedback.
-- Ashwin Ram --
ARPA: Ram-Ashwin@cs.yale.edu
UUCP: {decvax,linus,seismo}!yale!Ram-Ashwin
BITNET: Ram@yalecsram-ashwin@YALE.ARPA (Ashwin Ram) (11/18/87)
A couple of people suggested that it would be nice if walk-windows selected
each window before applying proc to it. I'm not sure that this is "cleaner"
(since you're relying on a global somewhere to do the right thing), but it
certainly is convenient. (It would be best if functions like enlarge-window
took a window argument (that defaulted to the current window via an
interactive spec when called interactively), so that you weren't tempted to
write procs (for walk-windows and elsewhere) that did different things
depending on which window was currently selected.)
Anyway, here is the (hopefully) final version of walk-windows.
(defun walk-windows (proc &optional no-mini)
"Applies PROC to each visible window (after selecting it, for convenience).
Optional arg NO-MINI non-nil means don't apply PROC to the minibuffer
even if it is active."
(let ((start (selected-window))
(current (next-window (selected-window) no-mini)))
(funcall proc start)
(while (not (eq current start))
(select-window current)
(funcall proc current)
(setq current (next-window current no-mini)))
(select-window start)))
Since this function has generated quite a bit of interest, it would be nice
if it became part of GNU. 'balance-windows' is certainly a useful function.
-- Ashwin Ram --
ARPA: Ram-Ashwin@cs.yale.edu
UUCP: {decvax,linus,seismo}!yale!Ram-Ashwin
BITNET: Ram@yalecs