From 1866e8307d0f95ac3fa5fefaa6dba11852474ac7 Mon Sep 17 00:00:00 2001 From: Lars Magne Ingebrigtsen Date: Tue, 4 Mar 1997 22:03:02 +0000 Subject: [PATCH] *** empty log message *** --- lisp/ChangeLog | 39 +++++++ lisp/article.el | 4 + lisp/gnus-demon.el | 1 + lisp/gnus-group.el | 1 - lisp/gnus-int.el | 11 +- lisp/gnus-load.el | 1 + lisp/gnus-start.el | 5 +- lisp/gnus-sum.el | 2 + lisp/gnus-topic.el | 30 +++--- lisp/gnus-uu.el | 4 +- lisp/gnus.el | 2 +- lisp/message.el | 4 +- lisp/nnheader.el | 3 +- lisp/nnmail.el | 87 +++++++++++---- lisp/nntp.el | 12 +++ texi/ChangeLog | 9 ++ texi/Makefile | 2 +- texi/gnus.texi | 134 +++++++++++++++++++---- texi/gnuslogo.refcard | 243 ++++++++++++++++++++++++++++++++++++++++++ 19 files changed, 527 insertions(+), 67 deletions(-) create mode 100644 texi/gnuslogo.refcard diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 358051f91..290bc6fa0 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,42 @@ +Sat Aug 31 02:54:39 1996 Lars Magne Ingebrigtsen + + * 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 + + * 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 + + * gnus.el: Red Gnus v0.20 is released. + Fri Aug 30 01:36:10 1996 Lars Magne Ingebrigtsen * gnus-msg.el (gnus-inews-insert-archive-gcc): Use diff --git a/lisp/article.el b/lisp/article.el index e6c23d637..680e80a2a 100644 --- a/lisp/article.el +++ b/lisp/article.el @@ -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") diff --git a/lisp/gnus-demon.el b/lisp/gnus-demon.el index ffb9fe4d1..3f54b57c9 100644 --- a/lisp/gnus-demon.el +++ b/lisp/gnus-demon.el @@ -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. diff --git a/lisp/gnus-group.el b/lisp/gnus-group.el index 79e2ddaea..33c020603 100644 --- a/lisp/gnus-group.el +++ b/lisp/gnus-group.el @@ -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 diff --git a/lisp/gnus-int.el b/lisp/gnus-int.el index 8953df29d..50d92ee8d 100644 --- a/lisp/gnus-int.el +++ b/lisp/gnus-int.el @@ -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))) diff --git a/lisp/gnus-load.el b/lisp/gnus-load.el index d598bce06..66b5cdf4d 100644 --- a/lisp/gnus-load.el +++ b/lisp/gnus-load.el @@ -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)))) diff --git a/lisp/gnus-start.el b/lisp/gnus-start.el index df7e74c58..bca15c5de 100644 --- a/lisp/gnus-start.el +++ b/lisp/gnus-start.el @@ -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) diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index 53c7cac2b..3f841a137 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -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) diff --git a/lisp/gnus-topic.el b/lisp/gnus-topic.el index 3e9c84182..53992e766 100644 --- a/lisp/gnus-topic.el +++ b/lisp/gnus-topic.el @@ -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." diff --git a/lisp/gnus-uu.el b/lisp/gnus-uu.el index 48152f81e..1015e8575 100644 --- a/lisp/gnus-uu.el +++ b/lisp/gnus-uu.el @@ -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. diff --git a/lisp/gnus.el b/lisp/gnus.el index 605b7df1b..f7a18db69 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -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) diff --git a/lisp/message.el b/lisp/message.el index 636dca405..63e37b597 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -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)) diff --git a/lisp/nnheader.el b/lisp/nnheader.el index 531320b87..3040e7168 100644 --- a/lisp/nnheader.el +++ b/lisp/nnheader.el @@ -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. diff --git a/lisp/nnmail.el b/lisp/nnmail.el index 92dcb79a7..8d6c342e7 100644 --- a/lisp/nnmail.el +++ b/lisp/nnmail.el @@ -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." " \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 " ")) + (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 " ")) + (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 "^" nil t) - (goto-char (match-beginning 0)) - (goto-char (1- (point-max))))) + (when do-search + (if (re-search-forward "^" 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 diff --git a/lisp/nntp.el b/lisp/nntp.el index 7a9d5a540..95175a511 100644 --- a/lisp/nntp.el +++ b/lisp/nntp.el @@ -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)) diff --git a/texi/ChangeLog b/texi/ChangeLog index 2da16fc3f..1b1f0aea7 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,12 @@ +Sat Aug 31 02:55:50 1996 Lars Magne Ingebrigtsen + + * gnus.texi (Washing Mail): Addition. + +Fri Aug 30 09:10:17 1996 Lars Magne Ingebrigtsen + + * gnus.texi (Washing Mail): New. + (Fancy Mail Splitting): Change. + Fri Aug 30 00:21:59 1996 Lars Magne Ingebrigtsen * gnus.texi (Foreign Groups): Change. diff --git a/texi/Makefile b/texi/Makefile index f51130913..44e774e14 100644 --- a/texi/Makefile +++ b/texi/Makefile @@ -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: diff --git a/texi/gnus.texi b/texi/gnus.texi index 76dab443f..3a5926685 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -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 index 000000000..aacf40e77 --- /dev/null +++ b/texi/gnuslogo.refcard @@ -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 -- 2.25.1