*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 22:03:02 +0000 (22:03 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 22:03:02 +0000 (22:03 +0000)
19 files changed:
lisp/ChangeLog
lisp/article.el
lisp/gnus-demon.el
lisp/gnus-group.el
lisp/gnus-int.el
lisp/gnus-load.el
lisp/gnus-start.el
lisp/gnus-sum.el
lisp/gnus-topic.el
lisp/gnus-uu.el
lisp/gnus.el
lisp/message.el
lisp/nnheader.el
lisp/nnmail.el
lisp/nntp.el
texi/ChangeLog
texi/Makefile
texi/gnus.texi
texi/gnuslogo.refcard [new file with mode: 0644]

index 358051f..290bc6f 100644 (file)
@@ -1,3 +1,42 @@
+Sat Aug 31 02:54:39 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
+
+       * gnus-topic.el (gnus-topic-goto-next-group): Go to the proper
+       group when listing.
+
+       * gnus-start.el (gnus-get-killed-groups): Mark .newsrc as needing
+       saving. 
+
+       * nnmail.el (nnmail-remove-tabs): New function.
+
+Fri Aug 30 06:26:37 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus-start.el (gnus-set-default-directory): Set to directory
+       file name.
+
+       * nnmail.el (nnmail-remove-list-identifiers): New function.
+       (nnmail-list-identifiers): New variable.
+       (nnmail-prepare-incoming-message-hook): New variable.
+       (nnmail-move-inbox): Allow nnmail-movemail-program to be a
+       function. 
+
+       * article.el (article-mime-decode-quoted-printable-buffer): New
+       function.
+
+       * nnmail.el (nnmail-prepare-incoming-header-hook): New variable.
+       (nnmail-clean-whitespace-from-headers): New function.
+
+       * nntp.el (nntp-connection-alist): New variable.
+       (nntp-open-connection): Use it.
+       (nntp-request-close): New function.
+
+       * gnus-demon.el (timer): Required.
+
+       * message.el (message-reply): Bugged out on wide replies.
+
+Fri Aug 30 03:51:39 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
+
+       * gnus.el: Red Gnus v0.20 is released.
+
 Fri Aug 30 01:36:10 1996  Lars Magne Ingebrigtsen  <larsi@hrym.ifi.uio.no>
 
        * gnus-msg.el (gnus-inews-insert-archive-gcc): Use
index e6c23d6..680e80a 100644 (file)
@@ -458,6 +458,10 @@ or not."
        (search-forward "\n\n" nil 'move)
        (article-mime-decode-quoted-printable (point) (point-max))))))
 
+(defun article-mime-decode-quoted-printable-buffer ()
+  "Decode Quoted-Printable in the current buffer."
+  (article-mime-decode-quoted-printable (point-min) (point-max)))
+  
 (defun article-mime-decode-quoted-printable (from to)
   "Decode Quoted-Printable in the region between FROM and TO."
   (interactive "r")
index ffb9fe4..3f54b57 100644 (file)
@@ -29,6 +29,7 @@
 (require 'gnus-int)
 (require 'nnheader)
 (require 'gnus)
+(require 'timer)
 
 (defvar gnus-demon-handlers nil
   "Alist of daemonic handlers to be run at intervals.
index 79e2dda..33c0206 100644 (file)
@@ -308,7 +308,6 @@ variable.")
     "V" gnus-version
     "s" gnus-group-save-newsrc
     "z" gnus-group-suspend
-                                       ;    "Z" gnus-group-clear-dribble
     "q" gnus-group-exit
     "Q" gnus-group-quit
     "?" gnus-group-describe-briefly
index 8953df2..50d92ee 100644 (file)
@@ -390,12 +390,11 @@ If GROUP is nil, all groups on METHOD are scanned."
 (defun gnus-close-backends ()
   ;; Send a close request to all backends that support such a request.
   (let ((methods gnus-valid-select-methods)
-       func)
-    (while methods
-      (if (fboundp (setq func (intern (concat (caar methods)
-                                             "-request-close"))))
-         (funcall func))
-      (setq methods (cdr methods)))))
+       func method)
+    (while (setq method (pop methods))
+      (when (fboundp (setq func (intern
+                                (concat (car method) "-request-close"))))
+       (funcall func)))))
 
 (defun gnus-asynchronous-p (method)
   (let ((func (gnus-get-function method 'asynchronous-p t)))
index d598bce..66b5cdf 100644 (file)
@@ -696,6 +696,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
       gnus-dup-unsuppress-article)
      ("gnus-async" gnus-async-request-fetched-article gnus-async-prefetch-next
       gnus-async-prefetch-article gnus-async-prefetch-remove-group)
+     ("article" article-decode-rfc1522)
      ("gnus-vm" :interactive t gnus-summary-save-in-vm
       gnus-summary-save-article-vm))))
 
index df7e74c..bca15c5 100644 (file)
@@ -1421,7 +1421,8 @@ newsgroup."
             (setq gnus-killed-list
                   (cons group gnus-killed-list))
             (gnus-sethash group group gnus-killed-hashtb))))))
-   gnus-active-hashtb))
+   gnus-active-hashtb)
+  (gnus-dribble-enter ""))
 
 ;; Get the active file(s) from the backend(s).
 (defun gnus-read-active-file ()
@@ -2332,7 +2333,7 @@ If this variable is nil, don't do anything."
   (setq default-directory 
        (if (and gnus-default-directory
                 (file-exists-p gnus-default-directory))
-           (expand-file-name gnus-default-directory)
+           (file-name-as-directory (expand-file-name gnus-default-directory))
          default-directory)))
 
 (provide 'gnus-start)
index 53c7cac..3f841a1 100644 (file)
@@ -3671,6 +3671,8 @@ The resulting hash table is returned, or nil if no Xrefs were found."
        headers id id-dep ref-dep end ref)
     (save-excursion
       (set-buffer nntp-server-buffer)
+      ;; Translate all TAB characters into SPACE characters.
+      (subst-char-in-region (point-min) (point-max) ?\t ?  t)
       (run-hooks 'gnus-parse-headers-hook)
       (let ((case-fold-search t)
            in-reply-to header p lines)
index 3e9c841..53992e7 100644 (file)
@@ -721,7 +721,7 @@ articles in the topic and its subtopics."
     (if (gnus-group-goto-group group)
        t
       ;; The group is no longer visible.
-      (let* ((list (assoc (gnus-current-topic) gnus-topic-alist))
+      (let* ((list (assoc (gnus-group-topic group) gnus-topic-alist))
             (after (cdr (member group (cdr list)))))
        ;; First try to put point on a group after the current one.
        (while (and after
@@ -975,19 +975,23 @@ If COPYP, copy the groups instead."
         (completing-read "Move to topic: " gnus-topic-alist nil t)))
   (let ((groups (gnus-group-process-prefix n))
        (topicl (assoc topic gnus-topic-alist))
+       (start-group (progn (forward-line 1) (gnus-group-group-name)))
+       (start-topic (gnus-group-topic-name))
        entry)
-    (mapcar (lambda (g) 
-             (gnus-group-remove-mark g)
-             (when (and
-                    (setq entry (assoc (gnus-current-topic)
-                                       gnus-topic-alist))
-                    (not copyp))
-               (setcdr entry (gnus-delete-first g (cdr entry))))
-             (nconc topicl (list g)))
-           groups)
-    (gnus-group-position-point))
-  (gnus-topic-enter-dribble)
-  (gnus-group-list-groups))
+    (mapcar 
+     (lambda (g) 
+       (gnus-group-remove-mark g)
+       (when (and
+             (setq entry (assoc (gnus-current-topic) gnus-topic-alist))
+             (not copyp))
+        (setcdr entry (gnus-delete-first g (cdr entry))))
+       (nconc topicl (list g)))
+     groups)
+    (gnus-topic-enter-dribble)
+    (if start-group
+       (gnus-group-goto-group start-group)
+      (gnus-topic-goto-topic start-topic))
+    (gnus-group-list-groups)))
 
 (defun gnus-topic-remove-group ()
   "Remove the current group from the topic."
index 48152f8..1015e85 100644 (file)
@@ -1392,7 +1392,9 @@ The headers will be included in the sequence they are matched.")
        (call-process-region 
         start-char (point-max) shell-file-name nil 
         (get-buffer-create gnus-uu-output-buffer-name) nil 
-        shell-command-switch (concat "cd " gnus-uu-work-dir " ; sh"))))
+        shell-command-switch 
+        (concat "cd " gnus-uu-work-dir " " 
+                gnus-shell-command-separator  " sh"))))
     state))
 
 ;; Returns the name of what the shar file is going to unpack.
index 605b7df..f7a18db 100644 (file)
@@ -28,7 +28,7 @@
 
 (eval '(run-hooks 'gnus-load-hook))
 
-(defconst gnus-version-number "0.20"
+(defconst gnus-version-number "0.21"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
index 636dca4..63e37b5 100644 (file)
@@ -2594,8 +2594,8 @@ Headers already prepared in the buffer are not modified."
            (when ccalist
              (let ((ccs (cons 'Cc (mapconcat 
                                    (lambda (addr) (cdr addr)) ccalist ", "))))
-               (when (string-match "^ +" ccs)
-                 (setq ccs (substring ccs (match-end 0))))
+               (when (string-match "^ +" (cdr ccs))
+                 (setcdr ccs (substring (cdr ccs) (match-end 0))))
              (push ccs follow-to))))))
       (widen))
 
index 531320b..3040e71 100644 (file)
@@ -52,7 +52,8 @@ on your system, you could say something like:
 (eval-and-compile
  (autoload 'nnmail-message-id "nnmail")
  (autoload 'mail-position-on-field "sendmail")
- (autoload 'message-remove-header "message"))
+ (autoload 'message-remove-header "message")
+ (autoload 'cancel-function-timers "timers"))
 
 ;;; Header access macros.
 
index 92dcb79..8d6c342 100644 (file)
@@ -138,7 +138,11 @@ links, you could set this variable to `copy-file' instead.")
 
 (defvar nnmail-movemail-program "movemail"
   "*A command to be executed to move mail from the inbox.
-The default is \"movemail\".")
+The default is \"movemail\".
+
+This can also be a function.  In that case, the function will be
+called with two parameters -- the name of the INBOX file, and the file
+to be moved to.")
 
 (defvar nnmail-pop-password-required nil
   "*Non-nil if a password is required when reading mail using POP.")
@@ -178,6 +182,18 @@ If you use `display-time', you could use something like this:
   "*Hook called before treating incoming mail.
 The hook is run in a buffer with all the new, incoming mail.")
 
+(defvar nnmail-prepare-incoming-header-hook nil
+  "*Hook called narrowed to the headers of each message.
+This can be used to remove excessive spaces (and stuff like
+that) from the headers before splitting and saving the messages.")
+
+(defvar nnmail-prepare-incoming-message-hook nil
+  "*Hook called narrowed to each message.")
+
+(defvar nnmail-list-identifiers nil
+  "Regexp that match list identifiers to be removed.
+This can also be a list of regexps.")
+
 (defvar nnmail-pre-get-new-mail-hook nil
   "Hook called just before starting to handle new incoming mail.")
 
@@ -429,14 +445,16 @@ parameter.  It should return nil, `warn' or `delete'.")
              (setq errors (generate-new-buffer " *nnmail loss*"))
              (buffer-disable-undo errors)
              (let ((default-directory "/"))
-               (apply 
-                'call-process
-                (append
-                 (list
-                  (expand-file-name nnmail-movemail-program exec-directory)
-                  nil errors nil inbox tofile)
-                 (when nnmail-internal-password
-                   (list nnmail-internal-password)))))
+               (if (nnheader-functionp nnmail-movemail-program)
+                   (funcall nnmail-movemail-program inbox tofile)
+                 (apply 
+                  'call-process
+                  (append
+                   (list
+                    (expand-file-name nnmail-movemail-program exec-directory)
+                    nil errors nil inbox tofile)
+                   (when nnmail-internal-password
+                     (list nnmail-internal-password))))))
              (if (not (buffer-modified-p errors))
                  ;; No output => movemail won
                  (progn
@@ -538,11 +556,16 @@ is a spool.  If not using procmail, return GROUP."
        "\f\n0, *unseen,+\n\\(\\*\\*\\* EOOH \\*\\*\\*\n\\)?" nil t)
       (goto-char (match-end 0))
       (delete-region (match-beginning 0) (match-end 0))
-      (setq start (point))
-      ;; Skip all the headers in case there are more "From "s...
-      (or (search-forward "\n\n" nil t)
-         (search-forward-regexp "^[^:]*\\( .*\\|\\)$" nil t)
-         (search-forward "\1f\f"))
+      (narrow-to-region
+       (setq start (point))
+       (progn
+        ;; Skip all the headers in case there are more "From "s...
+        (or (search-forward "\n\n" nil t)
+            (search-forward-regexp "^[^:]*\\( .*\\|\\)$" nil t)
+            (search-forward "\1f\f"))
+        (point)))
+      (run-hooks 'nnmail-prepare-incoming-header-hook)
+      (widen)
       ;; Find the Message-ID header.
       (save-excursion
        (if (re-search-backward "^Message-ID:[ \t]*\\(<[^>]*>\\)" nil t)
@@ -580,10 +603,10 @@ is a spool.  If not using procmail, return GROUP."
          (setq do-search t)))
       ;; Go to the beginning of the next article - or to the end
       ;; of the buffer.  
-      (if do-search
-         (if (re-search-forward "^\1f" nil t)
-             (goto-char (match-beginning 0))
-           (goto-char (1- (point-max)))))
+      (when do-search
+       (if (re-search-forward "^\1f" nil t)
+           (goto-char (match-beginning 0))
+         (goto-char (1- (point-max)))))
       (delete-char 1)                  ; delete ^_
       (save-excursion
        (save-restriction
@@ -654,6 +677,7 @@ is a spool.  If not using procmail, return GROUP."
          ;; having a (possibly) faulty header.
          (beginning-of-line)
          (insert "X-"))
+       (run-hooks 'nnmail-prepare-incoming-header-hook)
        ;; Find the end of this article.
        (goto-char (point-max))
        (widen)
@@ -727,6 +751,7 @@ is a spool.  If not using procmail, return GROUP."
              (insert "Original-")))
          (forward-line 1)
          (insert "Message-ID: " (setq message-id (nnmail-message-id)) "\n"))
+       (run-hooks 'nnmail-prepare-incoming-header-hook)
        ;; Find the end of this article.
        (goto-char (point-max))
        (widen)
@@ -881,6 +906,31 @@ Return the number of characters in the body."
        (setq group-alist (cdr group-alist)))
       (insert "\n"))))
 
+;;; Message washing functions
+
+(defun nnmail-remove-leading-whitespace ()
+  "Remove excessive whitespace from all headers."
+  (goto-char (point-min))
+  (while (re-search-forward "^\\([^ :]+: \\) +" nil t)
+    (replace-match "\\1" t t)))
+
+(defun nnmail-remove-list-identifiers ()
+  "Remove list identifiers from Subject headers."
+  (let ((regexp (if (stringp nnmail-list-identifiers) nnmail-list-identifiers
+                 (mapconcat 'identity nnmail-list-identifiers "\\|"))))
+    (when regexp
+      (goto-char (point-min))
+      (when (re-search-forward
+            (concat "Subject: +\\(Re: +\\)?\\(" regexp "\\) *")
+            nil t)
+       (delete-region (match-beginning 2) (match-end 0))))))
+
+(defun nnmail-remove-tabs ()
+  "Translate TAB characters into SPACE characters."
+  (subst-char-in-region (point-min) (point-max) ?\t ?  t))
+
+;;; Utility functions
+
 ;; Written by byer@mv.us.adobe.com (Scott Byer).
 (defun nnmail-make-complex-temp-name (prefix)
   (let ((newname (make-temp-name prefix))
@@ -1088,6 +1138,7 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
       (search-backward id nil t))))
 
 (defun nnmail-check-duplication (message-id func artnum-func)
+  (run-hooks 'nnmail-prepare-incoming-message-hook)
   ;; If this is a duplicate message, then we do not save it.
   (let* ((duplication (nnmail-cache-id-exists-p message-id))
         (action (when duplication
index 7a9d5a5..95175a5 100644 (file)
@@ -150,6 +150,8 @@ server there that you can connect to. See also `nntp-open-connection-function'")
 (defvar nntp-process-start-point nil)
 (defvar nntp-inside-change-function nil)
 
+(defvar nntp-connection-list nil)
+
 (defvoo nntp-server-type nil)
 (defvoo nntp-connection-alist nil)
 (defvoo nntp-status-string "")
@@ -381,6 +383,15 @@ server there that you can connect to. See also `nntp-open-connection-function'")
        (kill-buffer (process-buffer process))))
     (nnoo-close-server 'nntp)))
 
+(deffoo nntp-request-close ()
+  (let (process)
+    (while (setq process (pop nntp-connection-list))
+      (when (memq (process-status process) '(open run))
+       (set-process-sentinel process nil)
+       (nntp-send-string process "QUIT"))
+      (when (buffer-name (process-buffer process))
+       (kill-buffer (process-buffer process))))))
+
 (deffoo nntp-request-list (&optional server)
   (nntp-possibly-change-group nil server)
   (nntp-send-command-and-decode "\r?\n\\.\r?\n" "LIST"))
@@ -562,6 +573,7 @@ It will prompt for a password."
          (prog1
              (caar (push (list process buffer nil) 
                          nntp-connection-alist))
+           (push process nntp-connection-list)
            (nntp-read-server-type)
            (run-hooks 'nntp-server-opened-hook))
        (when (buffer-name (process-buffer process))
index 2da16fc..1b1f0ae 100644 (file)
@@ -1,3 +1,12 @@
+Sat Aug 31 02:55:50 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
+
+       * gnus.texi (Washing Mail): Addition.
+
+Fri Aug 30 09:10:17 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus.texi (Washing Mail): New.
+       (Fancy Mail Splitting): Change.
+
 Fri Aug 30 00:21:59 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
 
        * gnus.texi (Foreign Groups): Change.
index f511309..44e774e 100644 (file)
@@ -20,7 +20,7 @@ dvi: gnus.texi
        $(PERL) -n -e 'if (/\@iflatex/) { $$latex=1; } if (!$$latex) { print; } if (/\@end iflatex/) { $$latex=0; }' gnus.texi > gnus.tmptexi
        $(TEXI2DVI) gnus.tmptexi
 
-refcard.dvi: refcard.tex
+refcard.dvi: refcard.tex gnuslogo.refcard gnusref.tex
        $(LATEX) refcard.tex
 
 clean:
index 76dab44..3a59266 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus
-@settitle Red Gnus 0.20 Manual
+@settitle Red Gnus 0.21 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -230,7 +230,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Red Gnus 0.20 Manual
+@title Red Gnus 0.21 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -7938,6 +7938,7 @@ course.
 * Mail and Procmail::            Reading mail groups that procmail create.
 * Incorporating Old Mail::       What about the old mail you have?
 * Expiring Mail::                Getting rid of unwanted mail.
+* Washing Mail::                 Removing gruft from the mail you get.
 * Duplicates::                   Dealing with duplicated mail.
 * Not Reading Mail::             Using mail backends for reading other files.
 * Choosing a Mail Backend::      Gnus can read a variety of mail formats.
@@ -8159,6 +8160,10 @@ it will be used instead.
 This program is executed to move mail from the user's inbox to her home
 directory.  The default is @samp{movemail}.
 
+This can also be a function.  In that case, the function will be called
+with two parameters -- the name of the inbox, and the file to be moved
+to.
+
 @item nnmail-delete-incoming
 @vindex nnmail-delete-incoming
 @cindex incoming mail files
@@ -8228,29 +8233,32 @@ This variable has the format of a @dfn{split}.  A split is a (possibly)
 recursive structure where each split may contain other splits.  Here are
 the five possible split syntaxes:
 
-@table @dfn
+@enumerate
+
+@item 
+@samp{group}: If the split is a string, that will be taken as a group name. 
 
-@item GROUP 
-If the split is a string, that will be taken as a group name. 
+@item
+@code{(FIELD VALUE SPLIT)}: If the split is a list, and the first
+element is a string, then that means that if header FIELD (a regexp)
+contains VALUE (also a regexp), then store the message as specified by
+SPLIT.
 
-@item (FIELD VALUE SPLIT)
-If the split is a list, and the first element is a string, then that
-means that if header FIELD (a regexp) contains VALUE (also a regexp),
-then store the message as specified by SPLIT.
+@item
+@code{(| SPLIT...)}: If the split is a list, and the first element is
+@code{|} (vertical bar), then process each SPLIT until one of them
+matches.  A SPLIT is said to match if it will cause the mail message to
+be stored in one or more groups.
 
-@item (| SPLIT...)
-If the split is a list, and the first element is @code{|} (vertical
-bar), then process each SPLIT until one of them matches.  A SPLIT is
-said to match if it will cause the mail message to be stored in one or
-more groups.
+@item
+@code{(& SPLIT...)}: If the split is a list, and the first element is
+@code{&}, then process all SPLITs in the list.
 
-@item (& SPLIT...)
-If the split is a list, and the first element is @code{&}, then process
-all SPLITs in the list.
+@item 
+@code{junk}: If the split is the symbol @code{junk}, then don't save
+this message anywhere.
 
-@item junk
-Junk this article.
-@end table
+@end enumerate
 
 In these splits, FIELD must match a complete field name.  VALUE must
 match a complete word according to the fundamental mode syntax table.
@@ -8478,6 +8486,90 @@ wrong group and all your important mail has disappeared.  Be a
 with!  So there!
 
 
+@node Washing Mail
+@subsection Washing Mail
+@cindex mail washing
+@cindex list server brain damage
+@cindex incoming mail treatment
+
+Mailers and list servers are notorious for doing all sorts of really,
+really stupid things with mail.  ``Hey, RFC822 doesn't explicitly
+prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the
+end of all lines passing through our server, so let's do that!!!!1!''
+Yes, but RFC822 wasn't designed to be read by morons.  Things that were
+considered to be self-evident were not discussed.  So.  Here we are.
+
+Case in point:  The German version of Microsoft Exchange adds @samp{AW:
+} to the subjects of replies instead of @samp{Re: }.  I could pretend to
+be shocked and dismayed by this, but I haven't got the energy.  It is to
+laugh.
+
+Gnus provides a plethora of functions for washing articles while
+displaying them, but it might be nicer to do the filtering before
+storing the mail to disc.  For that purpose, we have three hooks and
+various functions that can be put in these hooks.
+
+@table @code
+@item nnmail-prepare-incoming-hook
+@vindex nnmail-prepare-incoming-hook
+This hook is called before doing anything with the mail and is meant for
+grand, sweeping gestures.  Functions to be used include:
+
+@table @code
+@item nnheader-ms-strip-cr
+@findex nnheader-ms-strip-cr
+Remove trailing carriage returns from each line.  This is default on
+Emacs running on MS machines.
+
+@end table
+
+@item nnmail-prepare-incoming-header-hook
+@vindex nnmail-prepare-incoming-header-hook
+This hook is called narrowed to each header.  It can be used when
+cleaning up the headers.  Functions that can be used include:
+
+@table @code
+@item nnmail-remove-leading-whitespace
+@findex nnmail-remove-leading-whitespace
+Clear leading white space that ``helpful'' listservs have added to the
+headers too make them look nice.  Aaah.  
+
+@item nnmail-remove-list-identifiers
+@findex nnmail-remove-list-identifiers
+Some list servers add an identifier---for example, @samp{(idm)}---to the
+beginning of all @code{Subject} headers.  I'm sure that's nice for
+people who use stone age mail readers.  This function will remove
+strings that match the @code{nnmail-list-identifiers} regexp, which can
+also be a list of regexp.
+
+For instance, if you want to remove the @samp{(idm)} and the
+@samp{nagnagnag} identifiers:
+
+@lisp
+(setq nnmail-list-identifiers
+      '("(idm)" "nagnagnag"))
+@end lisp
+
+@item nnmail-remove-tabs
+@findex nnmail-remove-tabs
+Translate all @samp{TAB} characters into @samp{SPACE} characters. 
+
+@end table
+
+@item nnmail-prepare-incoming-message-hook
+@vindex nnmail-prepare-incoming-message-hook
+This hook is called narrowed to each message.  Functions to be used
+include: 
+
+@table @code
+@item article-de-quoted-unreadable
+@findex article-de-quoted-unreadable
+Decode Quoted Readable encoding.
+
+@end table
+@end table
+
+
 @node Duplicates
 @subsection Duplicates
 
@@ -8488,7 +8580,7 @@ with!  So there!
 If you are a member of a couple of mailing list, you will sometime
 receive two copies of the same mail.  This can be quite annoying, so
 @code{nnmail} checks for and treats any duplicates it might find.  To do
-this, it keeps a cache of old @code{Message-ID}s -
+this, it keeps a cache of old @code{Message-ID}s---
 @code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
 default.  The approximate maximum number of @code{Message-ID}s stored
 there is controlled by the @code{nnmail-message-id-cache-length}
diff --git a/texi/gnuslogo.refcard b/texi/gnuslogo.refcard
new file mode 100644 (file)
index 0000000..aacf40e
--- /dev/null
@@ -0,0 +1,243 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%Creator: Adobe Illustrator 88(TM) format generated by CorelTRACE Version 2.0C
+%%Title:  /home/menja/c/larsi/gnus.eps
+%%BoundingBox: 0 0 924.5 907.2
+%%CreationDate: Tue Feb 20 01:51:37 1996
+%%DocumentFonts:
+%%ColorUsage: B & W
+%%TileBox: 0 0 924.5 907.2
+%%EndComments
+%%BeginProcSet:Adobe_Illustrator_1.1 0 0
+% Copyright 1992 Corel Corporation.
+
+% All rights reserved.
+.15 .15 scale
+
+/wPSMDict 150 dict def
+wPSMDict begin
+/bd {bind def} bind def
+/ld {load def} bd
+/xd {exch def} bd
+/_ null def
+/$c 0 def
+/$m 0 def
+/$y 0 def
+/$k 0 def
+/$t 1 def
+/$n _ def
+/$o 0 def
+/$C 0 def
+/$M 0 def
+/$Y 0 def
+/$K 0 def
+/$T 1 def
+/$N _ def
+/$O 0 def
+/$h false def
+/$al 0 def
+/$tr 0 def
+/$le 0 def
+/$lx 0 def
+/$ly 0 def
+/$ctm matrix currentmatrix def
+/@cp /closepath ld
+/@gs /gsave ld
+/@gr /grestore ld
+/@MN {2 copy le{pop}{exch pop}ifelse}bd
+/setcmykcolor where {pop}{/setcmykcolor{4 1 roll
+3 {3 index add 1 @MN 1 exch sub 3 1 roll} repeat
+setrgbcolor
+pop}bd}ifelse
+/@tc{dup 1 ge{pop}{4 {dup
+6 -1 roll
+mul
+exch}repeat
+pop}ifelse}bd
+/@scc{$c $m $y $k $t @tc setcmykcolor true}bd
+/@SCC{$C $M $Y $K $T @tc setcmykcolor true}bd
+/@sm{/$ctm $ctm currentmatrix def}bd
+/x {/$t xd /$n xd
+/$k xd /$y xd /$m xd /$c xd}bd
+/X {/$T xd /$N xd
+/$K xd /$Y xd /$M xd /$C xd}bd
+/g {1 exch sub 0 0 0
+4 -1 roll
+_ 1 x}bd
+/G {1 exch sub 0 0 0
+4 -1 roll
+_ 1 X}bd
+/k {_ 1 x}bd
+/K {_ 1 X}bd
+/d /setdash ld
+/i {dup 0 ne {setflat} {pop} ifelse}bd
+/j /setlinejoin ld
+/J /setlinecap ld
+/M /setmiterlimit ld
+/w /setlinewidth ld
+/O {/$o xd}bd
+/R {/$O xd}bd
+/c /curveto ld
+/C /c ld
+/l /lineto ld
+/L /l ld
+/m /moveto ld
+/n /newpath ld
+/N /newpath ld
+/F {@scc{eofill}if n} bd
+/f {@cp F}bd
+/S {@SCC{stroke}if n} bd
+/s {@cp
+S}bd
+/B {@gs F @gr
+S}bd
+/b {@cp B }bd
+/u {}bd
+/U {}bd
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+1 i
+2 J
+0 j
+4 M
+[]0 d
+
+%%Note: traced as Normal_Outline
+0 g
+259.2 78.2 m
+327.3 178.5 L
+327.8 179.0 328.3 180.0 329.7 180.4 C
+373.4 241.9 L
+388.8 263.5 L
+389.2 264.0 390.7 264.4 391.6 265.4 C
+413.7 298.0 453.6 351.8 468.0 404.6 C
+467.5 405.6 467.5 407.0 467.5 407.0 C
+442.0 367.6 411.3 319.2 379.2 279.3 C
+372.0 267.3 366.7 265.9 361.9 254.8 C
+333.1 216.0 L
+323.5 207.3 311.0 185.2 302.8 175.6 C
+298.0 165.6 293.2 164.1 288.9 154.0 C
+282.2 147.8 282.2 139.6 276.4 132.4 C
+258.2 77.7 L
+258.2 77.7 259.2 78.2 259.2 78.2 C
+f
+0 g
+470.8 211.6 m
+470.8 211.6 472.3 212.1 472.3 212.1 C
+518.8 305.2 L
+531.3 317.2 L
+537.6 314.8 539.0 300.9 548.6 301.9 C
+555.8 301.9 554.8 302.8 561.6 306.2 C
+595.2 357.1 L
+595.6 358.0 597.6 358.5 598.5 360.0 C
+615.8 398.4 650.8 450.7 657.6 483.8 C
+658.0 486.2 658.0 488.1 658.0 489.6 C
+654.2 489.1 656.1 485.2 650.4 479.5 C
+634.5 446.8 611.5 402.2 592.8 377.2 C
+588.0 370.0 581.7 365.7 577.4 358.5 C
+570.2 355.6 568.3 351.3 560.1 356.6 C
+554.8 360.0 553.9 364.8 550.0 370.0 C
+548.1 371.5 550.0 370.5 547.2 371.0 C
+541.4 365.2 L
+511.2 319.6 484.3 276.0 471.8 220.3 C
+470.8 215.5 471.3 215.5 469.4 212.1 C
+469.4 212.1 470.8 211.6 470.8 211.6 C
+f
+0 g
+731.0 292.8 m
+756.0 351.3 751.6 407.0 771.3 468.0 C
+783.3 520.8 809.7 582.2 822.2 635.0 C
+829.4 684.4 855.8 732.0 825.1 789.1 C
+811.6 797.7 799.6 805.4 784.8 802.0 C
+757.9 792.0 732.9 743.0 726.2 712.8 C
+727.6 708.4 727.2 707.0 730.0 704.6 C
+731.0 704.1 732.9 704.1 734.4 704.6 C
+737.2 709.9 L
+754.0 747.3 L
+758.8 755.0 771.8 754.0 781.9 751.2 C
+788.1 748.3 791.5 745.9 797.7 744.0 C
+831.8 680.1 800.6 611.0 784.3 542.8 C
+765.6 478.5 748.3 431.5 739.2 370.5 C
+733.9 347.5 729.1 318.7 730.0 292.8 C
+730.0 292.8 731.0 292.8 731.0 292.8 C
+f
+0 g
+434.4 462.7 m
+460.3 496.8 462.2 532.8 458.4 575.5 C
+456.4 588.0 451.2 599.0 445.4 609.1 C
+435.3 620.1 435.3 622.5 421.9 630.7 C
+411.8 619.6 398.4 604.8 391.6 586.0 C
+393.6 581.7 396.4 584.1 401.7 577.9 C
+403.2 577.4 404.6 576.9 404.6 576.9 C
+407.0 574.5 406.0 573.6 410.4 571.2 C
+414.2 564.0 418.5 558.2 424.3 545.7 C
+437.2 526.5 428.1 489.6 433.9 462.2 C
+433.9 462.2 434.4 462.7 434.4 462.7 C
+f
+0 g
+226.0 482.4 m
+281.7 485.7 311.0 531.3 357.1 565.9 C
+362.8 572.1 364.8 574.0 368.6 580.3 C
+368.6 581.7 369.1 582.7 369.6 584.6 C
+370.0 585.6 371.5 587.0 372.9 588.0 C
+381.6 606.2 L
+377.2 605.2 374.8 602.8 371.0 597.6 C
+346.0 576.4 316.8 552.0 289.9 536.1 C
+288.9 535.2 288.0 534.2 288.0 534.2 C
+273.6 528.0 263.5 527.5 247.6 530.8 C
+242.4 535.2 239.0 536.1 238.0 544.3 C
+239.5 572.1 266.8 600.0 281.2 624.9 C
+293.7 637.9 300.4 650.4 311.5 668.1 C
+312.0 669.1 313.9 669.6 314.8 671.0 C
+319.6 679.6 L
+319.6 680.1 319.6 681.6 319.2 682.0 C
+285.6 649.4 258.7 601.4 229.9 555.8 C
+216.4 529.9 205.4 511.2 210.2 491.0 C
+212.6 483.8 218.8 484.8 226.0 482.4 C
+f
+0 g
+624.9 600.4 m
+645.1 606.2 L
+676.3 622.5 694.5 658.0 710.8 698.4 C
+710.4 704.1 711.3 704.6 712.3 709.4 C
+696.9 685.9 693.6 667.6 662.4 653.7 C
+654.7 651.3 649.4 650.4 639.3 650.8 C
+633.1 654.2 625.4 659.0 621.6 670.5 C
+597.6 620.6 L
+600.9 612.4 604.3 607.2 613.4 603.8 C
+617.2 603.3 621.1 601.4 624.9 600.4 C
+f
+0 g
+528.4 619.2 m
+548.6 617.2 564.9 629.2 578.8 645.6 C
+584.1 651.8 586.5 662.8 591.8 671.0 C
+593.2 681.6 603.8 690.2 601.9 704.1 C
+598.5 705.1 599.0 698.8 594.7 694.0 C
+581.7 679.6 L
+569.7 668.6 545.7 663.8 532.8 673.9 C
+487.2 697.9 467.5 754.5 413.2 772.8 C
+393.1 778.0 387.3 771.8 367.2 760.3 C
+360.9 755.5 357.6 744.9 351.3 740.6 C
+347.0 740.6 349.9 743.5 344.6 747.3 C
+344.1 748.8 343.6 750.2 343.6 750.2 C
+322.5 770.8 L
+312.9 775.2 300.9 784.3 287.0 779.0 C
+283.6 777.1 281.7 776.1 279.3 775.2 C
+250.0 750.7 229.4 705.6 181.4 697.4 C
+165.6 705.1 160.3 715.2 150.7 733.9 C
+130.5 685.4 L
+142.5 663.3 L
+147.3 661.9 147.3 660.4 151.2 655.6 C
+160.8 650.4 169.9 649.4 182.8 655.2 C
+212.1 676.8 L
+213.1 677.7 214.0 678.7 216.0 679.2 C
+238.5 695.5 250.5 727.6 279.3 735.3 C
+296.1 727.2 312.4 715.6 326.8 695.5 C
+330.2 688.3 331.6 684.9 335.5 681.1 C
+345.1 694.5 352.8 717.6 372.9 721.9 C
+423.3 726.7 453.6 670.5 498.2 631.6 C
+510.7 624.4 517.4 621.1 528.4 619.2 C
+f
+%%Trailer
+end
+showpage