[comp.emacs] Momentary line-number display kludge

mly@WHEATIES.AI.MIT.EDU (Richard Mlynarik) (01/01/89)

(I doubt that the original query was for this sort of thing, but somebody
else might find this code useful.)

;;>> Problem:  Tabs at beginning of lines
(defun display-line-numbers ()
  (interactive)
  (or (eq (current-buffer) (window-buffer (selected-window)))
      (error "%s is not the selected window's buffer."))
  (let ((buffer-read-only nil)
	(modified (buffer-modified-p))
	(name buffer-file-name)
	(point (point-marker))
	format-string
	line-number
	(count 0)
	nlines
	first-line)
    (save-restriction
      (widen)
      (save-excursion
	(setq first-line (window-start (selected-window)))
	(goto-char first-line)
	(setq line-number (1+ (count-lines (point-min) (point))))
	(move-to-window-line -1)
	(beginning-of-line)
	(setq nlines (count-lines first-line (point)))
	(let ((max (+ line-number nlines)))
	  (setq format-string (cond ((< max 100) "%2d")
				    ((< max 1000) "%3d")
				    ((< max 10000) "%4d")
				    (t "%7d"))))))
    (save-excursion
      (unwind-protect
	  (progn
	    (goto-char first-line)
	    ;; defeat file locking... don't try this at home, kids!
	    (setq buffer-file-name nil)
	    (while (<= count nlines)
	      (insert-before-markers (format format-string line-number))
	      (setq insert-end (point))
	      (setq line-number (1+ line-number)
		    count (1+ count))
	      (forward-line 1))
	    (set-window-start (selected-window) first-line)
	    (goto-char point)
	    (set-buffer-modified-p modified)
	    (message "<<< Press SPACE to continue >>>")
	    (let ((char (read-char)))
	      (or (eql char ?\ )
		  (setq unread-command-char char))))
	(goto-char first-line)
	(let ((n (- (aref format-string 1) ?0)))
	  (while (> count 0)
	    (setq count (1- count))
	    (delete-char n)
	    (forward-line 1)))
	(setq buffer-file-name name)
	(set-buffer-modified-p modified)))))