[gnu.emacs.gnus] A different article mode-line

tale@pawl.rpi.edu (David C Lawrence) (02/28/89)

(My last message was a little too hasty; no sooner did I get back from
dinner than I noticed the percentages weren't working right with
gnus-break-pages.  This posting _should be_ correct.)

Well, I've seen at least three other people ask for something like
this and I've also wanted it, so I went in and made some changes.
Basically, this is what the following code does:

 o One new function is added; others merely have their current
definitions modified to accept the new function.

 o The exception to the first point is gnus-Article-set-mode-line.
The way I have defined it is to show a modeline similar to this:

--- GNUS: comp.theory.cell-automata  2 more  5:32pm 2.27[0]  (GNUS Article)--46%

Note that comp.theory.cell-automata is one of the longest group names
and everything fits into the modeline happily; only one or two group
would break that.  

 o The display-time-string is there so because I like it for both
telling time and getting my mail notification.
 
 o The percentage displayed on the mode line is how many lines of the
total buffer size are not beyond the bottom of the window, like more(1).

 o The "2 more" refers to how many unmarked articles remain in the
group. Spaces are printed if there are no more unmarked articles.

I did the "2 more" thing rather than paging because knowing that the
range is {1191-2010} and that I am at 2009 is mostly useless to me;
since I follow subjects, which particular article I am on in the group
is meaningless as far as helping me predict when I'll be on my way to
the next group.

This was only given non-rigourous, but seemingly adequate, testing.
If you find a problem with it, please let me know so I can improve it.

Dave

--- Cut here 8<---- (and the .signature) --------------------------------------
(setq gnus-Article-mode-hook
      '(lambda ()
         (make-local-variable 'gnus-Article-head-to-window-bottom)
         (kill-local-variable 'global-mode-string)
         (setq mode-line-format
               (list (purecopy "")
                     'mode-line-modified 'mode-line-buffer-identification
                     (purecopy "  ")
                     'global-mode-string
                     (purecopy "  %[(")
                     'mode-name 'minor-mode-alist "%n"
                     (purecopy ")%]--")
                     'gnus-Article-head-to-window-bottom
                     (purecopy "-%-")))))

(defun gnus-Article-set-percent (&optional new-article)
  "Set gnus-Article-head-to-window-bottom as a string which represents the
percentage of total Article lines that are before the bottom of the window.
Also forces mode-line update.  Optional NEW-ARTICLE is necessary when a new
article is selected."
  (save-excursion
    (save-restriction
      (setq gnus-Article-head-to-window-bottom
            (if new-article
                (progn
                  (vertical-motion (- (screen-height)
                                      gnus-subject-lines-height 3))
                  ;; The next bit is in case the last real line is
                  ;; (will be) visible on the screen.
                  (move-to-column (- (screen-width) 3))
                  (if (not (eobp)) (forward-char 1))
                  ;; Might only be at end-of-page
                  (widen)
                  (if (eobp) "All"
                    (concat (/ (* 100 (count-lines (point-min) (point)))
                               (count-lines (point-min) (point-max))) "%")))
              (move-to-window-line (- (window-height) 2))
              ;; Same deal as above
              (move-to-column (- (window-width) 3))
              (if (not (eobp)) (forward-char 1))
              ;; Might only be at end-of-page
              (widen)
              (if (eobp) "Bot"
                (concat (/ (* 100 (count-lines (point-min) (point)))
                           (count-lines (point-min) (point-max))) "%"))))))
  (set-buffer-modified-p t))

(defun gnus-Article-set-mode-line ()
  "Set Article mode line string."
  (setq mode-line-buffer-identification
	(list 17
	      (format "GNUS: %s  %s"
		      gnus-newsgroup-name
                      (let ((unmarked (length (gnus-set-difference
                                               gnus-newsgroup-unreads
                                               gnus-newsgroup-marked))))
                        (if (= 0 unmarked) "      "
                          (concat unmarked " more"))))))
  ;; Even if we did this when narrowing to page, do it again as a
  ;; new article.
  (gnus-Article-set-percent 1)
  (set-buffer-modified-p t))

(defun gnus-Article-next-page (lines)
  "Show next page of current article.
If end of article, return non-nil. Otherwise return nil.
Argument LINES specifies lines to be scrolled up."
  (interactive "P")
  (move-to-window-line -1)
  (if (eobp)
      (if (or (not gnus-break-pages)
              (string-match "All\\|Bot" gnus-Article-head-to-window-bottom)
	      (save-restriction (widen) (eobp))) ;Real end-of-buffer?
	  t
	(gnus-narrow-to-page 1)		;Go to next page.
	nil
	)
    (scroll-up lines)
    (gnus-Article-set-percent)
    nil
    ))

(defun gnus-Article-prev-page (lines)
  "Show previous page of current article.
Argument LINES specifies lines to be scrolled down."
  (interactive "P")
  (move-to-window-line 0)
  (if (and gnus-break-pages
	   (bobp)
	   (not (save-restriction (widen) (bobp)))) ;Real beginning-of-buffer?
      (progn
	(gnus-narrow-to-page -1) ;Go to previous page.
	(goto-char (point-max))
	(recenter -1))
    (scroll-down lines)
    (gnus-Article-set-percent)))

;; I don't want to copy the whole function to my gnus-etc.el, so just
;; rebind it here.  The only change the original function needs,
;; however is to include (gnus-Article-set-percent) as the last 
;; function called by gnus-narrow-to-page.
(or (fboundp 'original-gnus-narrow-to-page)
    (fset 'original-gnus-narrow-to-page
          (symbol-function 'gnus-narrow-to-page)))

(defun gnus-narrow-to-page (&optional arg)
  "Make text outside current page invisible except for page delimiter.
A numeric arg specifies to move forward or backward by that many pages,
thus showing a page other than the one point was originally in.
NOTE: This function has been modified to also update the Article buffer
mode-line after narrowing."
  (interactive "P")
  (setq arg (if arg (prefix-numeric-value arg) 0))
  (original-gnus-narrow-to-page arg)
  (gnus-Article-set-percent))
--- Cut here 8<----------------------------------------------------------------
--
      tale@rpitsmts.bitnet, tale%mts@rpitsgw.rpi.edu, tale@pawl.rpi.edu

--
      tale@rpitsmts.bitnet, tale%mts@rpitsgw.rpi.edu, tale@pawl.rpi.edu