diff options
author | Richard M. Stallman <rms@gnu.org> | 1995-01-24 23:49:03 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1995-01-24 23:49:03 +0000 |
commit | c3df982802c5153d50d7e00ed4f80f2751d6066d (patch) | |
tree | 7ad569e467127e98ac7ea7a9d08bdf2de7b1ff82 /lisp/=gnus.el | |
parent | f0f88f683f01b9dc4adb7a1d96dd8742e57dcb90 (diff) | |
download | emacs-c3df982802c5153d50d7e00ed4f80f2751d6066d.tar.gz |
Added support for descriptions in the group buffer:
(gnus-group-prepare, gnus-group-prepare-line, gnus-setup-news)
(gnus-gnus-to-quick-newsrc-format, gnus-group-list-groups):
Record if we show all groups, to redisplay
correctly after toggling descriptions display.
(gnus-newsgroups-display-toggle, gnus-newsgroups-update-description)
(gnus-newsgroups-retrieve-description): New functions.
(gnus-group-mode-map): Bind t to gnus-newsgroups-display-toggle.
Add a newsgroups-update-description menu.
(gnus-newsgroups-regex, gnus-newsgroups-display, gnus-newsgroups-alist)
(gnus-newsgroups-hashtb, gnus-newsgroups-showall): New variables.
(gnus-group-group-name): Changed the regexp to avoid conflict
with descriptions which have a ':' inside.
(gnus-group-mode): Doc fix.
Diffstat (limited to 'lisp/=gnus.el')
-rw-r--r-- | lisp/=gnus.el | 97 |
1 files changed, 90 insertions, 7 deletions
diff --git a/lisp/=gnus.el b/lisp/=gnus.el index de94ffe9646..5490d696510 100644 --- a/lisp/=gnus.el +++ b/lisp/=gnus.el @@ -594,6 +594,25 @@ field; if a string, use this; if non-nil, strip of the local host name.") (defvar gnus-use-generic-path nil "*If nil, use the NNTP server name in the Path: field; if stringp, use this; if non-nil, use no host name (user name only)") + +(defvar gnus-newsgroups-regex "^\\([^ \t\n]+\\)[ \t]+\\(.*\\)$" + "Regex to retrieve the group name and the group description from +the output of the newsgroups listing. + +If you have ^M at the end of lines try \"^\\([^ \t\n]+\\)[ \t]+\\([^\r]+\\)[\r]*$\"") + +(defvar gnus-newsgroups-display t + "*display the newsgroup description in *Newsgroup* buffer if not nil") + +(defvar gnus-newsgroups-alist nil + "alist (groupname . description)") + +(defvar gnus-newsgroups-hashtb nil + "hashtable of gnus-newsgroups-alist") + +(defvar gnus-newsgroups-showall nil + "non nil if we display all the groups") + ;; Internal variables. @@ -969,6 +988,7 @@ Optional argument HASHSIZE specifies the table size." (define-key gnus-group-mode-map "?" 'gnus-group-describe-briefly) (define-key gnus-group-mode-map "\C-c\C-i" 'gnus-info-find-node) (define-key gnus-group-mode-map [mouse-2] 'gnus-mouse-pick-group) + (define-key gnus-group-mode-map "t" 'gnus-newsgroups-display-toggle) ;; Make a menu bar item. (define-key gnus-group-mode-map [menu-bar GNUS] @@ -1007,6 +1027,10 @@ Optional argument HASHSIZE specifies the table size." (define-key gnus-group-mode-map [menu-bar groups separator-1] '("--")) + (define-key gnus-group-mode-map [menu-bar groups newsgroups-update-description] + '("Update descriptions" . gnus-newsgroups-update-description)) + (define-key gnus-group-mode-map [menu-bar groups newsgroups-display-toggle] + '("Toggle descriptions" . gnus-newsgroups-display-toggle)) (define-key gnus-group-mode-map [menu-bar groups jump-to-group] '("Jump to Group..." . gnus-group-jump-to-group)) (define-key gnus-group-mode-map [menu-bar groups list-all-groups] @@ -1057,6 +1081,7 @@ V Show the version number of this GNUS. ? Describe Group Mode commands briefly. C-h m Describe Group Mode. C-c C-i Read Info about Group Mode. +t Toggle displaying newsgroup descriptions. The name of the host running NNTP server is asked for if no default host is specified. It is also possible to choose another NNTP server @@ -1288,6 +1313,7 @@ umerin@mse.kyutech.ac.jp" gnus-version)) "List newsgroups in the Newsgroup buffer. If argument SHOW-ALL is non-nil, unsubscribed groups are also listed." (interactive "P") + (setq gnus-newsgroups-showall show-all) (let ((case-fold-search nil) (last-group ;Current newsgroup. (gnus-group-group-name)) @@ -1325,21 +1351,27 @@ If optional argument ALL is non-nil, unsubscribed groups are also listed." (newsrc gnus-newsrc-assoc) (group-info nil) (group-name nil) + (group-description nil) (unread-count 0) + (nb-tab 0) ;; This specifies the format of Group buffer. - (cntl "%s%s%5d: %s\n")) + (cntl "%s%s%5d: %s")) (erase-buffer) ;; List newsgroups. (while newsrc (setq group-info (car newsrc)) (setq group-name (car group-info)) + (if gnus-newsgroups-display + (progn (setq group-description (gnus-gethash group-name gnus-newsgroups-hashtb)) + (setq nb-tab (/ (- 38 (length group-name)) tab-width)))) (setq unread-count (nth 1 (gnus-gethash group-name gnus-unread-hashtb))) (if (or all (and (nth 1 group-info) ;Subscribed. (> unread-count 0))) ;There are unread articles. ;; Yes, I can use gnus-group-prepare-line, but this is faster. (insert - (format cntl + (format (concat cntl (make-string (if (> nb-tab 0) nb-tab 1) ?\t) + "%s\n") ;; Subscribed or not. (if (nth 1 group-info) " " "U") ;; Has new news? @@ -1353,7 +1385,10 @@ If optional argument ALL is non-nil, unsubscribed groups are also listed." ;; Number of unread articles. unread-count ;; Newsgroup name. - group-name)) + group-name + ;; Newsgroup description + (if group-description (cdr group-description) "") + )) ) (setq newsrc (cdr newsrc)) ) @@ -1366,6 +1401,8 @@ If optional argument ALL is non-nil, unsubscribed groups are also listed." "Return a string for the Newsgroup buffer from INFO. INFO is an element of `gnus-newsrc-assoc' or `gnus-killed-assoc'." (let* ((group-name (car info)) + (group-description nil) + (nb-tab 0) (unread-count (or (nth 1 (gnus-gethash group-name gnus-unread-hashtb)) ;; Not in hash table, so compute it now. @@ -1374,8 +1411,13 @@ INFO is an element of `gnus-newsrc-assoc' or `gnus-killed-assoc'." (nth 2 (gnus-gethash group-name gnus-active-hashtb)) (nthcdr 2 info))))) ;; This specifies the format of Group buffer. - (cntl "%s%s%5d: %s\n")) - (format cntl + (cntl "%s%s%5d: %s")) + (if gnus-newsgroups-display + (progn + (setq group-description (gnus-gethash group-name gnus-newsgroups-hashtb)) + (setq nb-tab (/ (- 38 (length group-name)) tab-width)))) + (format (concat cntl (make-string (if (> nb-tab 0) nb-tab 1) ?\t) + "%s\n") ;; Subscribed or not. (if (nth 1 info) " " "U") ;; Has new news? @@ -1390,6 +1432,8 @@ INFO is an element of `gnus-newsrc-assoc' or `gnus-killed-assoc'." unread-count ;; Newsgroup name. group-name + ;; Newsgroup description + (if group-description (cdr group-description) "") ))) (defun gnus-group-update-group (group &optional visible-only) @@ -1437,7 +1481,7 @@ If optional argument VISIBLE-ONLY is non-nil, non displayed group is ignored." "Get newsgroup name around point." (save-excursion (beginning-of-line) - (if (looking-at "^.+:[ \t]+\\([^ \t\n]+\\)\\([ \t].*\\|$\\)") + (if (looking-at "^..[0-9 \t]+:[ \t]+\\([^ \t\n]+\\)\\([ \t].*\\|$\\)") (let ((group-name (buffer-substring (match-beginning 1) (match-end 1)))) (set-text-properties 0 (length group-name) nil group-name) group-name)))) @@ -6260,6 +6304,15 @@ If optional argument RAWFILE is non-nil, force to read raw startup file." )) (gnus-expire-marked-articles) (gnus-get-unread-articles) + + ;; newsgroups description + (if gnus-newsgroups-display + (if (not gnus-newsgroups-alist) + ;; Get newsgroups file only once. + (gnus-newsgroups-retrieve-description))) + + (setq gnus-newsgroups-hashtb (gnus-make-hashtable-from-alist gnus-newsgroups-alist)) + ;; Check new newsgroups and subscribe them. (if init (let ((new-newsgroups (gnus-find-new-newsgroups))) @@ -6993,7 +7046,7 @@ If optional 2nd argument NEXT is non-nil, inserted before it." (insert ";; GNUS internal format of .newsrc.\n") (insert ";; Touch .newsrc instead if you think to remove this file.\n") (let ((variable nil) - (variables gnus-variable-list) + (variables (cons 'gnus-newsgroups-alist gnus-variable-list)) ;; Temporary rebind to make changes ;; gnus-check-killed-newsgroups in invisible. (gnus-killed-assoc gnus-killed-assoc) @@ -7150,6 +7203,36 @@ Range of OBJ is expressed as `((beg1 . end1) (beg2 . end2) ...)." (setq gnus-distribution-list (nreverse gnus-distribution-list))) +(defun gnus-newsgroups-retrieve-description () + "Retrieve newsgroups description and build gnus-newsgroups-alist" + (message "Reading newsgroups file...") + (if (gnus-request-list-newsgroups) + (save-excursion + (setq gnus-newsgroups-alist nil) + (set-buffer nntp-server-buffer) + (goto-char (point-min)) + (while (re-search-forward gnus-newsgroups-regex nil t) + (setq gnus-newsgroups-alist + (cons (cons (buffer-substring (match-beginning 1) (match-end 1)) + (buffer-substring (match-beginning 2) (match-end 2))) + gnus-newsgroups-alist))) + (message "Reading newsgroups file...done")) + (message "Cannot read newsgroups file"))) + +(defun gnus-newsgroups-update-description () + "Update the newsgroups description" + (interactive) + (gnus-newsgroups-retrieve-description) + (setq gnus-newsgroups-hashtb (gnus-make-hashtable-from-alist gnus-newsgroups-alist))) + +(defun gnus-newsgroups-display-toggle () + "Toggle displaying newsgroup descriptions in *Newsgroup* buffer." + (interactive) + (setq gnus-newsgroups-display (not gnus-newsgroups-display)) + (if gnus-newsgroups-showall + (gnus-group-list-groups t) + (gnus-group-list-groups nil))) + (provide 'gnus) ;;Local variables: |