*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Thu, 6 Nov 1997 19:50:50 +0000 (19:50 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Thu, 6 Nov 1997 19:50:50 +0000 (19:50 +0000)
21 files changed:
GNUS-NEWS
lisp/ChangeLog
lisp/dgnushack.el
lisp/gnus-agent.el
lisp/gnus-art.el
lisp/gnus-group.el
lisp/gnus-msg.el
lisp/gnus-picon.el
lisp/gnus-score.el
lisp/gnus-sum.el
lisp/gnus-topic.el
lisp/gnus.el
lisp/lpath.el
lisp/message.el
lisp/nnlistserv.el [new file with mode: 0644]
lisp/nnmail.el
lisp/nnweb.el
lisp/pop3.el
texi/ChangeLog
texi/gnus.texi
todo

index c7e4692..e4a0a67 100644 (file)
--- a/GNUS-NEWS
+++ b/GNUS-NEWS
@@ -53,3 +53,13 @@ limit.
 
 *** \\1-expressions are now valid in `nnmail-split-methods'.
 
+*** The `custom-face-lookup' function has been removed.  
+If you used this function in your initialization files, you must
+rewrite them to use `face-spec-set' instead.
+
+*** Cancelling now uses the current select method.  Symbolic prefix
+`a' forces normal posting method.
+
+*** New command to translate M******** sm*rtq**t*s into proper text
+-- `W d'.
+
index 36132be..9e05807 100644 (file)
@@ -1,3 +1,86 @@
+Thu Nov  6 20:43:05 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+
+       * gnus.el: Quassia Gnus v0.13 is released.
+
+Thu Nov  6 20:30:14 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * nnlistserv.el: New backend.
+
+Thu Nov  6 01:53:51 1997  Stefan Waldherr  <swa@cs.cmu.edu>
+
+       * nnweb.el (nnweb-dejanewsold-search): New function.
+
+Thu Nov  6 01:52:43 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-topic.el (gnus-topic-change-level): Really delete multiple
+       instances. 
+
+Wed Nov  5 14:04:54 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-topic.el (gnus-topic-update-topic-line): Possibly fix nil
+       numbers. 
+
+       * gnus-sum.el (gnus-summary-show-article): New command and
+       keystroke. 
+
+Tue Nov  4 06:29:58 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-score.el (gnus-score-adaptive): Use the home score file.
+
+Sat Oct 25 05:52:22 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-art.el (gnus-article-save): Hide headers in the right
+       buffer.
+
+       * gnus-picon.el (gnus-picons-xbm-face): New face.
+
+Sat Oct 25 00:39:42 1997  Lars Balker Rasmussen  <lbr@mjolner.dk>
+
+       * gnus-art.el (gnus-article-fill-paragraph): New command and
+       keystroke. 
+
+1997-10-16  Colin Rafferty  <craffert@ml.com>
+
+       * message.el (message-make-fqdn): Made certain that user-mail is
+                 not nil.
+
+Sat Oct 25 00:18:32 1997  David S. Goldberg  <dsg@linus.mitre.org>
+
+       * gnus-art.el (article-hide-boring-headers): Use many-to.
+
+Fri Oct 24 23:48:39 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-picon.el (gnus-picons-display-pairs): Don't add two bars.
+       (gnus-picons-try-face): Set the foreground color on the bar.
+       (gnus-picons-group-exluded-groups): New variable.
+       (gnus-group-display-picons): Use it.
+
+Mon Oct 13 00:01:35 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-agent.el (gnus-agent-group-path): Translate file chars.
+       (gnus-agent-batch-fetch): New command.
+       (gnus-agent-fetch-group): Message.
+
+Sun Oct 12 23:54:55 1997  ISO-2022-JP  <ichikawa@hv.epson.co.jp>
+
+       * gnus-agent.el (gnus-agent-article-file-coding-system): New
+       variable. 
+
+Sun Oct 12 16:46:11 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * dgnushack.el (lpath): Reversed.
+
+       * gnus-msg.el (gnus-summary-cancel-article): Use sym prefix.
+
+       * gnus-art.el (article-translate-characters): New function.
+       (article-treat-dumbquotes): New command and keystroke.
+
+Sun Oct  5 20:09:31 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-art.el (gnus-button-alist): No ' and " in News:.
+
+       * gnus-msg.el (gnus-inews-insert-archive-gcc): Comp warn.
+
 Sat Oct  4 00:53:55 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
        * gnus.el: Quassia Gnus v0.12 is released.
index ba6a73b..aad6016 100644 (file)
@@ -30,8 +30,8 @@
 
 (require 'cl)
 (require 'bytecomp)
-(push "." load-path)
 (push "~/lisp/custom" load-path)
+(push "." load-path)
 (require 'lpath)
 
 (defalias 'device-sound-enabled-p 'ignore)
@@ -67,7 +67,7 @@ Modify to suit your needs."))
        file elc)
     (condition-case ()
        (require 'w3-forms)
-      (error (setq files (delete "nnweb.el" files))))
+      (error (setq files (delete "nnweb.el" (delete "nnlistserv.el" files)))))
     (while (setq file (pop files))
       (when (or (and (not xemacs)
                     (not (member file '("gnus-xmas.el" "gnus-picon.el"
index cb893b5..853c0ca 100644 (file)
@@ -61,6 +61,7 @@
 (defvar gnus-agent-spam-hashtb nil)
 (defvar gnus-agent-file-name nil)
 (defvar gnus-agent-send-mail-function nil)
+(defvar gnus-agent-article-file-coding-system 'no-conversion)
 
 ;; Dynamic variables
 (defvar gnus-headers)
@@ -303,7 +304,8 @@ agent minor mode in all Gnus buffers."
     (error "No group on the current line"))
   (let ((gnus-command-method (gnus-find-method-for-group group)))
     (gnus-agent-with-fetch
-      (gnus-agent-fetch-group-1 group gnus-command-method))))
+      (gnus-agent-fetch-group-1 group gnus-command-method)
+      (gnus-message 5 "Fetching %s...done" group))))
 
 (defun gnus-agent-add-group (category arg)
   "Add the current group to an agent category."
@@ -452,7 +454,8 @@ the actual number of articles toggled is returned."
     (let* ((gnus-command-method method)
           (file (gnus-agent-lib-file "active")))
       (gnus-make-directory (file-name-directory file))
-      (write-region (point-min) (point-max) file nil 'silent)
+      (let ((coding-system-for-write gnus-agent-article-file-coding-system))
+       (write-region (point-min) (point-max) file nil 'silent))
       (when (file-exists-p (gnus-agent-lib-file "groups"))
        (delete-file (gnus-agent-lib-file "groups"))))))
 
@@ -466,7 +469,8 @@ the actual number of articles toggled is returned."
 
 (defun gnus-agent-group-path (group)
   "Translate GROUP into a path."
-  (nnheader-replace-chars-in-string group ?. ?/))
+  (nnheader-translate-file-chars
+   (nnheader-replace-chars-in-string group ?. ?/)))
 
 \f
 
@@ -759,6 +763,14 @@ the actual number of articles toggled is returned."
   (concat (gnus-agent-directory) (gnus-agent-group-path group) "/"
          (if (stringp article) article (string-to-number article))))
 
+;;;###autoload
+(defun gnus-agent-batch-fetch ()
+  "Start Gnus and fetch session."
+  (interactive)
+  (gnus)
+  (gnus-agent-fetch-session)
+  (gnus-group-exit))
+
 (defun gnus-agent-fetch-session ()
   "Fetch all articles and headers that are eligible for fetching."
   (interactive)
index ec6cbbe..c5875af 100644 (file)
@@ -129,13 +129,14 @@ this list."
 (defcustom gnus-boring-article-headers '(empty followup-to reply-to)
   "Headers that are only to be displayed if they have interesting data.
 Possible values in this list are `empty', `newsgroups', `followup-to',
-`reply-to', and `date'."
+`reply-to', `date', `long-to', and `many-to'."
   :type '(set (const :tag "Headers with no content." empty)
              (const :tag "Newsgroups with only one group." newsgroups)
              (const :tag "Followup-to identical to newsgroups." followup-to)
              (const :tag "Reply-to identical to from." reply-to)
              (const :tag "Date less than four days old." date)
-             (const :tag "Very long To header." long-to))
+             (const :tag "Very long To header." long-to)
+             (const :tag "Multiple To headers." many-to))
   :group 'gnus-article-hiding)
 
 (defcustom gnus-signature-separator '("^-- $" "^-- *$")
@@ -618,6 +619,7 @@ Initialized from `text-mode-syntax-table.")
 If given a negative prefix, always show; if given a positive prefix,
 always hide."
   (interactive (gnus-article-hidden-arg))
+  (current-buffer)
   (if (gnus-article-check-hidden-text 'headers arg)
       ;; Show boring headers as well.
       (gnus-article-show-hidden-text 'boring-headers)
@@ -747,7 +749,21 @@ always hide."
             ((eq elem 'long-to)
              (let ((to (message-fetch-field "to")))
                (when (> (length to) 1024)
-                 (gnus-article-hide-header "to")))))))))))
+                 (gnus-article-hide-header "to"))))
+            ((eq elem 'many-to)
+             (let ((to-count 0))
+               (goto-char (point-min))
+               (while (re-search-forward "^to:" nil t)
+                 (setq to-count (1+ to-count)))
+               (when (> to-count 1)
+                 (while (> to-count 0)
+                   (goto-char (point-min))
+                   (save-restriction
+                     (re-search-forward "^to:" nil nil to-count)
+                     (forward-line -1)
+                     (narrow-to-region (point) (point-max))
+                     (gnus-article-hide-header "to"))
+                   (setq to-count (1- to-count)))))))))))))
 
 (defun gnus-article-hide-header (header)
   (save-excursion
@@ -762,7 +778,29 @@ always hide."
           (point-max)))
        'boring-headers))))
 
-;; Written by Per Abrahamsen <amanda@iesd.auc.dk>.
+(defun article-treat-dumbquotes ()
+  "Translate M******** sm*rtq**t*s into proper text."
+  (interactive)
+  (article-translate-characters "\221\222\223\223" "`'\"\""))
+
+(defun article-translate-characters (from to)
+  "Translate all characters in the body of the article according to FROM and TO.
+FROM is a string of characters to translate from; to is a string of
+characters to translate to."
+  (save-excursion
+    (goto-char (point-min))
+    (when (search-forward "\n\n" nil t)
+      (let ((buffer-read-only nil)
+           (x (make-string 225 ?x))
+           (i -1))
+       (while (< (incf i) (length x))
+         (aset x i i))
+       (setq i 0)
+       (while (< i (length from))
+         (aset x (aref from i) (aref to i))
+         (incf i))
+       (translate-region (point) (point-max) x)))))
+
 (defun article-treat-overstrike ()
   "Translate overstrikes into bold text."
   (interactive)
@@ -1424,7 +1462,9 @@ This format is defined by the `gnus-article-time-format' variable."
     (let ((gnus-visible-headers
           (or gnus-saved-headers gnus-visible-headers))
          (gnus-article-buffer save-buffer))
-      (gnus-article-hide-headers 1 t)))
+      (save-excursion
+       (set-buffer save-buffer)
+       (article-hide-headers 1 t))))
   (save-window-excursion
     (if (not gnus-default-article-saver)
        (error "No default saver is defined")
@@ -1747,6 +1787,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
      article-date-user
      article-date-lapsed
      article-emphasize
+     article-treat-dumbquotes
      (article-show-all . gnus-article-show-all-headers))))
 \f
 ;;;
@@ -2572,7 +2613,7 @@ groups."
     ("\\bnews:\\([^>\n\t ]*@[^>\n\t ]*\\)" 0 t gnus-button-message-id 1)
     ("\\(\\b<\\(url: ?\\)?news:\\(//\\)?\\([^>\n\t ]*\\)>\\)" 1 t
      gnus-button-fetch-group 4)
-    ("\\bnews:\\(//\\)?\\([^>\n\t ]+\\)" 0 t gnus-button-fetch-group 2)
+    ("\\bnews:\\(//\\)?\\([^'\">\n\t ]+\\)" 0 t gnus-button-fetch-group 2)
     ("\\bin\\( +article\\)? +\\(<\\([^\n @<>]+@[^\n @<>]+\\)>\\)" 2
      t gnus-button-message-id 3)
     ("\\(<URL: *\\)mailto: *\\([^> \n\t]+\\)>" 0 t gnus-url-mailto 2)
index 04fb2bf..d0e57b6 100644 (file)
@@ -2714,7 +2714,10 @@ of groups killed."
                  gnus-list-of-killed-groups)
            (setcdr (cdr entry) (cdddr entry)))
           ((member group gnus-zombie-list)
-           (setq gnus-zombie-list (delete group gnus-zombie-list)))))
+           (setq gnus-zombie-list (delete group gnus-zombie-list))))
+         ;; There may be more than one instance displayed.
+         (while (gnus-group-goto-group group)
+           (gnus-delete-line)))
        (gnus-make-hashtable-from-newsrc-alist)))
 
     (gnus-group-position-point)
index 86d5941..4ed6e7c 100644 (file)
@@ -287,14 +287,17 @@ If prefix argument YANK is non-nil, original article is yanked automatically."
     (push-mark)
     (goto-char beg)))
 
-(defun gnus-summary-cancel-article (n)
-  "Cancel an article you posted."
-  (interactive "P")
+(defun gnus-summary-cancel-article (&optional n symp)
+  "Cancel an article you posted.
+Uses the process-prefix convention.  If given the symbolic
+prefix `a', cancel using the standard posting method; if not
+post using the current select method."
+  (interactive (gnus-interactive "P\ny"))
   (gnus-set-global-variables)
   (let ((articles (gnus-summary-work-articles n))
        (message-post-method
         `(lambda (arg)
-           (gnus-post-method nil ,gnus-newsgroup-name)))
+           (gnus-post-method (not (eq symp 'a)) ,gnus-newsgroup-name)))
        article)
     (while (setq article (pop articles))
       (when (gnus-summary-select-article t nil nil article)
@@ -983,9 +986,8 @@ this is a reply."
         (group (or group gnus-newsgroup-name ""))
         (gcc-self-val
          (and gnus-newsgroup-name
-              (setq gcc-self-val
-                    (gnus-group-find-parameter
-                     gnus-newsgroup-name 'gcc-self))))
+              (gnus-group-find-parameter
+               gnus-newsgroup-name 'gcc-self)))
         result 
         (groups
          (cond
index 3cf9772..732a28c 100644 (file)
@@ -84,6 +84,11 @@ Some people may want to add \"unknown\" to this list."
   :type 'boolean
   :group 'picons)
 
+(defcustom gnus-picons-group-excluded-groups nil
+  "*If this regexp matches the group name, group picons will be disabled."
+  :type 'regexp
+  :group 'picons)
+
 (defcustom gnus-picons-x-face-file-name
   (format "/tmp/picon-xface.%s.xbm" (user-login-name))
   "*The name of the file in which to store the converted X-face header."
@@ -139,6 +144,10 @@ please tell me so that we can list it."
                 (string))
   :group 'picons)
 
+(defface gnus-picons-xbm-face '((t (:foreground "black" :background "white")))
+  "Face to show X face"
+  :group 'picons)
+
 ;;; Internal variables:
 
 (defvar gnus-picons-processes-alist nil
@@ -155,8 +164,7 @@ List of pairs (KEY . NAME) where KEY is (USER HOST DBS) and NAME is an URL.")
 (defvar gnus-article-annotations nil
   "List of annotations added/removed when selecting an article")
 (defvar gnus-x-face-annotations nil
-  "List of annotations added/removed when selecting an article with an
-X-Face.")
+  "List of annotations added/removed when selecting an article with an X-Face.")
 
 (defvar gnus-picons-jobs-alist nil
   "List of jobs that still need be done.
@@ -285,7 +293,7 @@ To use:  (setq gnus-article-x-face-command 'gnus-picons-display-x-face)"
       (process-send-eof process))))
 
 (defun gnus-article-display-picons ()
-  "Display faces for an author and his/her domain in gnus-picons-display-where."
+  "Display faces for an author and her domain in gnus-picons-display-where."
   (interactive)
   (let (from at-idx)
     (when (and (featurep 'xpm)
@@ -335,16 +343,20 @@ To use:  (setq gnus-article-x-face-command 'gnus-picons-display-x-face)"
   "Display icons for the group in the gnus-picons-display-where buffer."
   (interactive)
   (when (and (featurep 'xpm)
-            (or (not (fboundp 'device-type)) (equal (device-type) 'x)))
+            (or (not (fboundp 'device-type)) (equal (device-type) 'x))
+            (or (null gnus-picons-group-excluded-groups)
+                (not (string-match gnus-picons-group-excluded-groups
+                                   gnus-newsgroup-name))))
     (save-excursion
       (gnus-picons-prepare-for-annotations 'gnus-group-annotations)
       (if (null gnus-picons-piconsearch-url)
          (setq gnus-group-annotations
                (gnus-picons-display-pairs
-                (gnus-picons-lookup-pairs (reverse (message-tokenize-header
-                                                    (gnus-group-real-name gnus-newsgroup-name) 
-                                                    "."))
-                                          gnus-picons-news-directories)
+                (gnus-picons-lookup-pairs
+                 (reverse (message-tokenize-header
+                           (gnus-group-real-name gnus-newsgroup-name) 
+                           "."))
+                 gnus-picons-news-directories)
                 t "."))
        (push (list 'gnus-group-annotations 'search nil
                    (message-tokenize-header 
@@ -418,27 +430,20 @@ none, and whose CDR is the corresponding element of DOMAINS."
   "Display picons in list PAIRS."
   (let ((domain-p (and gnus-picons-display-as-address dot-p))
        pair picons)
-    (if (and bar-p domain-p right-p)
-       (setq picons (gnus-picons-display-glyph
-                     (gnus-picons-try-face gnus-xmas-glyph-directory
-                                           "bar.")
-                     nil right-p)))
-    (while pairs
-      (setq pair (pop pairs)
-           picons (nconc picons
-                         (gnus-picons-display-picon-or-name (car pair)
-                                                            (cadr pair)
-                                                            right-p)
+    (when (and bar-p domain-p right-p)
+      (setq picons (gnus-picons-display-glyph
+                   (let ((gnus-picons-file-suffixes '("xbm")))
+                     (gnus-picons-try-face
+                      gnus-xmas-glyph-directory "bar."))
+                   nil right-p)))
+    (while (setq pair (pop pairs))
+      (setq picons (nconc picons
+                         (gnus-picons-display-picon-or-name
+                          (car pair) (cadr pair) right-p)
                          (if (and domain-p pairs)
                              (list (gnus-picons-make-annotation
                                     (vector 'string :data dot-p)
                                     nil 'text nil nil nil right-p))))))
-    (if (and bar-p domain-p (not right-p))
-       (setq picons (nconc picons
-                           (gnus-picons-display-glyph
-                            (gnus-picons-try-face gnus-xmas-glyph-directory
-                                                  "bar.")
-                            nil right-p))))
     picons))
 
 (defun gnus-picons-try-face (dir &optional filebase)
@@ -447,21 +452,24 @@ none, and whose CDR is the corresponding element of DOMAINS."
         (key (concat dir filebase))
         (glyph (cdr (assoc key gnus-picons-glyph-alist)))
         (suffixes gnus-picons-file-suffixes)
-        f)
-    (while (and suffixes (null glyph))
-      (when (file-exists-p (setq f (expand-file-name (concat filebase
-                                                                (pop suffixes))
-                                                        dir)))
-       (setq glyph (make-glyph f))
+        f suf)
+    (while (setq suf (pop suffixes))
+      (when (file-exists-p (setq f (expand-file-name
+                                   (concat filebase suf)
+                                   dir)))
+       (setq suffixes nil
+             glyph (make-glyph f))
+       (when (equal suf "xbm")
+         (set-glyph-face glyph 'gnus-picons-xbm-face))
        (push (cons key glyph) gnus-picons-glyph-alist)))
     glyph))
 
 (defun gnus-picons-display-glyph (glyph &optional part rightp)
-  (let ((new (gnus-picons-make-annotation glyph (point)
-                                         'text nil nil nil rightp)))
+  (let ((new (gnus-picons-make-annotation
+             glyph (point) 'text nil nil nil rightp)))
     (when (and part gnus-picons-display-as-address)
-      (set-annotation-data new (cons new
-                                    (make-glyph (vector 'string :data part))))
+      (set-annotation-data
+       new (cons new (make-glyph (vector 'string :data part))))
       (set-annotation-action new 'gnus-picons-action-toggle))
     (nconc
      (list new)
@@ -721,8 +729,10 @@ none, and whose CDR is the corresponding element of DOMAINS."
                                                         (pop job)))
                  ((eq 'bar tag)
                   (gnus-picons-network-display-internal
-                   sym-ann (gnus-picons-try-face gnus-xmas-glyph-directory
-                                                 "bar.")
+                   sym-ann
+                   (let ((gnus-picons-file-suffixes '("xbm")))
+                     (gnus-picons-try-face
+                      gnus-xmas-glyph-directory "bar."))
                    nil (pop job)))
                  ((eq 'search tag);; (SYM-ANN 'search USER ADDRS DBS RIGHT-P)
                   (gnus-picons-network-search
index 36692c7..5888d1a 100644 (file)
@@ -2077,6 +2077,7 @@ SCORE is the score to add."
       (set-buffer gnus-summary-buffer)
       (gnus-score-load-file
        (or gnus-newsgroup-adaptive-score-file
+          (gnus-home-score-file gnus-newsgroup-name t)
           (gnus-score-file-name
            gnus-newsgroup-name gnus-adaptive-file-suffix))))
     ;; Perform ordinary line scoring.
index dd6591f..dcaa169 100644 (file)
@@ -1206,6 +1206,7 @@ increase the score of each group you read."
     "I" gnus-summary-increase-score
     "L" gnus-summary-lower-score
     "\M-i" gnus-symbolic-argument
+    "h" gnus-summary-select-article-buffer
     
     "V" gnus-summary-score-map
     "X" gnus-uu-extract-map
@@ -1343,7 +1344,8 @@ increase the score of each group you read."
     "t" gnus-article-hide-headers
     "v" gnus-summary-verbose-headers
     "m" gnus-summary-toggle-mime
-    "h" gnus-article-treat-html)
+    "h" gnus-article-treat-html
+    "d" gnus-article-treat-dumbquotes)
 
   (gnus-define-keys (gnus-summary-wash-hide-map "W" gnus-summary-wash-map)
     "a" gnus-article-hide
@@ -1579,6 +1581,7 @@ increase the score of each group you read."
         ["All of the above" gnus-article-strip-blank-lines t]
         ["Leading space" gnus-article-strip-leading-space t])
        ["Overstrike" gnus-article-treat-overstrike t]
+       ["Dumb quotes" gnus-article-treat-dumbquotes t]
        ["Emphasis" gnus-article-emphasize t]
        ["Word wrap" gnus-article-fill-cited-article t]
        ["CR" gnus-article-remove-cr t]
@@ -1636,6 +1639,7 @@ increase the score of each group you read."
        ("Cache"
        ["Enter article" gnus-cache-enter-article t]
        ["Remove article" gnus-cache-remove-article t])
+       ["Select article buffer" gnus-summary-select-article-buffer t]
        ["Enter digest buffer" gnus-summary-enter-digest-group t]
        ["Isearch article..." gnus-summary-isearch-article t]
        ["Beginning of the article" gnus-summary-beginning-of-article t]
@@ -4898,6 +4902,14 @@ displayed, no centering will be performed."
 
 ;; Various summary commands
 
+(defun gnus-summary-select-article-buffer ()
+  "Reconfigure windows to show article buffer."
+  (interactive)
+  (if (not (gnus-buffer-live-p gnus-article-buffer))
+      (error "There is no article buffer for this summary buffer")
+    (gnus-configure-windows 'article)
+    (select-window (get-buffer-window gnus-article-buffer))))
+
 (defun gnus-summary-universal-argument (arg)
   "Perform any operation on all articles that are process/prefixed."
   (interactive "P")
index b802979..379471f 100644 (file)
@@ -626,7 +626,7 @@ articles in the topic and its subtopics."
     (when parent
       (forward-line -1)
       (gnus-topic-update-topic-line
-       parent (- old-unread (gnus-group-topic-unread))))
+       parent (- (or old-unread 0) (or (gnus-group-topic-unread) 0))))
     unread))
 
 (defun gnus-topic-group-indentation ()
@@ -733,55 +733,59 @@ articles in the topic and its subtopics."
   "Run when changing levels to enter/remove groups from topics."
   (save-excursion
     (set-buffer gnus-group-buffer)
-    (gnus-group-goto-group (or (car (nth 2 previous)) group))
-    (when (and gnus-topic-mode
-              gnus-topic-alist
-              (not gnus-topic-inhibit-change-level))
-      ;; Remove the group from the topics.
-      (when (and (< oldlevel gnus-level-zombie)
+    (unless gnus-topic-inhibit-change-level
+      (gnus-group-goto-group (or (car (nth 2 previous)) group))
+      (when (and gnus-topic-mode
+                gnus-topic-alist
+                (not gnus-topic-inhibit-change-level))
+       ;; Remove the group from the topics.
+       (if (and (< oldlevel gnus-level-zombie)
                 (>= level gnus-level-zombie))
-       (let (alist)
-         (forward-line -1)
-         (when (setq alist (assoc (gnus-current-topic) gnus-topic-alist))
-           (setcdr alist (gnus-delete-first group (cdr alist))))))
-      ;; If the group is subscribed we enter it into the topics.
-      (when (and (< level gnus-level-zombie)
-                (>= oldlevel gnus-level-zombie))
-       (let* ((prev (gnus-group-group-name))
-              (gnus-topic-inhibit-change-level t)
-              (gnus-group-indentation
-               (make-string
-                (* gnus-topic-indent-level
-                   (or (save-excursion
-                         (gnus-topic-goto-topic (gnus-current-topic))
-                         (gnus-group-topic-level))
-                       0))
-                ? ))
-              (yanked (list group))
-              alist talist end)
-         ;; Then we enter the yanked groups into the topics they belong
-         ;; to.
-         (when (setq alist (assoc (save-excursion
-                                    (forward-line -1)
-                                    (or
-                                     (gnus-current-topic)
-                                     (caar gnus-topic-topology)))
-                                  gnus-topic-alist))
-           (setq talist alist)
-           (when (stringp yanked)
-             (setq yanked (list yanked)))
-           (if (not prev)
-               (nconc alist yanked)
-             (if (not (cdr alist))
-                 (setcdr alist (nconc yanked (cdr alist)))
-               (while (and (not end) (cdr alist))
-                 (when (equal (cadr alist) prev)
-                   (setcdr alist (nconc yanked (cdr alist)))
-                   (setq end t))
-                 (setq alist (cdr alist)))
-               (unless end
-                 (nconc talist yanked))))))
-       (gnus-topic-update-topic)))))
+           (let ((alist gnus-topic-alist))
+             (while (gnus-group-goto-group group)
+               (gnus-delete-line))
+             (while alist
+               (when (member group (car alist))
+                 (setcdr (car alist) (delete group (cdar alist))))
+               (pop alist)))
+         ;; If the group is subscribed we enter it into the topics.
+         (when (and (< level gnus-level-zombie)
+                    (>= oldlevel gnus-level-zombie))
+           (let* ((prev (gnus-group-group-name))
+                  (gnus-topic-inhibit-change-level t)
+                  (gnus-group-indentation
+                   (make-string
+                    (* gnus-topic-indent-level
+                       (or (save-excursion
+                             (gnus-topic-goto-topic (gnus-current-topic))
+                             (gnus-group-topic-level))
+                           0))
+                    ? ))
+                  (yanked (list group))
+                  alist talist end)
+             ;; Then we enter the yanked groups into the topics they belong
+             ;; to.
+             (when (setq alist (assoc (save-excursion
+                                        (forward-line -1)
+                                        (or
+                                         (gnus-current-topic)
+                                         (caar gnus-topic-topology)))
+                                      gnus-topic-alist))
+               (setq talist alist)
+               (when (stringp yanked)
+                 (setq yanked (list yanked)))
+               (if (not prev)
+                   (nconc alist yanked)
+                 (if (not (cdr alist))
+                     (setcdr alist (nconc yanked (cdr alist)))
+                   (while (and (not end) (cdr alist))
+                     (when (equal (cadr alist) prev)
+                       (setcdr alist (nconc yanked (cdr alist)))
+                       (setq end t))
+                     (setq alist (cdr alist)))
+                   (unless end
+                     (nconc talist yanked))))))
+           (gnus-topic-update-topic)))))))
 
 (defun gnus-topic-goto-next-group (group props)
   "Go to group or the next group after group."
index cacbd7d..d27aec0 100644 (file)
@@ -244,7 +244,7 @@ is restarted, and sometimes reloaded."
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "0.12"
+(defconst gnus-version-number "0.13"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Quassia Gnus v%s" gnus-version-number)
index c463dfb..a713ff8 100644 (file)
                     set-face-stipple mail-abbrevs-setup char-int
                     make-char-table set-char-table-range font-create-object
                     x-color-values widget-make-intangible error-message-string
-                    w3-form-encode-xwfu
-                    ))
+                    w3-form-encode-xwfu md5))
       (maybe-bind '(global-face-data
                    mark-active transient-mark-mode mouse-selection-click-count
                    mouse-selection-click-count-buffer buffer-display-table
                    font-lock-defaults user-full-name user-login-name
-                   gnus-newsgroup-name gnus-article-x-face-too-ugly)))
+                   gnus-newsgroup-name gnus-article-x-face-too-ugly
+                   mail-mode-hook)))
   (defvar browse-url-browser-function nil)
   (maybe-fbind '(color-instance-rgb-components
                 make-color-instance color-instance-name specifier-instance
index 09c035c..ef48290 100644 (file)
@@ -2706,7 +2706,8 @@ give as trustworthy answer as possible."
           (string-match "\\." mail-host-address))
       mail-host-address)
      ;; We try `user-mail-address' as a backup.
-     ((and (string-match "\\." user-mail)
+     ((and user-mail
+          (string-match "\\." user-mail)
           (string-match "@\\(.*\\)\\'" user-mail))
       (match-string 1 user-mail))
      ;; Default to this bogus thing.
diff --git a/lisp/nnlistserv.el b/lisp/nnlistserv.el
new file mode 100644 (file)
index 0000000..b307fd2
--- /dev/null
@@ -0,0 +1,156 @@
+;;; nnlsitserv.el --- retrieving articles via web mailing list archives
+;; Copyright (C) 1997 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+;; Keywords: news, mail
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Note: You need to have `url' and `w3' installed for this
+;; backend to work.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(push '("nnlistserv" none) gnus-valid-select-methods)
+
+(require 'nnoo)
+(require 'nnweb)
+
+(nnoo-declare nnlistserv
+  nnweb)
+
+(defvoo nnlistserv-directory (nnheader-concat gnus-directory "nnlistserv/")
+  "Where nnlistserv will save its files."
+  nnweb-directory)
+
+(defvoo nnlistserv-name 'kk
+  "What search engine type is being used."
+  nnweb-type)
+
+(defvoo nnlistserv-type-definition
+  '((kk
+     (article . nnlistserv-kk-wash-article)
+     (map . nnlistserv-kk-create-mapping)
+     (search . nnlistserv-kk-search)
+     (address . "http://www.itk.ntnu.no/ansatte/Andresen_Trond/kk-f/%s/")
+     (pages "fra160396" "fra160796" "fra061196" "fra160197"
+           "fra090997" "fra040797" "fra130397" "nye")
+     (index . "date.html")
+     (identifier . nnlistserv-kk-identity)))
+  "Type-definition alist."
+  nnweb-type-definition)
+
+(defvoo nnlistserv-search nil
+  "Search string to feed to DejaNews."
+  nnweb-search)
+
+(defvoo nnlistserv-ephemeral-p nil
+  "Whether this nnlistserv server is ephemeral."
+  nnweb-ephemeral-p)
+
+;;; Internal variables
+
+;;; Interface functions
+
+(nnoo-define-basics nnlistserv)
+
+(nnoo-import nnlistserv
+  (nnweb))
+
+;;; Internal functions
+
+;;;
+;;; KK functions.
+;;;
+
+(defun nnlistserv-kk-create-mapping ()
+  "Perform the search and create an number-to-url alist."
+  (save-excursion
+    (set-buffer nnweb-buffer)
+    (let ((case-fold-search t)
+         (active (or (cadr (assoc nnweb-group nnweb-group-alist))
+                     (cons 1 0)))
+         (pages (nnweb-definition 'pages))
+         map url page subject from )
+      (while (setq page (pop pages))
+       (erase-buffer)
+       (when (funcall (nnweb-definition 'search) page)
+         ;; Go through all the article hits on this page.
+         (goto-char (point-min))
+         (nnweb-decode-entities)
+         (goto-char (point-min))
+         (while (re-search-forward "^<li> *<a href=\"\\([^\"]+\\)\"><b>\\([^\\>]+\\)</b></a> *<[^>]+><i>\\([^>]+\\)<" nil t)
+           (setq url (match-string 1)
+                 subject (match-string 2)
+                 from (match-string 3))
+           (setq url (concat (format (nnweb-definition 'address) page) url))
+           (unless (nnweb-get-hashtb url)
+             (push
+              (list
+               (incf (cdr active))
+               (make-full-mail-header
+                (cdr active) subject from ""
+                (concat "<" (nnweb-identifier url) "@kk>")
+                nil 0 0 url))
+              map)
+             (nnweb-set-hashtb (cadar map) (car map))
+             (message "%s %s %s" (cdr active) (point) pages)
+             ))))
+      ;; Return the articles in the right order.
+      (setq nnweb-articles
+           (sort (nconc nnweb-articles map) 'car-less-than-car)))))
+
+(defun nnlistserv-kk-wash-article ()
+  (let ((case-fold-search t)
+       (headers '(sent name email subject id))
+       sent name email subject id)
+    (nnweb-decode-entities)
+    (while headers
+      (goto-char (point-min))
+      (re-search-forward (format "<!-- %s=\"\\([^\"]+\\)" (car headers) nil t))
+      (set (pop headers) (match-string 1)))
+    (goto-char (point-min))
+    (search-forward "<!-- body" nil t)
+    (delete-region (point-min) (progn (forward-line 1) (point)))
+    (goto-char (point-max))
+    (search-backward "<!-- body" nil t)
+    (delete-region (point-max) (progn (beginning-of-line) (point)))
+    (nnweb-remove-markup)
+    (goto-char (point-min))
+    (insert (format "From: %s <%s>\n" name email)
+           (format "Subject: %s\n" subject)
+           (format "Message-ID: %s\n" id)
+           (format "Date: %s\n\n" sent))))
+
+(defun nnlistserv-kk-search (search)
+  (url-insert-file-contents
+   (concat (format (nnweb-definition 'address) search) 
+          (nnweb-definition 'index)))
+  t)
+
+(defun nnlistserv-kk-identity (url)
+  "Return an unique identifier based on URL."
+  url)
+
+(provide 'nnlistserv)
+
+;;; nnlistserv.el ends here
index 4fde8c8..e7ed8eb 100644 (file)
@@ -1194,7 +1194,6 @@ Return the number of characters in the body."
 
 ;;; Utility functions
 
-;; Written by byer@mv.us.adobe.com (Scott Byer).
 (defun nnmail-make-complex-temp-name (prefix)
   (let ((newname (make-temp-name prefix))
        (newprefix prefix))
index 4cc1fc9..8d217f7 100644 (file)
 (defvoo nnweb-type 'dejanews
   "What search engine type is being used.")
 
-(defvar nnweb-type-definition
+(defvoo nnweb-type-definition
   '((dejanews
      (article . nnweb-dejanews-wash-article)
      (map . nnweb-dejanews-create-mapping)
      (search . nnweb-dejanews-search)
      (address . "http://xp9.dejanews.com/dnquery.xp")
      (identifier . nnweb-dejanews-identity))
+    (dejanewsold
+     (article . nnweb-dejanews-wash-article)
+     (map . nnweb-dejanews-create-mapping)
+     (search . nnweb-dejanewsold-search)
+     (address . "http://xp9.dejanews.com/dnquery.xp")
+     (identifier . nnweb-dejanews-identity))
     (reference
      (article . nnweb-reference-wash-article)
      (map . nnweb-reference-create-mapping)
      ("ageweight" . "1")))
   t)
 
+(defun nnweb-dejanewsold-search (search)
+  (nnweb-fetch-form
+   (nnweb-definition 'address)
+   `(("query" . ,search)
+     ("defaultOp" . "AND")
+     ("svcclass" . "dnold")
+     ("maxhits" . "100")
+     ("format" . "verbose")
+     ("threaded" . "0")
+     ("showsort" . "score")
+     ("agesign" . "1")
+     ("ageweight" . "1")))
+  t)
+
 (defun nnweb-dejanews-identity (url)
   "Return an unique identifier based on URL."
   (if (string-match "recnum=\\([0-9]+\\)" url)
index b76e74f..750c2b6 100644 (file)
@@ -4,7 +4,7 @@
 
 ;; Author: Richard L. Pieri <ratinox@peorth.gweep.net>
 ;; Keywords: mail, pop3
-;; Version: 1.3g
+;; Version: 1.3h
 
 ;; This file is part of GNU Emacs.
 
@@ -37,7 +37,7 @@
 (require 'mail-utils)
 (provide 'pop3)
 
-(defconst pop3-version "1.3g")
+(defconst pop3-version "1.3h")
 
 (defvar pop3-maildrop (or user-login-name (getenv "LOGNAME") (getenv "USER") nil)
   "*POP3 maildrop.")
@@ -60,9 +60,6 @@ values are 'apop.")
   "Timestamp returned when initially connected to the POP server.
 Used for APOP authentication.")
 
-(defvar pop3-movemail-file-coding-system nil
-  "Crashbox made by pop3-movemail with this coding system.")
-
 (defvar pop3-read-point nil)
 (defvar pop3-debug nil)
 
@@ -72,9 +69,15 @@ Used for APOP authentication.")
   (let* ((process (pop3-open-server pop3-mailhost pop3-port))
         (crashbuf (get-buffer-create " *pop3-retr*"))
         (n 1)
-        message-count)
+        message-count
+        (pop3-password pop3-password)
+        )
     ;; for debugging only
     (if pop3-debug (switch-to-buffer (process-buffer process)))
+    ;; query for password
+    (if (and pop3-password-required (not pop3-password))
+       (setq pop3-password
+             (pop3-read-passwd (format "Password for %s: " pop3-maildrop))))
     (cond ((equal 'apop pop3-authentication-scheme)
           (pop3-apop process pop3-maildrop))
          ((equal 'pass pop3-authentication-scheme)
@@ -88,8 +91,7 @@ Used for APOP authentication.")
       (pop3-retr process n crashbuf)
       (save-excursion
        (set-buffer crashbuf)
-       (let ((coding-system-for-write pop3-movemail-file-coding-system))
-         (append-to-file (point-min) (point-max) crashbox))
+       (append-to-file (point-min) (point-max) crashbox)
        (set-buffer (process-buffer process))
        (while (> (buffer-size) 5000)
          (goto-char (point-min))
@@ -255,45 +257,19 @@ Return the response string if optional second argument is non-nil."
 
 (defun pop3-pass (process)
   "Send authentication information to the server."
-  (let ((pass pop3-password))
-    (if (and pop3-password-required (not pass))
-       (setq pass
-             (pop3-read-passwd (format "Password for %s: " pop3-maildrop))))
-    (if pass
-       (progn
-         (pop3-send-command process (format "PASS %s" pass))
-         (let ((response (pop3-read-response process t)))
-           (if (not (and response (string-match "+OK" response)))
-               (pop3-quit process)))))
-    ))
-
-(defvar pop3-md5-program "md5"
-  "*Program to encode its input in MD5.")
-
-(defun pop3-md5 (string)
-  (nnheader-temp-write nil
-    (insert string)
-    (call-process-region (point-min) (point-max)
-                        (or shell-file-name "/bin/sh")
-                        t (current-buffer) nil
-                        "-c" pop3-md5-program)
-    ;; The meaningful output is the first 32 characters.
-    ;; Don't return the newline that follows them!
-    (buffer-substring (point-min) (+ (point-min) 32))))
+  (pop3-send-command process (format "PASS %s" pop3-password))
+  (let ((response (pop3-read-response process t)))
+    (if (not (and response (string-match "+OK" response)))
+       (pop3-quit process))))
 
 (defun pop3-apop (process user)
   "Send alternate authentication information to the server."
-  (let ((pass pop3-password))
-    (if (and pop3-password-required (not pass))
-       (setq pass
-             (pop3-read-passwd (format "Password for %s: " pop3-maildrop))))
-    (if pass
-       (let ((hash (pop3-md5 (concat pop3-timestamp pass))))
-         (pop3-send-command process (format "APOP %s %s" user hash))
-         (let ((response (pop3-read-response process t)))
-           (if (not (and response (string-match "+OK" response)))
-               (pop3-quit process)))))
-    ))
+  (if (not (fboundp 'md5)) (autoload 'md5 "md5"))
+  (let ((hash (md5 (concat pop3-timestamp pop3-password))))
+    (pop3-send-command process (format "APOP %s %s" user hash))
+    (let ((response (pop3-read-response process t)))
+      (if (not (and response (string-match "+OK" response)))
+         (pop3-quit process)))))
 
 ;; TRANSACTION STATE
 
index c4608be..f304745 100644 (file)
@@ -1,3 +1,13 @@
+Mon Oct 13 00:08:06 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus.texi (Agent Commands): Addition.
+
+Sun Oct 12 16:50:23 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus.texi (Article Washing): Addition.
+       (Group Highlighting): New.
+       (Canceling and Superseding): Addition.
+
 Wed Oct  1 18:37:55 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
 
        * gnus.texi (Startup Files): Addition.
index 0a52d1c..8ebf69c 100644 (file)
@@ -1260,6 +1260,17 @@ Here's an example value for this variable that might look nice if the
 background is dark:
 
 @lisp
+(face-spec-set 'my-group-face-1 '((t (:foreground "Red" :bold t))))
+(face-spec-set 'my-group-face-2 '((t (:foreground "SeaGreen" :bold t))))
+(face-spec-set 'my-group-face-3 '((t (:foreground "SpringGreen" :bold t))))
+(face-spec-set 'my-group-face-4 '((t (:foreground "SteelBlue" :bold t))))
+(face-spec-set 'my-group-face-5 '((t (:foreground "SkyBlue" :bold t))))
+
+(setq gnus-group-highlight
+      '(((> unread 200) . my-group-face-1)
+       ((and (< level 3) (zerop unread)) . my-group-face-2)
+       ((< level 3) . my-group-face-3)
+       ((zerop unread) . my-group-face-4)
 (setq gnus-group-highlight
       `(((> unread 200) . 
          ,(custom-face-lookup "Red" nil nil t nil nil))
@@ -1271,6 +1282,7 @@ background is dark:
          ,(custom-face-lookup "SteelBlue" nil nil t nil nil))
         (t . 
          ,(custom-face-lookup "SkyBlue" nil nil t nil nil))))
+       (t . my-group-face-5)))
 @end lisp
 
 Variables that are dynamically bound when the forms are evaluated
@@ -3642,7 +3654,12 @@ Scroll to the end of the article (@code{gnus-summary-end-of-article}).
 @kindex s (Summary)
 @findex gnus-summary-isearch-article
 Perform an isearch in the article buffer
-(@code{gnus-summary-isearch-article}). 
+(@code{gnus-summary-isearch-article}).
+
+@item h
+@kindex h (Summary)
+@findex gnus-summary-select-article-buffer
+Select the article buffer (@code{gnus-summary-select-article-buffer}).
 
 @end table
 
@@ -3866,12 +3883,17 @@ Well, you can't cancel mail, but you can cancel posts.
 Find the article you wish to cancel (you can only cancel your own
 articles, so don't try any funny stuff).  Then press @kbd{C} or @kbd{S
 c} (@code{gnus-summary-cancel-article}).  Your article will be
-canceled---machines all over the world will be deleting your article. 
+canceled---machines all over the world will be deleting your article.
+This command uses the process/prefix convention (@pxref{Process/Prefix}).
 
 Be aware, however, that not all sites honor cancels, so your article may
 live on here and there, while most sites will delete the article in
 question.
 
+Gnus will use the ``current'' select method when cancelling.  If you
+want to use the standard posting method, use the @samp{a} symbolic
+prefix (@pxref{Symbolic Prefixes}).
+
 If you discover that you have made some mistakes and want to do some
 corrections, you can post a @dfn{superseding} article that will replace
 your original article.
@@ -4359,6 +4381,10 @@ subset of the articles currently in the group.  The effect most limit
 commands have is to remove a few (or many) articles from the summary
 buffer. 
 
+All limiting commands work on subsets of the articles already fetched
+from the servers.  None of these commands query the server for
+additional articles.
+
 @table @kbd
 
 @item / /
@@ -6268,6 +6294,11 @@ Toggle whether to run the article through @sc{mime} before displaying
 @findex gnus-article-treat-overstrike
 Treat overstrike (@code{gnus-article-treat-overstrike}).
 
+@item W d
+@kindex W d (Summary)
+@findex gnus-article-treat-dumbquotes
+Treat M******** sm*rtq**t*s (@code{gnus-article-treat-dumbquotes}).
+
 @item W w
 @kindex W w (Summary)
 @findex gnus-article-fill-cited-article
@@ -7674,6 +7705,8 @@ Remove the @code{Date} header if the article is less than three days
 old.
 @item long-to
 Remove the @code{To} header if it is very long.
+@item many-to
+Remove all @code{To} headers if there are more than one.
 @end table
 
 To include the four first elements, you could say something like;
@@ -7877,6 +7910,10 @@ This is the delimiter mentioned above.  By default, it is @samp{^L}
 
 @node Composing Messages
 @chapter Composing Messages
+@cindex composing messages
+@cindex messages
+@cindex mail
+@cindex sending mail
 @cindex reply
 @cindex followup
 @cindex post
@@ -8821,25 +8858,25 @@ that says how many seconds the @code{nntp} backend should wait for a
 connection before giving up.  If it is @code{nil}, which is the default,
 no timeouts are done.
 
-@item nntp-command-timeout
-@vindex nntp-command-timeout
-@cindex PPP connections
-@cindex dynamic IP addresses
-If you're running Gnus on a machine that has a dynamically assigned
-address, Gnus may become confused.  If the address of your machine
-changes after connecting to the @sc{nntp} server, Gnus will simply sit
-waiting forever for replies from the server.  To help with this
-unfortunate problem, you can set this command to a number.  Gnus will
-then, if it sits waiting for a reply from the server longer than that
-number of seconds, shut down the connection, start a new one, and resend
-the command.  This should hopefully be transparent to the user.  A
-likely number is 30 seconds.
-
-@item nntp-retry-on-break
-@vindex nntp-retry-on-break
-If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus
-hangs.  This will have much the same effect as the command timeout
-described above.
+@c @item nntp-command-timeout
+@c @vindex nntp-command-timeout
+@c @cindex PPP connections
+@c @cindex dynamic IP addresses
+@c If you're running Gnus on a machine that has a dynamically assigned
+@c address, Gnus may become confused.  If the address of your machine
+@c changes after connecting to the @sc{nntp} server, Gnus will simply sit
+@c waiting forever for replies from the server.  To help with this
+@c unfortunate problem, you can set this command to a number.  Gnus will
+@c then, if it sits waiting for a reply from the server longer than that
+@c number of seconds, shut down the connection, start a new one, and resend
+@c the command.  This should hopefully be transparent to the user.  A
+@c likely number is 30 seconds.
+@c 
+@c @item nntp-retry-on-break
+@c @vindex nntp-retry-on-break
+@c If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus
+@c hangs.  This will have much the same effect as the command timeout
+@c described above.
 
 @item nntp-server-hook
 @vindex nntp-server-hook
@@ -10730,7 +10767,8 @@ Virtual server variables:
 @item nnweb-type
 @vindex nnweb-type
 What search engine type is being used.  The currently supported types
-are @code{dejanews}, @code{altavista} and @code{reference}.
+are @code{dejanews}, @code{dejanewsold}, @code{altavista} and
+@code{reference}.
 
 @item nnweb-search
 @vindex nnweb-search
@@ -11299,6 +11337,15 @@ toggles the plugged/unplugged state of the Gnus Agent.
 * Server Agent Commands::
 @end menu
 
+You can run a complete batch fetch from the command line with the
+following incantation:
+
+@cindex gnus-agent-batch-fetch
+@example
+$ emacs -batch -l ~/.gnus.el -f gnus-agent-batch-fetch
+@end example
+
+
 
 @node Group Agent Commands
 @subsubsection Group Agent Commands
@@ -14363,6 +14410,11 @@ valid places could be @code{article}, @code{summary}, or
 buffer visible using the standard Gnus window configuration
 routines---@pxref{Windows Configuration}.
 
+@item gnus-picons-group-excluded-groups
+@vindex gnus-picons-group-excluded-groups
+Groups that are matched by this regexp won't have their group icons
+displayed. 
+
 @end table
 
 @iftex
diff --git a/todo b/todo
index 03b8904..679c6bc 100644 (file)
--- a/todo
+++ b/todo
@@ -746,3 +746,17 @@ home-brewed stuff for better reliability.
 * add a way to select which NoCeM type to apply -- spam, troll, etc.
 
 * nndraft-request-group should tally autosave files.
+
+* implement nntp-retry-on-break and nntp-command-timeout.
+
+* gnus-article-highlight-limit that says when not to highlight (long)
+articles.
+
+* (nnoo-set SERVER VARIABLE VALUE)
+
+* nn*-spool-methods
+
+* interrupitng agent fetching of articles should save articles.
+
+* command to open a digest group, and copy all the articles there to the
+current group.