From c3e1fa9581a5bfd59386b25a438fbb6650441f79 Mon Sep 17 00:00:00 2001 From: yamaoka Date: Tue, 6 Jul 1999 11:01:47 +0000 Subject: [PATCH] Importing Pterodactyl Gnus v0.92. --- lisp/ChangeLog | 74 +++++++++++++++++++ lisp/Makefile.in | 2 + lisp/gnus-agent.el | 5 +- lisp/gnus-art.el | 19 ++--- lisp/gnus-group.el | 3 +- lisp/gnus-mlspl.el | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++ lisp/gnus-msg.el | 3 + lisp/gnus-start.el | 2 +- lisp/gnus-sum.el | 8 +- lisp/gnus-util.el | 4 +- lisp/gnus-xmas.el | 3 +- lisp/gnus.el | 2 +- lisp/mailcap.el | 4 +- lisp/message.el | 16 +++- lisp/mm-decode.el | 122 ++++++++++++++++++++----------- lisp/mm-util.el | 12 ++- lisp/mm-view.el | 20 ++--- lisp/mml.el | 12 ++- lisp/nndoc.el | 6 ++ lisp/nndraft.el | 9 ++- lisp/nnfolder.el | 4 + lisp/nnmail.el | 105 +++++++++++++++++--------- lisp/nntp.el | 111 ++++++++++++++-------------- texi/ChangeLog | 9 +++ texi/emacs-mime.texi | 23 ++++-- texi/gnus.texi | 97 +++++++++++++++++-------- texi/message.texi | 6 +- 27 files changed, 664 insertions(+), 215 deletions(-) create mode 100644 lisp/gnus-mlspl.el diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 9ce3a5b..2633f89 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,77 @@ +Tue Jul 6 10:59:24 1999 Lars Magne Ingebrigtsen + + * gnus.el: Pterodactyl Gnus v0.92 is released. + +1999-07-06 12:30:59 Johannes Weinert + + * gnus-sum.el (gnus-summary-catchup-and-exit): Doc fix. + +1999-07-06 07:41:07 Lars Magne Ingebrigtsen + + * nntp.el (nntp-retrieve-groups): Don't do anything when not + connected. + + * gnus-start.el (gnus-active-to-gnus-format): Only save active + when plugged. + + * mm-view.el (mm-inline-message): Ignore remove-spec. + + * gnus-agent.el (gnus-agent-write-active): Check whether orig sym + is bound. + + * gnus-msg.el (gnus-summary-mail-forward): Rename From_ lines. + + * nndoc.el (nndoc-guess-type): Remove blank lines at the start. + + * nnfolder.el (nnfolder-read-folder): Remove blank lines at the + start. + + * message.el (message-fill-yanked-message): Remove `t' arg. + + * gnus-group.el (gnus-group-kill-group): Message killing of + groups. + + * mm-util.el (mm-preferred-coding-system): New function. + (mm-mime-charset): Use it. + + * mml.el (mml-generate-mime-1): Charset-encode message parts. + +1999-07-06 07:03:31 Alexandre Oliva + + * gnus-mlsplt.el: New file. + +1999-07-06 05:47:57 Lars Magne Ingebrigtsen + + * mm-decode.el (mm-inline-Media-tests): Changed from forms to + functions. + (mm-attachment-override-p): Take a handle instead of a type. + (mm-inlined-p): Ditto. + (mm-automatic-display-p): Ditto, + (mm-inlinable-p): Ditto. + + * nndraft.el (nndraft-request-expire-articles): Delete backup + files. + + * mailcap.el (mailcap-parse-mailcap): Regexp-quote stuff. + + * gnus-sum.el (gnus-summary-limit-to-extra): Typo. + +1999-07-06 05:37:46 Alexandre Oliva + + * nnmail.el (nnmail-split-it): Allow .*. + +1999-07-05 05:04:57 Lars Magne Ingebrigtsen + + * mm-decode.el (mm-inline-large-images-p): Renamed. + + * gnus-art.el (article-date-ut): Always look in the current buffer + for the Date header. + + * mml.el (mml-validate): New command. + + * mailcap.el (mailcap-possible-viewers): Revert to string-match + since we are dealing with regexps. + Sun Jul 4 06:31:01 1999 Lars Magne Ingebrigtsen * gnus.el: Pterodactyl Gnus v0.91 is released. diff --git a/lisp/Makefile.in b/lisp/Makefile.in index 108c6fa..93dd3d5 100644 --- a/lisp/Makefile.in +++ b/lisp/Makefile.in @@ -18,6 +18,8 @@ all total: warn: rm -f *.elc ; $(EMACS) $(FLAGS) --eval '(dgnushack-compile t)' 2>&1 | egrep -v "variable G|inhibit-point-motion-hooks|coding-system|temp-results|variable gnus|variable nn|scroll-in-place|deactivate-mark|filladapt-mode|byte-code-function-p|print-quoted|ps-right-header|ps-left-header|article-inhibit|print-escape|ssl-program-arguments|message-log-max" +# The "clever" rule is unsafe, since redefined macros are loaded from +# .elc files, and not the .el file. clever some: $(EMACS) $(FLAGS) -f dgnushack-compile diff --git a/lisp/gnus-agent.el b/lisp/gnus-agent.el index 57f0f59..dd15f05 100644 --- a/lisp/gnus-agent.el +++ b/lisp/gnus-agent.el @@ -561,7 +561,7 @@ the actual number of articles toggled is returned." (defun gnus-agent-write-active (file new) (let ((orig (gnus-make-hashtable (count-lines (point-min) (point-max)))) (file (gnus-agent-lib-file "active")) - elem) + elem osym) (when (file-exists-p file) (with-temp-buffer (insert-file-contents file) @@ -569,7 +569,8 @@ the actual number of articles toggled is returned." (mapatoms (lambda (sym) (when (and sym (boundp sym)) - (if (setq elem (symbol-value (intern (symbol-name sym) orig))) + (if (and (boundp (setq osym (intern (symbol-name sym) orig))) + (setq elem (symbol-value osym))) (setcdr elem (cdr (symbol-value sym))) (set (intern (symbol-name sym) orig) (symbol-value sym))))) new)) diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index ceb0e48..dfc53fc 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -571,9 +571,9 @@ displayed by the first non-nil matching CONTENT face." ("\221" "`") ("\222" "'") ("\223" "``") - ("\224" "''") + ("\224" "\"") ("\225" "*") - ("\226" "-") + ("\226" "---") ("\227" "-") ("\231" "(TM)") ("\233" ">") @@ -1791,9 +1791,6 @@ how much time has lapsed since DATE. For `lapsed', the value of should replace the \"Date:\" one, or should be added below it." (interactive (list 'ut t)) (let* ((header (or header - (mail-header-date (save-excursion - (set-buffer gnus-summary-buffer) - gnus-current-headers)) (message-fetch-field "date") "")) (tdate-regexp "^Date:[ \t]\\|^X-Sent:[ \t]") @@ -2767,7 +2764,7 @@ If ALL-HEADERS is non-nil, no headers are hidden." (mm-pipe-part data))) (defun gnus-mime-view-part () - "Interactively choose a view method for the MIME part under point." + "Interactively choose a viewing method for the MIME part under point." (interactive) (gnus-article-check-buffer) (let ((data (get-text-property (point) 'gnus-data))) @@ -2817,7 +2814,7 @@ If ALL-HEADERS is non-nil, no headers are hidden." (gnus-article-check-buffer) (let* ((handle (or handle (get-text-property (point) 'gnus-data))) (mm-user-display-methods nil) - (mm-all-images-fit t) + (mm-inline-large-images nil) (mail-parse-charset gnus-newsgroup-charset) (mail-parse-ignored-charsets (save-excursion (set-buffer gnus-summary-buffer) @@ -2832,7 +2829,7 @@ If ALL-HEADERS is non-nil, no headers are hidden." (gnus-article-check-buffer) (let* ((handle (or handle (get-text-property (point) 'gnus-data))) (mm-user-display-methods '((".*" . inline))) - (mm-all-images-fit t) + (mm-inline-large-images t) (mail-parse-charset gnus-newsgroup-charset) (mail-parse-ignored-charsets (save-excursion (set-buffer gnus-summary-buffer) @@ -3098,9 +3095,9 @@ If ALL-HEADERS is non-nil, no headers are hidden." (or (not (mm-handle-disposition handle)) (equal (car (mm-handle-disposition handle)) "inline") - (mm-attachment-override-p type))) - (mm-automatic-display-p type) - (or (mm-inlined-p type) + (mm-attachment-override-p handle))) + (mm-automatic-display-p handle) + (or (mm-inlined-p handle) (mm-automatic-external-display-p type))) (setq display t) (when (equal (car (split-string type "/")) diff --git a/lisp/gnus-group.el b/lisp/gnus-group.el index d9a7bb5..4e8f15f 100644 --- a/lisp/gnus-group.el +++ b/lisp/gnus-group.el @@ -2736,7 +2736,8 @@ of groups killed." (push (cons (car entry) (nth 2 entry)) gnus-list-of-killed-groups)) (gnus-group-change-level - (if entry entry group) gnus-level-killed (if entry nil level))) + (if entry entry group) gnus-level-killed (if entry nil level)) + (message "Killed group %s" group)) ;; If there are lots and lots of groups to be killed, we use ;; this thing instead. (let (entry) diff --git a/lisp/gnus-mlspl.el b/lisp/gnus-mlspl.el new file mode 100644 index 0000000..7582da4 --- /dev/null +++ b/lisp/gnus-mlspl.el @@ -0,0 +1,198 @@ +;;; gnus-mlsplt.el --- a group params-based mail splitting mechanism +;; Copyright (C) 1998,1999 Free Software Foundation, Inc. + +;; Author: Alexandre Oliva +;; Keywords: news, mail + +;; This program 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. + +;; This program 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 this program; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +(require 'gnus) +(require 'gnus-sum) +(require 'gnus-group) +(require 'nnmail) + +(defvar gnus-mlsplt-updated-hook nil + "Hook called just after nnmail-split-fancy is updated by +gnus-mlsplt-update") + +(defvar gnus-mlsplt-default-catch-all-group "mail.misc" + "Group used by gnus-mlsplt and +gnus-mlsplt-update as default catch-all group") + +(defun gnus-mlsplt-setup (&optional auto-update catch-all) + "Sets things up so that nnmail-split-fancy is used for mail splitting, +and defines the variable nnmail-split-fancy according with group parameters. + +if AUTO-UPDATE is non-nil (prefix argument accepted, if called interactive), +makes sure nnmail-split-fancy is re-computed before getting new mail, +by adding gnus-mlsplt-update to nnmail-pre-get-new-mail-hook." + (interactive "P") + (setq nnmail-split-methods 'nnmail-split-fancy) + (when catch-all + (setq gnus-mlsplt-default-catch-all-group catch-all)) + (gnus-mlsplt-update) + (when auto-update + (add-hook 'nnmail-pre-get-new-mail-hook 'gnus-mlsplt-update))) + +(defun gnus-mlsplt-update (&optional catch-all) + "Computes nnmail-split-fancy from group params, by calling +\(gnus-mlsplt-fancy nil nil DEFAULTGROUP)" + (interactive) + (setq nnmail-split-fancy + (gnus-mlsplt-fancy + nil nil (or catch-all gnus-mlsplt-default-catch-all-group))) + (run-hooks 'gnus-mlsplt-updated-hook) + ) + +(defun gnus-mlsplt () + "Uses information from group parameters in order to split mail. +See gnus-mlsplt-fancy for more information. + +If no group is defined as catch-all, the value of +gnus-mlsplt-default-catch-all-group is used. + +gnus-mlsplt is a valid value for nnmail-split-methods." + (let (nnmail-split-fancy) + (gnus-mlsplt-update + gnus-mlsplt-default-catch-all-group) + (nnmail-split-fancy))) + +(defun gnus-mlsplt-fancy + (&optional groups no-crosspost catch-all) + "Uses information from group parameters in order to split mail. +It can be embedded into nnmail-split-fancy lists with the SPLIT + +\(: gnus-mlsplt-fancy GROUPS NO-CROSSPOST CATCH-ALL\) + +GROUPS may be a regular expression or a list of group names, that will +be used to select candidate groups. If it is ommited or nil, all +existing groups are considered. + +if NO-CROSSPOST is ommitted or nil, a & split will be returned, +otherwise, a | split, that does not allow crossposting, will be +returned. + +if CATCH-ALL is not nil, and there is no selected group whose +split-regexp matches the empty string, nor is there a selected group +whose SPLIT-SPEC is 'catch-all, this group name will be appended to +the returned SPLIT list, as the last element in a '| SPLIT. + +For each selected group, a SPLIT is composed like this: if split-spec +is specified, this split is returned as-is (unless it is nil: in this +case, the group is ignored). Otherwise, if TO-ADDRESS, TO-LIST and/or +EXTRA-ALIASES are specified, a regexp that matches any of them is +constructed (extra-aliases may be a list). Additionally, if +SPLIT-REGEXP is specified, the regexp will be extended so that it +matches this regexp too, and if SPLIT-EXCLUDE is specified, RESTRICT +clauses will be generated. + +For example, given the following group parameters: + +nnml:mail.bar: +\((to-address . \"bar@femail.com\") + (split-regexp . \".*@femail\\\\.com\")) +nnml:mail.foo: +\((to-list . \"foo@nowhere.gov\") + (extra-aliases \"foo@localhost\" \"foo-redist@home\") + (split-exclude \"bugs-foo\" \"rambling-foo\") + (admin-address . \"foo-request@nowhere.gov\")) +nnml:mail.others: +\((split-spec . catch-all)) + +Calling (gnus-mlsplt-fancy nil nil \"mail.misc\") returns: + +\(| (& (any \"\\\\(bar@femail\\\\.com\\\\|.*@femail\\\\.com\\\\)\" + \"nnml:mail.bar\") + (any \"\\\\(foo@nowhere\\\\.gov\\\\|foo@localhost\\\\|foo-redist@home\\\\)\" + - \"bugs-foo\" - \"rambling-foo\" \"nnml:mail.foo\")) + \"nnml:mail.others\")" + (let* ((newsrc (cdr gnus-newsrc-alist)) + split) + (dolist (info newsrc) + (let ((group (gnus-info-group info)) + (params (gnus-info-params info))) + ;; For all GROUPs that match the specified GROUPS + (when (or (not groups) + (and (listp groups) + (memq group groups)) + (and (stringp groups) + (string-match groups group))) + (let ((split-spec (cdr (assoc 'split-spec params))) group-clean) + ;; Remove backend from group name + (setq group-clean (string-match ":" group)) + (setq group-clean + (if group-clean + (substring group (1+ group-clean)) + group)) + (if split-spec + (if (eq split-spec 'catch-all) + ;; Emit catch-all only when requested + (when catch-all + (setq catch-all group-clean)) + ;; Append split-spec to the main split + (push split-spec split)) + ;; Let's deduce split-spec from other params + (let ((to-address (cdr (assoc 'to-address params))) + (to-list (cdr (assoc 'to-list params))) + (extra-aliases (cdr (assoc 'extra-aliases params))) + (split-regexp (cdr (assoc 'split-regexp params))) + (split-exclude (cdr (assoc 'split-exclude params)))) + (when (or to-address to-list extra-aliases split-regexp) + ;; regexp-quote to-address, to-list and extra-aliases + ;; and add them all to split-regexp + (setq split-regexp + (concat + "\\(" + (mapconcat + 'identity + (append + (and to-address (list (regexp-quote to-address))) + (and to-list (list (regexp-quote to-list))) + (and extra-aliases + (if (listp extra-aliases) + (mapcar 'regexp-quote extra-aliases) + (list extra-aliases))) + (and split-regexp (list split-regexp))) + "\\|") + "\\)")) + ;; Now create the new SPLIT + (push (append + (list 'any split-regexp) + ;; Generate RESTRICTs for SPLIT-EXCLUDEs. + (if (listp split-exclude) + (mapcon (lambda (arg) (cons '- arg)) + split-exclude) + (list '- split-exclude)) + (list group-clean)) + split) + ;; If it matches the empty string, it is a catch-all + (when (string-match split-regexp "") + (setq catch-all nil))))))))) + ;; Add catch-all if not crossposting + (if (and catch-all no-crosspost) + (push split catch-all)) + ;; Move it to the tail, while arranging that SPLITs appear in the + ;; same order as groups. + (setq split (reverse split)) + ;; Decide whether to accept cross-postings or not. + (push (if no-crosspost '| '&) split) + ;; Even if we can cross-post, catch-all should not get + ;; cross-posts. + (if (and catch-all (not no-crosspost)) + (setq split (list '| split catch-all))) + split)) + +(provide 'gnus-mlsplt) diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index e418e67..fe632fc 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -652,6 +652,9 @@ If POST, post instead of mail." (generate-new-buffer-name " *Gnus forward*"))) (erase-buffer) (insert text) + (goto-char (point-min)) + (when (looking-at "From ") + (replace-match "X-From-Line: ") ) (run-hooks 'gnus-article-decode-hook) (message-forward post)))) diff --git a/lisp/gnus-start.el b/lisp/gnus-start.el index aa9b648..a34d7c8 100644 --- a/lisp/gnus-start.el +++ b/lisp/gnus-start.el @@ -1761,7 +1761,7 @@ newsgroup." (insert ?\\)) ;; Let the Gnus agent save the active file. - (when (and gnus-agent real-active) + (when (and gnus-agent real-active gnus-plugged) (gnus-agent-save-active method)) ;; If these are groups from a foreign select method, we insert the diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index b53eca2..ca9bc37 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -1492,7 +1492,6 @@ increase the score of each group you read." "r" gnus-summary-caesar-message "t" gnus-article-hide-headers "v" gnus-summary-verbose-headers - "h" gnus-article-treat-html "H" gnus-article-strip-headers-in-body "d" gnus-article-treat-dumbquotes) @@ -1663,7 +1662,6 @@ increase the score of each group you read." ["CR" gnus-article-remove-cr t] ["Show X-Face" gnus-article-display-x-face t] ["Quoted-Printable" gnus-article-de-quoted-unreadable t] - ["UnHTMLize" gnus-article-treat-html t] ["Rot 13" gnus-summary-caesar-message t] ["Unix pipe" gnus-summary-pipe-message t] ["Add buttons" gnus-article-add-buttons t] @@ -6198,7 +6196,7 @@ articles that are younger than AGE days." (intern (gnus-completing-read (symbol-name (car gnus-extra-headers)) - "Score extra header:" + "Limit extra header:" (mapcar (lambda (x) (cons (symbol-name x) x)) gnus-extra-headers) @@ -6751,7 +6749,7 @@ to guess what the document format is." (goto-char (point-min)) (or (search-forward "\n\n" nil t) (point))) (goto-char (point-min)) - (delete-matching-lines "^\\(Path\\):\\|^From ") + (delete-matching-lines "^Path:\\|^From ") (widen)) (unwind-protect (if (let ((gnus-newsgroup-ephemeral-charset gnus-newsgroup-charset) @@ -8334,7 +8332,7 @@ If ALL is non-nil, also mark ticked and dormant articles as read." (gnus-summary-catchup t quietly)) (defun gnus-summary-catchup-and-exit (&optional all quietly) - "Mark all articles not marked as unread in this newsgroup as read, then exit. + "Mark all unread articles in this group as read, then exit. If prefix argument ALL is non-nil, all articles are marked as read." (interactive "P") (when (gnus-summary-catchup all quietly nil 'fast) diff --git a/lisp/gnus-util.el b/lisp/gnus-util.el index 61975ef..45b2dd8 100644 --- a/lisp/gnus-util.el +++ b/lisp/gnus-util.el @@ -940,7 +940,9 @@ ARG is passed to the first function." (with-temp-file file (mapatoms (lambda (sym) - (when (and sym (boundp sym)) + (when (and sym + (boundp sym) + (symbol-value sym)) (insert (format "%s %d %d y\n" (symbol-name sym) (cdr (symbol-value sym)) (car (symbol-value sym)))))) diff --git a/lisp/gnus-xmas.el b/lisp/gnus-xmas.el index 46cb97f..5da0611 100644 --- a/lisp/gnus-xmas.el +++ b/lisp/gnus-xmas.el @@ -597,8 +597,7 @@ If it is non-nil, it must be a toolbar. The five valid values are [gnus-group-unsubscribe gnus-group-unsubscribe t "Unsubscribe group"] [gnus-group-subscribe gnus-group-subscribe t "Subscribe group"] [gnus-group-kill-group gnus-group-kill-group t "Kill group"] - [gnus-group-exit gnus-group-exit t "Exit Gnus"] - ) + [gnus-group-exit gnus-group-exit t "Exit Gnus"]) "The group buffer toolbar.") (defvar gnus-summary-toolbar diff --git a/lisp/gnus.el b/lisp/gnus.el index 1e3e7c5..113b27b 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -260,7 +260,7 @@ is restarted, and sometimes reloaded." :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) -(defconst gnus-version-number "0.91" +(defconst gnus-version-number "0.92" "Version number for this version of Gnus.") (defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number) diff --git a/lisp/mailcap.el b/lisp/mailcap.el index 2ecff33..93b50b1 100644 --- a/lisp/mailcap.el +++ b/lisp/mailcap.el @@ -376,7 +376,7 @@ If FORCE, re-parse even if already parsed." (cond ((eq ?* (or (char-after save-pos) 0)) ".*") ((= (point) save-pos) ".*") - (t (buffer-substring save-pos (point))))) + (t (regexp-quote (buffer-substring save-pos (point)))))) (skip-chars-forward "; \t\n") ;;; Got the major/minor chunks, now for the viewers/etc ;;; The first item _must_ be a viewer, according to the @@ -486,7 +486,7 @@ If FORCE, re-parse even if already parsed." (cond ((equal (car (car major)) minor) (setq exact (cons (cdr (car major)) exact))) - ((and minor (string= (car (car major)) minor)) + ((and minor (string-match (car (car major)) minor)) (setq wildcard (cons (cdr (car major)) wildcard)))) (setq major (cdr major))) (nconc (nreverse exact) (nreverse wildcard)))) diff --git a/lisp/message.el b/lisp/message.el index a359b71..7e4bbdb 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -169,7 +169,8 @@ Don't touch this variable unless you really know what you're doing. Checks include subject-cmsg multiple-headers sendsys message-id from long-lines control-chars size new-text redirected-followup signature approved sender empty empty-headers message-id from subject -shorten-followup-to existing-newsgroups buffer-file-name unchanged." +shorten-followup-to existing-newsgroups buffer-file-name unchanged +newsgroups." :group 'message-news) (defcustom message-required-news-headers @@ -1764,7 +1765,7 @@ Numeric argument means justify as well." (goto-char (point-min)) (search-forward (concat "\n" mail-header-separator "\n") nil t) (let ((fill-prefix message-yank-prefix)) - (fill-individual-paragraphs (point) (point-max) justifyp t)))) + (fill-individual-paragraphs (point) (point-max) justifyp)))) (defun message-indent-citation () "Modify text just inserted from a message to be cited. @@ -2016,6 +2017,8 @@ the user from the mailer." (car elem)))) (setq success (funcall (caddr elem) arg))))) (setq sent t))) + (unless sent + (error "No methods specified to send by")) (when (and success sent) (message-do-fcc) ;;(when (fboundp 'mail-hist-put-headers-into-history) @@ -2348,6 +2351,15 @@ to find out how to use this." (defun message-check-news-header-syntax () (and + ;; Check Newsgroups header. + (message-check 'newsgroyps + (let ((group (message-fetch-field "newsgroups"))) + (or + (and group + (not (string-match "\\`[ \t]*\\'" group))) + (ignore + (message + "The newsgroups field is empty or missing. Posting is denied."))))) ;; Check the Subject header. (message-check 'subject (let* ((case-fold-search t) diff --git a/lisp/mm-decode.el b/lisp/mm-decode.el index 856a538..d3c6b9c 100644 --- a/lisp/mm-decode.el +++ b/lisp/mm-decode.el @@ -57,32 +57,68 @@ ,disposition ,description ,cache ,id)) (defvar mm-inline-media-tests - '(("image/jpeg" mm-inline-image (mm-valid-and-fit-image-p 'jpeg handle)) - ("image/png" mm-inline-image (mm-valid-and-fit-image-p 'png handle)) - ("image/gif" mm-inline-image (mm-valid-and-fit-image-p 'gif handle)) - ("image/tiff" mm-inline-image (mm-valid-and-fit-image-p 'tiff handle)) - ("image/xbm" mm-inline-image (mm-valid-and-fit-image-p 'xbm handle)) - ("image/x-xbitmap" mm-inline-image (mm-valid-and-fit-image-p 'xbm handle)) - ("image/xpm" mm-inline-image (mm-valid-and-fit-image-p 'xpm handle)) - ("image/x-pixmap" mm-inline-image (mm-valid-and-fit-image-p 'xpm handle)) - ("image/bmp" mm-inline-image (mm-valid-and-fit-image-p 'bmp handle)) - ("text/plain" mm-inline-text t) - ("text/enriched" mm-inline-text t) - ("text/richtext" mm-inline-text t) - ("text/html" mm-inline-text (locate-library "w3")) - ("text/x-vcard" mm-inline-text (locate-library "vcard")) - ("message/delivery-status" mm-inline-text t) - ("message/rfc822" mm-inline-message t) - ("text/.*" mm-inline-text t) + '(("image/jpeg" + mm-inline-image + (lambda (handle) + (mm-valid-and-fit-image-p 'jpeg handle))) + ("image/png" + mm-inline-image + (lambda (handle) + (mm-valid-and-fit-image-p 'png handle))) + ("image/gif" + mm-inline-image + (lambda (handle) + (mm-valid-and-fit-image-p 'gif handle))) + ("image/tiff" + mm-inline-image + (lambda (handle) + (mm-valid-and-fit-image-p 'tiff handle)) ) + ("image/xbm" + mm-inline-image + (lambda (handle) + (mm-valid-and-fit-image-p 'xbm handle))) + ("image/x-xbitmap" + mm-inline-image + (lambda (handle) + (mm-valid-and-fit-image-p 'xbm handle))) + ("image/xpm" + mm-inline-image + (lambda (handle) + (mm-valid-and-fit-image-p 'xpm handle))) + ("image/x-pixmap" + mm-inline-image + (lambda (handle) + (mm-valid-and-fit-image-p 'xpm handle))) + ("image/bmp" + mm-inline-image + (lambda (handle) + (mm-valid-and-fit-image-p 'bmp handle))) + ("text/plain" mm-inline-text identity) + ("text/enriched" mm-inline-text identity) + ("text/richtext" mm-inline-text identity) + ("text/html" + mm-inline-text + (lambda (handle) + (locate-library "w3"))) + ("text/x-vcard" + mm-inline-text + (lambda (handle) + (locate-library "vcard"))) + ("message/delivery-status" mm-inline-text identity) + ("message/rfc822" mm-inline-message identity) + ("text/.*" mm-inline-text identity) ("audio/wav" mm-inline-audio - (and (or (featurep 'nas-sound) (featurep 'native-sound)) - (device-sound-enabled-p))) - ("audio/au" mm-inline-audio - (and (or (featurep 'nas-sound) (featurep 'native-sound)) - (device-sound-enabled-p))) - ("multipart/alternative" ignore t) - ("multipart/mixed" ignore t) - ("multipart/related" ignore t)) + (lambda (handle) + (and (or (featurep 'nas-sound) (featurep 'native-sound)) + (device-sound-enabled-p)))) + ("audio/au" + mm-inline-audio + (lambda (handle) + (and (or (featurep 'nas-sound) (featurep 'native-sound)) + (device-sound-enabled-p)))) + ("multipart/alternative" ignore identity) + ("multipart/mixed" ignore identity) + ("multipart/related" ignore identity)) "Alist of media types/test that say whether the media types can be displayed inline.") (defvar mm-inlined-types @@ -119,7 +155,7 @@ to: ("/tmp/")) "Where mm will store its temporary files.") -(defvar mm-all-images-fit nil +(defvar mm-inline-large-images nil "If non-nil, then all images fit in the buffer.") ;;; Internal variables. @@ -235,7 +271,7 @@ external if displayed external." (mm-remove-part handle) (let* ((type (car (mm-handle-type handle))) (method (mailcap-mime-info type))) - (if (mm-inlined-p type) + (if (mm-inlined-p handle) (progn (forward-line 1) (mm-display-inline handle) @@ -376,48 +412,52 @@ external if displayed external." (funcall function handle) (goto-char (point-min)))) -(defun mm-inlinable-p (type) - "Say whether TYPE can be displayed inline." +(defun mm-inlinable-p (handle) + "Say whether HANDLE can be displayed inline." (let ((alist mm-inline-media-tests) + (type (car (mm-handle-type handle))) test) (while alist (when (equal type (caar alist)) (setq test (caddar alist) alist nil) - (setq test (eval test))) + (setq test (funcall test handle))) (pop alist)) test)) -(defun mm-automatic-display-p (type) - "Say whether the user wants TYPE to be displayed automatically." +(defun mm-automatic-display-p (handle) + "Say whether the user wants HANDLE to be displayed automatically." (let ((methods mm-automatic-display) + (type (car (mm-handle-type handle))) method result) (while (setq method (pop methods)) (when (and (string-match method type) - (mm-inlinable-p type)) + (mm-inlinable-p handle)) (setq result t methods nil))) result)) -(defun mm-inlined-p (type) - "Say whether the user wants TYPE to be displayed automatically." +(defun mm-inlined-p (handle) + "Say whether the user wants HANDLE to be displayed automatically." (let ((methods mm-inlined-types) + (type (car (mm-handle-type handle))) method result) (while (setq method (pop methods)) (when (and (string-match method type) - (mm-inlinable-p type)) + (mm-inlinable-p handle)) (setq result t methods nil))) result)) -(defun mm-attachment-override-p (type) - "Say whether TYPE should have attachment behavior overridden." +(defun mm-attachment-override-p (handle) + "Say whether HANDLE should have attachment behavior overridden." (let ((types mm-attachment-override-types) + (type (car (mm-handle-type handle))) ty) (catch 'found (while (setq ty (pop types)) (when (and (string-match ty type) - (mm-inlinable-p type)) + (mm-inlinable-p handle)) (throw 'found t)))))) (defun mm-automatic-external-display-p (type) @@ -548,7 +588,7 @@ external if displayed external." (car (mm-handle-type (car h))))) (setq handle (car h)) (when (and (equal p type) - (mm-automatic-display-p type) + (mm-automatic-display-p (car h)) (or (stringp (caar h)) (not (mm-handle-disposition (car h))) (equal (car (mm-handle-disposition (car h))) @@ -615,7 +655,7 @@ external if displayed external." (defun mm-image-fit-p (handle) "Say whether the image in HANDLE will fit the current window." (let ((image (mm-get-image handle))) - (or mm-all-images-fit + (or mm-inline-large-images (and (< (glyph-width image) (window-pixel-width)) (< (glyph-height image) (window-pixel-height)))))) diff --git a/lisp/mm-util.el b/lisp/mm-util.el index 774e3b0..161d2ca 100644 --- a/lisp/mm-util.el +++ b/lisp/mm-util.el @@ -182,18 +182,22 @@ used as the line break code type of the coding system." (when (fboundp 'set-buffer-multibyte) (set-buffer-multibyte nil))) +(defun mm-preferred-coding-system (charset) + ;; A typo in some Emacs versions. + (or (get-charset-property charset 'prefered-coding-system) + (get-charset-property charset 'preffered-coding-system))) + (defun mm-mime-charset (charset) "Return the MIME charset corresponding to the MULE CHARSET." (if (fboundp 'coding-system-get) ;; This exists in Emacs 20. (or - (and (get-charset-property charset 'prefered-coding-system) + (and (mm-preferred-coding-system charset) (coding-system-get - (get-charset-property charset 'prefered-coding-system) - 'mime-charset)) + (mm-preferred-coding-system charset) 'mime-charset)) (and (eq charset 'ascii) 'us-ascii) - (get-charset-property charset 'prefered-coding-system) + (mm-preferred-coding-system charset) (mm-mule-charset-to-mime-charset charset)) ;; This is for XEmacs. (mm-mule-charset-to-mime-charset charset))) diff --git a/lisp/mm-view.el b/lisp/mm-view.el index 5c7a56e..9f3d0e9 100644 --- a/lisp/mm-view.el +++ b/lisp/mm-view.el @@ -98,7 +98,6 @@ (condition-case var (w3-region (point-min) (point-max)) (error))))) -;;; (narrow-to-region (1+ (point-min)) (point-max)) (mm-handle-set-undisplayer handle `(lambda () @@ -172,7 +171,8 @@ (goto-char (point-min))) (defun mm-inline-message (handle) - (let ((b (point)) gnus-displaying-mime handles) + (let ((b (point)) + gnus-displaying-mime handles) (save-excursion (save-restriction (narrow-to-region b b) @@ -181,17 +181,19 @@ (run-hooks 'gnus-article-decode-hook) (gnus-article-prepare-display) (setq handles gnus-article-mime-handles)) - (if handles - (setq gnus-article-mime-handles - (append gnus-article-mime-handles handles))) + (when handles + (setq gnus-article-mime-handles + (append gnus-article-mime-handles handles))) (mm-handle-set-undisplayer handle `(lambda () (let (buffer-read-only) - (mapc (lambda (prop) - (remove-specifier - (face-property 'default prop) (current-buffer))) - '(background background-pixmap foreground)) + (ignore-errors + ;; This is only valid on XEmacs. + (mapc (lambda (prop) + (remove-specifier + (face-property 'default prop) (current-buffer))) + '(background background-pixmap foreground))) (delete-region ,(point-min-marker) ,(point-max-marker))))))))) (provide 'mm-view) diff --git a/lisp/mml.el b/lisp/mml.el index a77c615..f70efc6 100644 --- a/lisp/mml.el +++ b/lisp/mml.el @@ -202,7 +202,7 @@ ((eq (car cont) 'part) (let (coded encoding charset filename type) (setq type (or (cdr (assq 'type cont)) "text/plain")) - (if (equal (car (split-string type "/")) "text") + (if (member (car (split-string type "/")) '("text" "message")) (with-temp-buffer (cond ((cdr (assq 'buffer cont)) @@ -511,7 +511,8 @@ ["Multipart" mml-insert-multipart t] ["Part" mml-insert-part t]) ["Quote" mml-quote-region t] - ["Validate" mml-validate t])) + ["Validate" mml-validate t] + ["Preview" mml-preview t])) (defvar mml-mode nil "Minor mode for editing MML.") @@ -689,7 +690,12 @@ If RAW, don't highlight the article." (fundamental-mode) (setq buffer-read-only t) (goto-char (point-min)))) - + +(defun mml-validate () + "Validate the current MML document." + (interactive) + (mml-parse)) + (provide 'mml) ;;; mml.el ends here diff --git a/lisp/nndoc.el b/lisp/nndoc.el index 81b0fea..e2f9be8 100644 --- a/lisp/nndoc.el +++ b/lisp/nndoc.el @@ -341,6 +341,9 @@ from the document.") (setq entry (pop alist))) (when (memq subtype (or (cdr (assq 'subtype entry)) '(guess))) (goto-char (point-min)) + ;; Remove blank lines. + (while (eq (following-char) ?\n) + (delete-char 1)) (when (numberp (setq result (funcall (intern (format "nndoc-%s-type-p" (car entry)))))) @@ -581,6 +584,9 @@ from the document.") (save-excursion (set-buffer nndoc-current-buffer) (goto-char (point-min)) + ;; Remove blank lines. + (while (eq (following-char) ?\n) + (delete-char 1)) ;; Find the beginning of the file. (when nndoc-file-begin (nndoc-search nndoc-file-begin)) diff --git a/lisp/nndraft.el b/lisp/nndraft.el index 4e09515..89bf608 100644 --- a/lisp/nndraft.el +++ b/lisp/nndraft.el @@ -177,7 +177,14 @@ (let ((auto (nndraft-auto-save-file-name (nndraft-article-filename article)))) (when (file-exists-p auto) - (funcall nnmail-delete-file-function auto))))) + (funcall nnmail-delete-file-function auto))) + (dolist (backup + (let ((kept-new-versions 1) + (kept-old-versions 0)) + (cdr (find-backup-file-name + (nndraft-article-filename article))))) + (when (file-exists-p backup) + (funcall nnmail-delete-file-function backup))))) res)) (deffoo nndraft-request-accept-article (group &optional server last noinsert) diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index 3168ac5..b0dd971 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -710,6 +710,10 @@ deleted. Point is left where the deleted region was." (save-buffer)) ;; Parse the damn thing. (save-excursion + (goto-char (point-min)) + ;; Remove any blank lines at the start. + (while (eq (following-char) ?\n) + (delete-char 1)) (nnmail-activate 'nnfolder) ;; Read in the file. (let ((delim "^From ") diff --git a/lisp/nnmail.el b/lisp/nnmail.el index f196095..897df61 100644 --- a/lisp/nnmail.el +++ b/lisp/nnmail.el @@ -293,8 +293,12 @@ the following: GROUP: Mail will be stored in GROUP (a string). -\(FIELD VALUE SPLIT): If the message field FIELD (a regexp) contains - VALUE (a regexp), store the messages as specified by SPLIT. +\(FIELD VALUE [- RESTRICT [- RESTRICT [...]]] SPLIT): If the message + field FIELD (a regexp) contains VALUE (a regexp), store the messages + as specified by SPLIT. If RESTRICT (a regexp) matches some string + after FIELD and before the end of the matched VALUE, return NIL, + otherwise process SPLIT. Multiple RESTRICTs add up, further + restricting the possibility of processing SPLIT. \(| SPLIT...): Process each SPLIT expression until one of them matches. A SPLIT expression is said to match if it will cause the mail @@ -306,6 +310,10 @@ GROUP: Mail will be stored in GROUP (a string). the buffer containing the message headers. The return value FUNCTION should be a split, which is then recursively processed. +\(! FUNCTION SPLIT): Call FUNCTION with the result of SPLIT. The + return value FUNCTION should be a split, which is then recursively + processed. + FIELD must match a complete field name. VALUE must match a complete word according to the `nnmail-split-fancy-syntax-table' syntax table. You can use \".*\" in the regexps to match partial field names or words. @@ -333,6 +341,13 @@ Example: ;; Other mailing lists... (any \"procmail@informatik\\\\.rwth-aachen\\\\.de\" \"procmail.list\") (any \"SmartList@informatik\\\\.rwth-aachen\\\\.de\" \"SmartList.list\") + ;; Both lists below have the same suffix, so prevent + ;; cross-posting to mkpkg.list of messages posted only to + ;; the bugs- list, but allow cross-posting when the + ;; message was really cross-posted. + (any \"bugs-mypackage@somewhere\" \"mypkg.bugs\") + (any \"mypackage@somewhere\" - \"bugs-mypackage\" \"mypkg.list\") + ;; ;; People... (any \"larsi@ifi\\\\.uio\\\\.no\" \"people.Lars Magne Ingebrigtsen\")) ;; Unmatched mail goes to the catch all group. @@ -1106,47 +1121,71 @@ See the documentation for the variable `nnmail-split-fancy' for documentation." ;; Check the cache for the regexp for this split. ((setq cached-pair (assq split nnmail-split-cache)) - (goto-char (point-max)) - ;; FIX FIX FIX problem with re-search-backward is that if you have - ;; a split: (from "foo-\\(bar\\|baz\\)@gnus.org "mail.foo.\\1") - ;; and someone mails a message with 'To: foo-bar@gnus.org' and - ;; 'CC: foo-baz@gnus.org', we'll pick 'mail.foo.baz' as the group - ;; if the cc line is a later header, even though the other choice - ;; is probably better. Also, this routine won't do a crosspost - ;; when there are two different matches. - ;; I guess you could just make this more determined, and it could - ;; look for still more matches prior to this one, and recurse - ;; on each of the multiple matches hit. Of course, then you'd - ;; want to make sure that nnmail-article-group or nnmail-split-fancy - ;; removed duplicates, since there might be more of those. - ;; I guess we could also remove duplicates in the & split case, since - ;; that's the only thing that can introduce them. - (when (re-search-backward (cdr cached-pair) nil t) + (let (split-result + (end-point (point-max)) + (value (nth 1 split))) + (if (symbolp value) + (setq value (cdr (assq value nnmail-split-abbrev-alist)))) + (while (and (goto-char end-point) + (re-search-backward (cdr cached-pair) nil t)) (when nnmail-split-tracing (push (cdr cached-pair) nnmail-split-trace)) - ;; Someone might want to do a \N sub on this match, so get the - ;; correct match positions. - (goto-char (match-end 0)) - (let ((value (nth 1 split))) - (re-search-backward (if (symbolp value) - (cdr (assq value nnmail-split-abbrev-alist)) - value) - (match-end 1))) - (nnmail-split-it (nth 2 split)))) + (let ((split-rest (cddr split)) + (end (match-end 0)) + ;; The searched regexp is \(\(FIELD\).*\)\(VALUE\). So, + ;; start-of-value is the the point just before the + ;; beginning of the value, whereas after-header-name is + ;; the point just after the field name. + (start-of-value (match-end 1)) + (after-header-name (match-end 2))) + ;; Start the next search just before the beginning of the + ;; VALUE match. + (setq end-point (1- start-of-value)) + ;; Handle - RESTRICTs + (while (eq (car split-rest) '-) + ;; RESTRICT must start after-header-name and + ;; end after start-of-value, so that, for + ;; (any "foo" - "x-foo" "foo.list") + ;; we do not exclude foo.list just because + ;; the header is: ``To: x-foo, foo'' + (goto-char end) + (if (and (re-search-backward (cadr split-rest) + after-header-name t) + (> (match-end 0) start-of-value)) + (setq split-rest nil) + (setq split-rest (cddr split-rest)))) + (when split-rest + (goto-char end) + (let ((value (nth 1 split))) + (if (symbolp value) + (setq value (cdr (assq value nnmail-split-abbrev-alist)))) + ;; Someone might want to do a \N sub on this match, so get the + ;; correct match positions. + (re-search-backward value start-of-value)) + (dolist (sp (nnmail-split-it (car split-rest))) + (unless (memq sp split-result) + (push sp split-result)))))) + split-result)) ;; Not in cache, compute a regexp for the field/value pair. (t (let* ((field (nth 0 split)) (value (nth 1 split)) - (regexp (concat "^\\(\\(" + partial regexp) + (if (symbolp value) + (setq value (cdr (assq value nnmail-split-abbrev-alist)))) + (if (string= ".*" (substring value 0 2)) + (setq value (substring value 2) + partial "")) + (setq regexp (concat "^\\(\\(" (if (symbolp field) (cdr (assq field nnmail-split-abbrev-alist)) field) - "\\):.*\\)\\<\\(" - (if (symbolp value) - (cdr (assq value nnmail-split-abbrev-alist)) - value) - "\\)\\>"))) + "\\):.*\\)" + (or partial "\\<") + "\\(" + value + "\\)\\>")) (push (cons split regexp) nnmail-split-cache) ;; Now that it's in the cache, just call nnmail-split-it again ;; on the same split, which will find it immediately in the cache. diff --git a/lisp/nntp.el b/lisp/nntp.el index 816b98f..8b778d8 100644 --- a/lisp/nntp.el +++ b/lisp/nntp.el @@ -476,64 +476,65 @@ noticing asynchronous data.") (deffoo nntp-retrieve-groups (groups &optional server) "Retrieve group info on GROUPS." (nntp-possibly-change-group nil server) - (save-excursion - (set-buffer (nntp-find-connection-buffer nntp-server-buffer)) - ;; The first time this is run, this variable is `try'. So we - ;; try. - (when (eq nntp-server-list-active-group 'try) - (nntp-try-list-active (car groups))) - (erase-buffer) - (let ((count 0) - (received 0) - (last-point (point-min)) - (nntp-inhibit-erase t) - (command (if nntp-server-list-active-group "LIST ACTIVE" "GROUP"))) - (while groups - ;; Send the command to the server. - (nntp-send-command nil command (pop groups)) - (incf count) - ;; Every 400 requests we have to read the stream in - ;; order to avoid deadlocks. - (when (or (null groups) ;All requests have been sent. - (zerop (% count nntp-maximum-request))) - (nntp-accept-response) - (while (progn - (goto-char last-point) - ;; Count replies. - (while (re-search-forward "^[0-9]" nil t) - (incf received)) - (setq last-point (point)) - (< received count)) - (nntp-accept-response)))) + (when (nntp-find-connection-buffer nntp-server-buffer) + (save-excursion + (set-buffer (nntp-find-connection-buffer nntp-server-buffer)) + ;; The first time this is run, this variable is `try'. So we + ;; try. + (when (eq nntp-server-list-active-group 'try) + (nntp-try-list-active (car groups))) + (erase-buffer) + (let ((count 0) + (received 0) + (last-point (point-min)) + (nntp-inhibit-erase t) + (command (if nntp-server-list-active-group "LIST ACTIVE" "GROUP"))) + (while groups + ;; Send the command to the server. + (nntp-send-command nil command (pop groups)) + (incf count) + ;; Every 400 requests we have to read the stream in + ;; order to avoid deadlocks. + (when (or (null groups) ;All requests have been sent. + (zerop (% count nntp-maximum-request))) + (nntp-accept-response) + (while (progn + (goto-char last-point) + ;; Count replies. + (while (re-search-forward "^[0-9]" nil t) + (incf received)) + (setq last-point (point)) + (< received count)) + (nntp-accept-response)))) - ;; Wait for the reply from the final command. - (goto-char (point-max)) - (re-search-backward "^[0-9]" nil t) - (when (looking-at "^[23]") - (while (progn - (goto-char (point-max)) - (if (not nntp-server-list-active-group) - (not (re-search-backward "\r?\n" (- (point) 3) t)) - (not (re-search-backward "^\\.\r?\n" (- (point) 4) t)))) - (nntp-accept-response))) - - ;; Now all replies are received. We remove CRs. - (goto-char (point-min)) - (while (search-forward "\r" nil t) - (replace-match "" t t)) + ;; Wait for the reply from the final command. + (goto-char (point-max)) + (re-search-backward "^[0-9]" nil t) + (when (looking-at "^[23]") + (while (progn + (goto-char (point-max)) + (if (not nntp-server-list-active-group) + (not (re-search-backward "\r?\n" (- (point) 3) t)) + (not (re-search-backward "^\\.\r?\n" (- (point) 4) t)))) + (nntp-accept-response))) - (if (not nntp-server-list-active-group) - (progn - (copy-to-buffer nntp-server-buffer (point-min) (point-max)) - 'group) - ;; We have read active entries, so we just delete the - ;; superfluous gunk. + ;; Now all replies are received. We remove CRs. (goto-char (point-min)) - (while (re-search-forward "^[.2-5]" nil t) - (delete-region (match-beginning 0) - (progn (forward-line 1) (point)))) - (copy-to-buffer nntp-server-buffer (point-min) (point-max)) - 'active)))) + (while (search-forward "\r" nil t) + (replace-match "" t t)) + + (if (not nntp-server-list-active-group) + (progn + (copy-to-buffer nntp-server-buffer (point-min) (point-max)) + 'group) + ;; We have read active entries, so we just delete the + ;; superfluous gunk. + (goto-char (point-min)) + (while (re-search-forward "^[.2-5]" nil t) + (delete-region (match-beginning 0) + (progn (forward-line 1) (point)))) + (copy-to-buffer nntp-server-buffer (point-min) (point-max)) + 'active))))) (deffoo nntp-retrieve-articles (articles &optional group server) (nntp-possibly-change-group group server) diff --git a/texi/ChangeLog b/texi/ChangeLog index 83731fa..82e9ed7 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,12 @@ +1999-07-06 11:41:59 Lars Magne Ingebrigtsen + + * gnus.texi (Mail Source Specifiers): Fix. + (Mail Source Customization): Deleted obsolete vars. + +1999-07-05 05:16:55 Laura Conrad + + * gnus.texi (Mail in a Newsreader): Rewrite. + 1999-07-04 04:33:50 Lars Magne Ingebrigtsen * gnus.texi (Posting Styles): Fix. diff --git a/texi/emacs-mime.texi b/texi/emacs-mime.texi index 5e805fa..93e1d6e 100644 --- a/texi/emacs-mime.texi +++ b/texi/emacs-mime.texi @@ -859,21 +859,21 @@ This variable specifies whether a part @emph{can} be displayed inline, and, if so, how to do it. It does not say whether parts are @emph{actually} displayed inline. -@item mm-inlines-types +@item mm-inlined-types This, on the other hand, says what types are to be displayed inline, if they satisfy the conditions set by the variable above. It's a list of @sc{mime} media types. @item mm-automatic-display This is a list of types that are to be displayed ``automatically'', but -only if the above variable allows it. That is, only inlinable parts are -usually displayed automatically, but in the end, this is up to the -display agent that's using the @sc{mime} library. +only if the above variable allows it. That is, only inlinable parts can +be displayed automatically. @item mm-attachment-override-types Some @sc{mime} agents create parts that have a content-disposition of @samp{attachment}. This variable allows overriding that disposition and -displaying the part inline. +displaying the part inline. (Note that the disposition is only +overridden if we are able to, and want to, display the part inline.) @item mm-discouraged-alternatives List of @sc{mime} types that are discouraged when viewing @@ -888,9 +888,16 @@ then the value of this variable should be set to: ("text/html" "text/richtext") @end lisp -@item mm-all-images-fit -If non-@code{nil}, all images will be deemed to fit into the buffer, -even when they don't. +@item mm-inline-large-images-p +When displaying inline images that are larger than the window, XEmacs +does not enable scrolling, which means that you cannot see the whole +image. To prevent this, the library tries to determine the image size +before displaying it inline, and if it doesn't fit the window, the +library will display it externally (e.g. with @samp{ImageMagick} or +@samp{xv}). Setting this variable to @code{t} disables this check and +makes the library display all inline images as inline, regardless of +their size. + @end table diff --git a/texi/gnus.texi b/texi/gnus.texi index b1ad151..7019b20 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -1,7 +1,7 @@ @c \input texinfo @c -*-texinfo-*- @setfilename gnus -@settitle Pterodactyl Gnus 0.91 Manual +@settitle Pterodactyl Gnus 0.92 Manual @synindex fn cp @synindex vr cp @synindex pg cp @@ -319,7 +319,7 @@ into another language, under the above conditions for modified versions. @tex @titlepage -@title Pterodactyl Gnus 0.91 Manual +@title Pterodactyl Gnus 0.92 Manual @author by Lars Magne Ingebrigtsen @page @@ -355,7 +355,7 @@ can be gotten by any nefarious means you can think of---@sc{nntp}, local spool or your mbox file. All at the same time, if you want to push your luck. -This manual corresponds to Pterodactyl Gnus 0.91. +This manual corresponds to Pterodactyl Gnus 0.92. @end ifinfo @@ -9930,7 +9930,7 @@ of a culture shock. Gnus does not behave like traditional mail readers. If you want to make it behave that way, you can, but it's an uphill battle. -Gnus, by default, handles all its group using the same approach. This +Gnus, by default, handles all its groups using the same approach. This approach is very newsreaderly---you enter a group, see the new/unread messages, and when you read the messages, they get marked as read, and you don't see them any more. (Unless you explicitly ask for them.) @@ -9947,18 +9947,28 @@ you. The expire process for mail is covered in depth in @pxref{Expiring Mail}. What many Gnus users find, after using it a while for both news and -mail, is that the transport becomes more and more irrelevant. What -becomes important is the size of the receiving audience. +mail, is that the transport mechanism has very little to do with how +they want to treat a message. Many people subscribe to several mailing lists. These are transported -via SMTP, and are therefore mail. Some people have local news groups -which have only a handful of readers. These are transported via NNTP, -and are therefore news. +via SMTP, and are therefore mail. But we might go for weeks without +answering, or even reading these messages very carefully. We may not +need to save them because if we should need to read one again, they are +archived somewhere else. + +Some people have local news groups which have only a handful of readers. +These are transported via NNTP, and are therefore news. But we may need +to read and answer a large fraction of the messages very carefully in +order to do our work. And there may not be an archive, so we may need +to save the interesting messages the same way we would personal mail. The important distinction turns out to be not the transport mechanism, -but whether the messages are @dfn{personal} or @dfn{public}. Many users -then subtly alter the behavior of Gnus according to these two -categories. +but other factors such as how interested we are in the subject matter, +or how easy it is to retrieve the message if we need to read it again. + +Gnus provides many options for sorting mail into ``groups'' which behave +like newsgroups, and for treating each group (whether mail or news) +differently. Some users never get comfortable using the Gnus (ahem) paradigm and wish that Gnus should grow up and be a male, er, mail reader. It is possible @@ -10118,8 +10128,8 @@ POP mail server, or from a procmail directory, for instance. @cindex mail spool @cindex mail source -You tell Gnus how to fetch mail by creating a @dfn{mail source -specifier}. +You tell Gnus how to fetch mail by setting @code{mail-sources} +(@pxref{Fetching Mail}) to a @dfn{mail source specifier}. Here's an example: @@ -10322,19 +10332,6 @@ fetched. You would normally not need to set or change any of these variables. @table @code -@item mail-source-movemail-program -@vindex mail-source-movemail-program -A command to be executed to move mail from the inbox. 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 file, and the file -to be moved to. - -@item mail-source-movemail-args -@vindex mail-source-movemail-args -Extra arguments to give to the command described above. - @item mail-source-crash-box @vindex mail-source-crash-box File where mail will be stored while processing it. The default is @@ -10496,6 +10493,12 @@ Let's look at an example value of this variable first: ;; Other mailing lists... (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list") (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list") + ;; Both lists below have the same suffix, so prevent + ;; cross-posting to mkpkg.list of messages posted only to + ;; the bugs- list, but allow cross-posting when the + ;; message was really cross-posted. + (any "bugs-mypackage@@somewhere" "mypkg.bugs") + (any "mypackage@@somewhere\" - "bugs-mypackage" "mypkg.list") ;; People... (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen")) ;; Unmatched mail goes to the catch all group. @@ -10514,9 +10517,12 @@ name. Normal regexp match expansion will be done. See below for examples. @item -@var{(FIELD VALUE SPLIT)}: If the split is a list, the first element of -which is a string, then store the message as specified by SPLIT, if -header FIELD (a regexp) contains VALUE (also a regexp). +@var{(FIELD VALUE [- RESTRICT [- RESTRICT [...]]] SPLIT)}: If the split +is a list, the first element of which is a string, then store the +message as specified by SPLIT, if header FIELD (a regexp) contains VALUE +(also a regexp). If RESTRICT (yet another regexp) matches some string +after FIELD and before the end of the matched VALUE, the SPLIT is +ignored. If none of the RESTRICT clauses match, SPLIT is processed. @item @var{(| SPLIT...)}: If the split is a list, and the first element is @@ -16979,12 +16985,14 @@ Peter Arius, Matt Armstrong, Marc Auslander, Miles Bader, +Alexei V. Barantsev, Frank Bennett, Robert Bihlmeyer, Chris Bone, Mark Borges, Mark Boyns, Lance A. Brown, +Rob Browning, Kees de Bruin, Martin Buchholz, Joe Buehler, @@ -16997,8 +17005,13 @@ Castor, David Charlap, Dan Christensen, Kevin Christian, +Jae-you Chung, @c ? +James H. Cloos, Jr., +Laura Conrad, Michael R. Cook, Glenn Coombs, +Andrew J. Cosgriff, +Neil Crellin, Frank D. Cringle, Geoffrey T. Dairiki, Andre Deparade, @@ -17009,6 +17022,7 @@ Joev Dubach, Michael Welsh Duggan, Dave Edmondson, Paul Eggert, +Mark W. Eichin, Karl Eichwalder, Enami Tsugutomo, @c Enami Michael Ernst, @@ -17016,6 +17030,7 @@ Luc Van Eycken, Sam Falkner, Nelson Jose dos Santos Ferreira, Sigbjorn Finne, +Sven Fischer, Paul Fisher, Decklin Foster, Gary D. Foster, @@ -17032,24 +17047,30 @@ Raja R. Harinath, Yoshiki Hayashi, @c ? P. E. Jareth Hein, Hisashige Kenji, @c Hisashige +Scott Hofmann, Marc Horowitz, Gunnar Horrigmo, Richard Hoskins, Brad Howes, +Miguel de Icaza, François Felix Ingrand, +Tatsuya Ichikawa, @c ? Ishikawa Ichiro, @c Ishikawa Lee Iverson, Iwamuro Motonori, @c Iwamuro Rajappa Iyer, Andreas Jaeger, +Adam P. Jenkins, Randell Jesup, Fred Johansen, Gareth Jones, Simon Josefsson, Greg Klanderman, Karl Kleinpaste, +Michael Klingbeil, Peter Skov Knudsen, Shuhei Kobayashi, @c Kobayashi +Petr Konecny, Koseki Yoshinori, @c Koseki Thor Kristoffersen, Jens Lautenbacher, @@ -17082,6 +17103,7 @@ Alexandre Oliva, Ken Olstad, Masaharu Onishi, @c Onishi Hideki Ono, @c Ono +Ettore Perazzoli, William Perry, Stephen Peters, Jens-Ulrik Holger Petersen, @@ -17123,18 +17145,23 @@ Darren Stalder, Richard Stallman, Greg Stark, Sam Steingold, +Paul Stevenson, Jonas Steverud, Paul Stodghill, +Kiyokazu Suto, @c Suto Kurt Swanson, Samuel Tardieu, Teddy, Chuck Thompson, +Tozawa Akihiko, @c Tozawa Philippe Troin, James Troup, Trung Tran-Duc, +Jack Twilley, Aaron M. Ucko, Aki Vehtari, Didier Verna, +Vladimir Volovich, Jan Vroonhof, Stefan Waldherr, Pete Ware, @@ -19070,6 +19097,16 @@ Under the subject "foo1", you wrote on 01.01.1999: Allow "orphan" scores in the Agent scoring. @item +@example + - Edit article's summary line. + - End edit + - Sort lines in buffer by subject + + --> the old subject line appears in Summary buffer, not the one that was + just changed to. +@end example + +@item Solve the halting problem. @c TODO diff --git a/texi/message.texi b/texi/message.texi index 388f2df..0fbe349 100644 --- a/texi/message.texi +++ b/texi/message.texi @@ -1,7 +1,7 @@ \input texinfo @c -*-texinfo-*- @setfilename message -@settitle Pterodactyl Message 0.91 Manual +@settitle Pterodactyl Message 0.92 Manual @synindex fn cp @synindex vr cp @synindex pg cp @@ -42,7 +42,7 @@ into another language, under the above conditions for modified versions. @tex @titlepage -@title Pterodactyl Message 0.91 Manual +@title Pterodactyl Message 0.92 Manual @author by Lars Magne Ingebrigtsen @page @@ -83,7 +83,7 @@ Message mode buffers. * Key Index:: List of Message mode keys. @end menu -This manual corresponds to Pterodactyl Message 0.91. Message is +This manual corresponds to Pterodactyl Message 0.92. Message is distributed with the Gnus distribution bearing the same version number as this manual. -- 1.7.10.4