[comp.emacs] slowsplit.el again

jr@bbn.com (John Robinson) (04/05/89)

With help and encouragement from assorted anonymous souls, the
slowsplit package seen here earlier has improved.  If no other bugs or
missing features show up, I might try to integrate this with the
standard split-window and delete-other-windows.  No one has stepped
forward to work on the split-vertically version, but that is just a
job for someone in Emacs 101 (:-).

Despite the advertisement at the top, this behavior is pretty nice in
general.  Your eyes will thank you.

Without further ado:
--------
; slowsplit.el
;; Response to a challenge to build a split-window with minimum redisplay.
;; In the interests of really doing this, it may move point (the case where
;; the new modeline would cover point).  Replacement for
;; split-window-vertically and delete-other-windows.
;; John Robinson, <jr@bbn.com>, 16 Mar 89
;; updated 20 Mar 89, to use window lines so narrowing/wrapping works

(provide 'slowsplit)

(global-set-key "\C-x2" 'split-window-quietly)
(global-set-key "\C-x1" 'delete-other-windows-quietly)

(defun split-window-quietly (&optional arg)
  "Split the window vertically with minimum redisplay.
This window becomes the uppermost of the two, and gets
ARG lines.  No arg means split equally."
  (interactive "P")
  (let* (
	  (num-arg (and arg (prefix-numeric-value arg)))
	  (oldpt (point))		
	  (oldstart (window-start))	
	  (scroll (or num-arg (/ (window-height) 2)))
	  (scrollpoint (progn (move-to-window-line scroll)
			 (point)))
	  (barstart (progn 
		      (move-to-window-line (- scroll 1))
		      (point)))
	  )
    (split-window nil num-arg)	   
    (goto-char oldstart)
    (recenter 0)
    (other-window 1)
    (goto-char scrollpoint)
    (recenter 0)
    (if (< oldpt scrollpoint )
      (if (>= oldpt barstart)
	(progn
	  (other-window -1)
	  (move-to-window-line (- scroll 2))
	  )
	(progn
	  (other-window -1)
	  (goto-char oldpt)
	  ))
      (progn
	(goto-char oldpt)
	))
    ))


(defun delete-other-windows-quietly ()
  "Delete other windows with minimum redisplay"
  (interactive)
  (let* ((oldpt (point))
	  (oldtopchar (window-start))
	  (oldtop (car (cdr (window-edges))))
	  )
    (delete-other-windows (selected-window))
    (goto-char oldtopchar)
    (recenter oldtop)
    (goto-char oldpt)))
--------
/jr
jr@bbn.com or bbn!jr
C'mon big money!