From: ichikawa Date: Mon, 10 Aug 1998 06:42:50 +0000 (+0000) Subject: Sync up with gnus-5.6.30 X-Git-Tag: ichikawa-199811302358~31 X-Git-Url: http://git.chise.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0366bcb8a98676de1d5399920b9c5f1e5eb06c25;p=elisp%2Fgnus.git- Sync up with gnus-5.6.30 --- diff --git a/ChangeLog b/ChangeLog index 8ac1d32..13b8f9d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +1998-08-10 Tatsuya Ichikawa + + * lisp/gnus.el (gnus-version-number): Update to 6.8.8. + + * Sync up with Gnus 5.6.30. + +1998-08-10 Keiichi Suzuki + + * lisp/message.el (message-yank-original): For citing any message. + +1998-08-10 Shuhei KOBAYASHI + + * lisp/gnus.el (gnus-version-number): Update to 6.8.7. + 1998-08-06 Katsumi Yamaoka *lisp/smtp.el: Do not insert empty line at the end of message. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 3589498..ed55690 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,37 @@ +Sun Aug 9 15:46:16 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.30 is released. + +1998-08-09 10:48:31 Lars Magne Ingebrigtsen + + * message.el (message-cite-original-without-signature): Peel off + blank lines. + + * gnus-art.el (gnus-article-maybe-highlight): Doc fix. + + * gnus-sum.el (gnus-data-enter-list): Threw away all new list data + at the beginning of the buffer. + +1998-08-07 01:41:29 Gareth Jones + + * gnus-score.el (gnus-summary-increase-score): Don't downcase + before lookin in char-to-header. + +1998-08-07 01:33:22 Lars Magne Ingebrigtsen + + * gnus.el (gnus-predefined-server-alist): Too many parentheses. + +1998-08-06 11:20:08 Lars Magne Ingebrigtsen + + * gnus.el (gnus-continuum-version): Include quassia. + + * gnus-sum.el (gnus-data-enter-list): Check before entering list. + +1998-08-06 11:13:56 Francois Felix Ingrand + + * gnus-salt.el (gnus-generate-vertical-tree): Don't go too far to + the left. + Thu Aug 6 07:58:17 1998 Lars Magne Ingebrigtsen * gnus.el: Gnus v5.6.29 is released. diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index f488c7e..224408b 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -2392,7 +2392,7 @@ If given a prefix, show the hidden text instead." (gnus-article-hide-signature arg)) (defun gnus-article-maybe-highlight () - "Do some article highlighting if `article-visual' is non-nil." + "Do some article highlighting if article highlighting is requested." (when (gnus-visual-p 'article-highlight 'highlight) (gnus-article-highlight-some))) diff --git a/lisp/gnus-group.el b/lisp/gnus-group.el index 1f3b8d3..f79b976 100644 --- a/lisp/gnus-group.el +++ b/lisp/gnus-group.el @@ -1786,6 +1786,8 @@ ADDRESS." (gnus-read-group "Group name: ") (gnus-read-method "From method: "))) + (when (stringp method) + (setq method (gnus-server-to-method method))) (let* ((meth (when (and method (not (gnus-server-equal method gnus-select-method))) (if address (list (intern method) address) diff --git a/lisp/gnus-salt.el b/lisp/gnus-salt.el index 5dc624e..d3c5ccf 100644 --- a/lisp/gnus-salt.el +++ b/lisp/gnus-salt.el @@ -763,7 +763,8 @@ Two predefined functions are available: (setq beg (point)) (forward-char -1) ;; Draw "-" lines leftwards. - (while (= (char-after (1- (point))) ? ) + (while (and (> (point) 1) + (= (char-after (1- (point))) ? )) (delete-char -1) (insert (car gnus-tree-parent-child-edges)) (forward-char -1)) diff --git a/lisp/gnus-score.el b/lisp/gnus-score.el index 9b673ce..141fbd9 100644 --- a/lisp/gnus-score.el +++ b/lisp/gnus-score.el @@ -550,7 +550,7 @@ used as score." (gnus-score-insert-help "Match on header" char-to-header 1))) (gnus-score-kill-help-buffer) - (unless (setq entry (assq (downcase hchar) char-to-header)) + (unless (setq entry (assq hchar char-to-header)) (if mimic (error "%c %c" prefix hchar) (error "Illegal header type"))) diff --git a/lisp/gnus-soup.el b/lisp/gnus-soup.el index fe78c9d..3842c20 100644 --- a/lisp/gnus-soup.el +++ b/lisp/gnus-soup.el @@ -205,7 +205,9 @@ for matching on group names. For instance, if you want to brew on all the nnml groups, as well as groups with \"emacs\" in the name, you could say something like: -$ emacs -batch -f gnus-batch-brew-soup ^nnml \".*emacs.*\"" +$ emacs -batch -f gnus-batch-brew-soup ^nnml \".*emacs.*\" + +Note -- this function hasn't been implemented yet." (interactive) nil) diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index 4354e9b..766a736 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -1986,21 +1986,26 @@ The following commands are available: (when list (let ((data (and after-article (gnus-data-find-list after-article))) (ilist list)) - (or data (not after-article) (error "No such article: %d" after-article)) - ;; Find the last element in the list to be spliced into the main - ;; list. - (while (cdr list) - (setq list (cdr list))) - (if (not data) - (progn - (setcdr list gnus-newsgroup-data) - (setq gnus-newsgroup-data ilist) + (if (not (or data + after-article)) + (let ((odata gnus-newsgroup-data)) + (setq gnus-newsgroup-data (nconc list gnus-newsgroup-data)) (when offset - (gnus-data-update-list (cdr list) offset))) - (setcdr list (cdr data)) - (setcdr data ilist) - (when offset - (gnus-data-update-list (cdr list) offset))) + (gnus-data-update-list odata offset))) + ;; Find the last element in the list to be spliced into the main + ;; list. + (while (cdr list) + (setq list (cdr list))) + (if (not data) + (progn + (setcdr list gnus-newsgroup-data) + (setq gnus-newsgroup-data ilist) + (when offset + (gnus-data-update-list (cdr list) offset))) + (setcdr list (cdr data)) + (setcdr data ilist) + (when offset + (gnus-data-update-list (cdr list) offset)))) (setq gnus-newsgroup-data-reverse nil)))) (defun gnus-data-remove (article &optional offset) @@ -3272,10 +3277,11 @@ If LINE, insert the rebuilt thread starting on line LINE." ;;!!! then we want to insert at the beginning of the buffer. ;;!!! That happens to be true with Gnus now, but that may ;;!!! change in the future. Perhaps. - (gnus-data-enter-list (if line nil current) data (- (point) old-pos)) - (setq gnus-newsgroup-threads (nconc threads gnus-newsgroup-threads)) - (when line - (gnus-data-compute-positions))))) + (gnus-data-enter-list + (if line nil current) data (- (point) old-pos)) + (setq gnus-newsgroup-threads + (nconc threads gnus-newsgroup-threads)) + (gnus-data-compute-positions)))) (defun gnus-number-to-header (number) "Return the header for article NUMBER." diff --git a/lisp/gnus-uu.el b/lisp/gnus-uu.el index 4512edb..dca97f0 100644 --- a/lisp/gnus-uu.el +++ b/lisp/gnus-uu.el @@ -1291,7 +1291,8 @@ didn't work, and overwrite existing files. Otherwise, ask each time." (file-exists-p result-file) (not gnus-uu-be-dangerous) (or (eq gnus-uu-be-dangerous t) - (gnus-y-or-n-p (format "Delete incomplete file %s? " result-file))) + (gnus-y-or-n-p + (format "Delete incomplete file %s? " result-file))) (delete-file result-file)) ;; If this was a file of the wrong sort, then diff --git a/lisp/gnus.el b/lisp/gnus.el index 6e3b6c1..af5d8d3 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -253,11 +253,11 @@ is restarted, and sometimes reloaded." (defconst gnus-product-name "T-gnus" "Product name of this version of gnus.") -(defconst gnus-version-number "6.8.6" +(defconst gnus-version-number "6.8.8" "Version number for this version of gnus.") (defconst gnus-version - (format "%s %s (based on Gnus 5.6.29; for SEMI 1.8, FLIM 1.8/1.9)" + (format "%s %s (based on Gnus 5.6.30; for SEMI 1.8, FLIM 1.8/1.9)" gnus-product-name gnus-version-number) "Version string for this version of gnus.") @@ -1424,11 +1424,11 @@ want." (defvar gnus-predefined-server-alist `(("cache" - (nnspool "cache" - (nnspool-spool-directory gnus-cache-directory) - (nnspool-nov-directory gnus-cache-directory) - (nnspool-active-file - (nnheader-concat gnus-cache-directory "active"))))) + nnspool "cache" + (nnspool-spool-directory gnus-cache-directory) + (nnspool-nov-directory gnus-cache-directory) + (nnspool-active-file + (nnheader-concat gnus-cache-directory "active")))) "List of predefined (convenience) servers.") (defvar gnus-topic-indentation "") ;; Obsolete variable. @@ -1979,13 +1979,15 @@ If ARG, insert string at point." "Return VERSION as a floating point number." (when (or (string-match "^\\([^ ]+\\)? ?Gnus v?\\([0-9.]+\\)$" version) (string-match "^\\(.?\\)gnus-\\([0-9.]+\\)$" version)) - (let* ((alpha (and (match-beginning 1) (match-string 1 version))) - (number (match-string 2 version)) - major minor least) - (string-match "\\([0-9]\\)\\.\\([0-9]+\\)\\.?\\([0-9]+\\)?" number) - (setq major (string-to-number (match-string 1 number))) - (setq minor (string-to-number (match-string 2 number))) - (setq least (if (match-beginning 3) + (let ((alpha (and (match-beginning 1) (match-string 1 version))) + (number (match-string 2 version)) + major minor least) + (unless (string-match + "\\([0-9]\\)\\.\\([0-9]+\\)\\.?\\([0-9]+\\)?" number) + (error "Invalid version string: %s" version)) + (setq major (string-to-number (match-string 1 number)) + minor (string-to-number (match-string 2 number)) + least (if (match-beginning 3) (string-to-number (match-string 3 number)) 0)) (string-to-number @@ -1994,7 +1996,11 @@ If ARG, insert string at point." (cond ((member alpha '("(ding)" "d")) "4.99") ((member alpha '("September" "s")) "5.01") - ((member alpha '("Red" "r")) "5.03")) + ((member alpha '("Red" "r")) "5.03") + ((member alpha '("Quassia" "q")) "5.05") + ((member alpha '("p")) "5.07") + ((member alpha '("o")) "5.09") + ((member alpha '("n")) "5.11")) minor least) (format "%d.%02d%02d" major minor least)))))) @@ -2037,7 +2043,7 @@ g -- Group name." (setq prompt (match-string 1 string))) (setq i (match-end 0)) ;; We basically emulate just about everything that - ;; `interactive' does, but adds the "g" and "G" specs. + ;; `interactive' does, but add the specs listed above. (push (cond ((= c ?a) diff --git a/lisp/message.el b/lisp/message.el index b9d74da..c9f781b 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -3,7 +3,6 @@ ;; Author: Lars Magne Ingebrigtsen ;; MORIOKA Tomohiko -;; Shuhei KOBAYASHI ;; Keywords: mail, news, MIME ;; This file is part of GNU Emacs. @@ -183,11 +182,11 @@ shorten-followup-to existing-newsgroups buffer-file-name unchanged." (defcustom message-required-news-headers '(From Newsgroups Subject Date Message-ID (optional . Organization) Lines - (optional . User-Agent)) + (optional . X-Newsreader)) "*Headers to be generated or prompted for when posting an article. RFC977 and RFC1036 require From, Date, Newsgroups, Subject, Message-ID. Organization, Lines, In-Reply-To, Expires, and -User-Agent are optional. If don't you want message to insert some +X-Newsreader are optional. If don't you want message to insert some header, remove it from this list." :group 'message-news :group 'message-headers @@ -195,10 +194,10 @@ header, remove it from this list." (defcustom message-required-mail-headers '(From Subject Date (optional . In-Reply-To) Message-ID Lines - (optional . User-Agent)) + (optional . X-Mailer)) "*Headers to be generated or prompted for when mailing a message. RFC822 required that From, Date, To, Subject and Message-ID be -included. Organization, Lines and User-Agent are optional." +included. Organization, Lines and X-Mailer are optional." :group 'message-mail :group 'message-headers :type '(repeat sexp)) @@ -233,47 +232,6 @@ any confusion." :group 'message-various :type 'regexp) -;;; Some sender agents encode the whole subject including leading "Re: ". -;;; And if followup agent does not decode it for some reason (e.g. unknown -;;; charset) and just add a new "Re: " in front of the encoded-word, the -;;; result will contain multiple "Re: "'s. -(defcustom message-subject-encoded-re-regexp - (concat - "^[ \t]*" - (regexp-quote "=?") - "[-!#$%&'*+0-9A-Z^_`a-z{|}~]+" ; charset - (regexp-quote "?") - "\\(" - "[Bb]" (regexp-quote "?") ; B encoding - "\\(\\(CQk\\|CSA\\|IAk\\|ICA\\)[Jg]\\)*" ; \([ \t][ \t][ \t]\)* - "\\(" - "[Uc][km]U6" ; [Rr][Ee]: - "\\|" - "\\(C[VX]\\|I[FH]\\)J[Fl]O[g-v]" ; [ \t][Rr][Ee]: - "\\|" - "\\(CQl\\|CSB\\|IAl\\|ICB\\)[Sy][RZ]T[o-r]" ; [ \t][ \t][Rr][Ee]: - "\\)" - "\\|" - "[Qb]" (regexp-quote "?") ; Q encoding - "\\(_\\|=09\\|=20\\)*" - "\\([Rr]\\|=[57]2\\)\\([Ee]\\|=[46]5\\)\\(:\\|=3[Aa]\\)" - "\\)" - ) - "*Regexp matching \"Re: \" in the subject line. -Unlike `message-subject-re-regexp', this regexp matches \"Re: \" within -an encoded-word." - :group 'message-various - :type 'regexp) - -(defcustom message-use-subject-re t - "*If t, remove any (buggy) \"Re: \"'s from the subject of the precursor -and add a new \"Re: \". If it is nil, use the subject \"as-is\". If it -is the symbol `guess', try to detect \"Re: \" within an encoded-word." - :group 'message-various - :type '(choice (const :tag "off" nil) - (const :tag "on" t) - (const guess))) - ;;;###autoload (defcustom message-signature-separator "^-- *$" "Regexp matching the signature separator." @@ -344,12 +302,12 @@ If t, use `message-user-organization-file'." :type 'boolean) (defcustom message-included-forward-headers - "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^\\(Mail-\\)?Followup-To:\\|^\\(Mail-\\)?Reply-To:\\|^Mail-Copies-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^Cc:\\|^Posted-To:\\|^Apparently-To:\\|^Gnus-Warning:\\|^Resent-\\|^Message-ID:\\|^References:\\|^Content-\\|^MIME-Version:" + "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^Followup-To:\\|^Reply-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^Cc:\\|^Posted-To:\\|^Mail-Copies-To:\\|^Apparently-To:\\|^Gnus-Warning:\\|^Resent-\\|^Message-ID:\\|^References:\\|^Content-Transfer-Encoding:\\|^Content-Type:\\|^Mime-Version:" "*Regexp matching headers to be included in forwarded messages." :group 'message-forwarding :type 'regexp) -(defcustom message-ignored-resent-headers "^Return-Receipt" +(defcustom message-ignored-resent-headers "^Return-receipt" "*All headers that match this regexp will be deleted when resending a message." :group 'message-interface :type 'regexp) @@ -420,45 +378,8 @@ always query the user whether to use the value. If it is the symbol `use', always use the value." :group 'message-interface :type '(choice (const :tag "ignore" nil) - (const :tag "maybe" t) - (const :tag "always" use) - (const :tag "ask" ask))) - -(defcustom message-use-mail-copies-to 'ask - "*Specifies what to do with Mail-Copies-To header. -If nil, always ignore the header. If it is t, use its value, but -query before using the value other than \"always\" or \"never\". -If it is the symbol `ask', always query the user whether to use -the value. If it is the symbol `use', always use the value." - :group 'message-interface - :type '(choice (const :tag "ignore" nil) - (const :tag "maybe" t) - (const :tag "always" use) - (const :tag "ask" ask))) - -(defcustom message-use-mail-followup-to 'ask - "*Specifies what to do with Mail-Followup-To header. -If nil, always ignore the header. If it is the symbol `ask', always -query the user whether to use the value. If it is t or the symbol -`use', always use the value." - :group 'message-interface - :type '(choice (const :tag "ignore" nil) - (const :tag "maybe" t) - (const :tag "always" use) - (const :tag "ask" ask))) - -;;; XXX: 'ask and 'use are not implemented yet. -(defcustom message-use-mail-reply-to 'ask - "*Specifies what to do with Mail-Reply-To/Reply-To header. -If nil, always ignore the header. If it is t or the symbol `use', use -its value. If it is the symbol `ask', always query the user whether to -use the value. Not that if \"Reply-To\" is marked as \"broken\", its value -is never used." - :group 'message-interface - :type '(choice (const :tag "ignore" nil) - (const :tag "maybe" t) - (const :tag "always" use) - (const :tag "ask" ask))) + (const use) + (const ask))) ;; stuff relating to broken sendmail in MMDF (defcustom message-sendmail-f-is-evil nil @@ -616,6 +537,8 @@ If stringp, use this; if non-nil, use no host name (user name only)." (defvar message-reply-buffer nil) (defvar message-reply-headers nil) +(defvar message-newsreader nil) +(defvar message-mailer nil) (defvar message-sent-message-via nil) (defvar message-checksum nil) (defvar message-send-actions nil @@ -680,10 +603,6 @@ actually occur." :group 'message-sending :type 'sexp) -;;; XXX: This symbol is overloaded! See below. -(defvar message-user-agent nil - "String of the form of PRODUCT/VERSION. Used for User-Agent header field.") - ;; Ignore errors in case this is used in Emacs 19. ;; Don't use ignore-errors because this is copied into loaddefs.el. ;;;###autoload @@ -854,10 +773,7 @@ Defaults to `text-mode-abbrev-table'.") `((,(concat "^\\([Tt]o:\\)" content) (1 'message-header-name-face) (2 'message-header-to-face nil t)) - (,(concat "^\\([GBF]?[Cc][Cc]:\\|[Rr]eply-[Tt]o:\\|" - "[Mm]ail-[Cc]opies-[Tt]o:\\|" - "[Mm]ail-[Rr]eply-[Tt]o:\\|" - "[Mm]ail-[Ff]ollowup-[Tt]o:\\)" content) + (,(concat "^\\(^[GBF]?[Cc][Cc]:\\|^[Rr]eply-[Tt]o:\\)" content) (1 'message-header-name-face) (2 'message-header-cc-face nil t)) (,(concat "^\\([Ss]ubject:\\)" content) @@ -1007,9 +923,9 @@ The cdr of ech entry is a function for applying the face to a region.") (Lines) (Expires) (Message-ID) - ;; (References . message-shorten-references) - (References . message-fill-header) - (User-Agent)) + (References . message-fill-references) + (X-Mailer) + (X-Newsreader)) "Alist used for formatting headers.") (eval-and-compile @@ -1273,9 +1189,7 @@ Return the number of headers removed." (define-key message-mode-map "\C-c\C-f\C-w" 'message-goto-fcc) (define-key message-mode-map "\C-c\C-f\C-c" 'message-goto-cc) (define-key message-mode-map "\C-c\C-f\C-s" 'message-goto-subject) - ;; (define-key message-mode-map "\C-c\C-f\C-r" 'message-goto-reply-to) - (define-key message-mode-map "\C-c\C-f\C-r" 'message-goto-mail-reply-to) - (define-key message-mode-map "\C-c\C-f\C-m" 'message-goto-mail-followup-to) + (define-key message-mode-map "\C-c\C-f\C-r" 'message-goto-reply-to) (define-key message-mode-map "\C-c\C-f\C-n" 'message-goto-newsgroups) (define-key message-mode-map "\C-c\C-f\C-d" 'message-goto-distribution) (define-key message-mode-map "\C-c\C-f\C-f" 'message-goto-followup-to) @@ -1336,9 +1250,6 @@ Return the number of headers removed." ["Subject" message-goto-subject t] ["Cc" message-goto-cc t] ["Reply-To" message-goto-reply-to t] - ["Mail-Reply-To" message-goto-mail-reply-to t] - ["Mail-Followup-To" message-goto-mail-followup-to t] - ["Mail-Copies-To" message-goto-mail-copies-to t] ["Summary" message-goto-summary t] ["Keywords" message-goto-keywords t] ["Newsgroups" message-goto-newsgroups t] @@ -1361,7 +1272,6 @@ C-c C-f move to a header field (and create it if there isn't): C-c C-f C-w move to Fcc C-c C-f C-r move to Reply-To C-c C-f C-u move to Summary C-c C-f C-n move to Newsgroups C-c C-f C-k move to Keywords C-c C-f C-d move to Distribution - C-c C-f C-m move to Mail-Followup-To C-c C-f C-f move to Followup-To C-c C-t message-insert-to (add a To header to a news followup) C-c C-n message-insert-newsgroups (add a Newsgroup header to a news reply) @@ -1415,7 +1325,8 @@ C-c C-r message-caesar-buffer-body (rot13 the message body)." (setq paragraph-separate paragraph-start) (make-local-variable 'message-reply-headers) (setq message-reply-headers nil) - (make-local-variable 'message-user-agent) + (make-local-variable 'message-newsreader) + (make-local-variable 'message-mailer) (make-local-variable 'message-post-method) (make-local-variable 'message-sent-message-via) (setq message-sent-message-via nil) @@ -1485,21 +1396,6 @@ C-c C-r message-caesar-buffer-body (rot13 the message body)." (interactive) (message-position-on-field "Reply-To" "Subject")) -(defun message-goto-mail-reply-to () - "Move point to the Mail-Reply-To header." - (interactive) - (message-position-on-field "Mail-Reply-To" "Subject")) - -(defun message-goto-mail-followup-to () - "Move point to the Mail-Followup-To header." - (interactive) - (message-position-on-field "Mail-Followup-To" "Subject")) - -(defun message-goto-mail-copies-to () - "Move point to the Mail-Copies-To header." - (interactive) - (message-position-on-field "Mail-Copies-To" "Subject")) - (defun message-goto-newsgroups () "Move point to the Newsgroups header." (interactive) @@ -1825,6 +1721,8 @@ prefix, and don't delete any headers." (let ((modified (buffer-modified-p))) (when (and message-reply-buffer message-cite-function) + (gnus-copy-article-buffer) + (setq message-reply-buffer gnus-article-copy) (delete-windows-on message-reply-buffer t) (insert-buffer message-reply-buffer) (funcall message-cite-function) @@ -1845,6 +1743,11 @@ prefix, and don't delete any headers." (list message-indent-citation-function))))) (goto-char end) (when (re-search-backward "^-- $" start t) + ;; Also peel off any blank lines before the signature. + (forward-line -1) + (while (looking-at "^[ \t]*$") + (forward-line -1)) + (forward-line 1) (delete-region (point) end)) (goto-char start) (while functions @@ -2117,12 +2020,11 @@ the user from the mailer." (let ((errbuf (if message-interactive (generate-new-buffer " sendmail errors") 0)) - resend-addresses delimline) + resend-to-addresses delimline) (let ((case-fold-search t)) (save-restriction (message-narrow-to-headers) - ;; XXX: We need to handle Resent-CC/Resent-BCC, too. - (setq resend-addresses (message-fetch-field "resent-to"))) + (setq resend-to-addresses (message-fetch-field "resent-to"))) ;; Change header-delimiter to be what sendmail expects. (goto-char (point-min)) (re-search-forward @@ -2162,8 +2064,8 @@ the user from the mailer." ;; We must not do that for a resend ;; because we would find the original addresses. ;; For a resend, include the specific addresses. - (if resend-addresses - (list resend-addresses) + (if resend-to-addresses + (list resend-to-addresses) '("-t"))))) (when message-interactive (save-excursion @@ -2181,12 +2083,11 @@ the user from the mailer." "Pass the prepared message buffer to qmail-inject. Refer to the documentation for the variable `message-send-mail-function' to find out how to use this." - ;; replace the header delimiter with a blank line. + ;; replace the header delimiter with a blank line (goto-char (point-min)) (re-search-forward (concat "^" (regexp-quote mail-header-separator) "\n")) (replace-match "\n") - (backward-char 1) (run-hooks 'message-send-mail-hook) ;; send the message (case @@ -2239,32 +2140,143 @@ to find out how to use this." (mh-send-letter))) (defun message-send-mail-with-smtp () - "Send off the prepared buffer with SMTP." - (require 'smtp) ; XXX - (let ((case-fold-search t) - recipients) - (save-restriction - (message-narrow-to-headers) - (setq recipients - ;; XXX: Should be replaced by better one. - (smtp-deduce-address-list (current-buffer) - (point-min) (point-max))) - ;; Remove BCC lines. - (message-remove-header "bcc")) - ;; replace the header delimiter with a blank line. - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (backward-char 1) - (run-hooks 'message-send-mail-hook) - (if recipients - (let ((result (smtp-via-smtp user-mail-address - recipients - (current-buffer)))) - (unless (eq result t) - (error "Sending failed; " result))) - (error "Sending failed; no recipients")))) + "Send the prepared message buffer with SMTP." + (require 'smtp) + (let ((errbuf (if mail-interactive + (generate-new-buffer " smtp errors") + 0)) + (case-fold-search nil) + resend-to-addresses + delimline) + (unwind-protect + (save-excursion + (goto-char (point-max)) + ;; require one newline at the end. + (or (= (preceding-char) ?\n) + (insert ?\n)) + ;; Change header-delimiter to be what sendmail expects. + (goto-char (point-min)) + (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "\n")) + (replace-match "\n") + (backward-char 1) + (setq delimline (point-marker)) + (run-hooks 'message-send-mail-hook) + ;; (sendmail-synch-aliases) + ;; (if mail-aliases + ;; (expand-mail-aliases (point-min) delimline)) + (goto-char (point-min)) + ;; ignore any blank lines in the header + (while (and (re-search-forward "\n\n\n*" delimline t) + (< (point) delimline)) + (replace-match "\n")) + (let ((case-fold-search t)) + (goto-char (point-min)) + (goto-char (point-min)) + (while (re-search-forward "^Resent-to:" delimline t) + (setq resend-to-addresses + (save-restriction + (narrow-to-region (point) + (save-excursion + (end-of-line) + (point))) + (append (mail-parse-comma-list) + resend-to-addresses)))) +;;; Apparently this causes a duplicate Sender. +;;; ;; If the From is different than current user, insert Sender. +;;; (goto-char (point-min)) +;;; (and (re-search-forward "^From:" delimline t) +;;; (progn +;;; (require 'mail-utils) +;;; (not (string-equal +;;; (mail-strip-quoted-names +;;; (save-restriction +;;; (narrow-to-region (point-min) delimline) +;;; (mail-fetch-field "From"))) +;;; (user-login-name)))) +;;; (progn +;;; (forward-line 1) +;;; (insert "Sender: " (user-login-name) "\n"))) + ;; Don't send out a blank subject line + (goto-char (point-min)) + (if (re-search-forward "^Subject:[ \t]*\n" delimline t) + (replace-match "")) + ;; Put the "From:" field in unless for some odd reason + ;; they put one in themselves. + (goto-char (point-min)) + (if (not (re-search-forward "^From:" delimline t)) + (let* ((login user-mail-address) + (fullname (user-full-name))) + (cond ((eq mail-from-style 'angles) + (insert "From: " fullname) + (let ((fullname-start (+ (point-min) 6)) + (fullname-end (point-marker))) + (goto-char fullname-start) + ;; Look for a character that cannot appear unquoted + ;; according to RFC 822. + (if (re-search-forward "[^- !#-'*+/-9=?A-Z^-~]" + fullname-end 1) + (progn + ;; Quote fullname, escaping specials. + (goto-char fullname-start) + (insert "\"") + (while (re-search-forward "[\"\\]" + fullname-end 1) + (replace-match "\\\\\\&" t)) + (insert "\"")))) + (insert " <" login ">\n")) + ((eq mail-from-style 'parens) + (insert "From: " login " (") + (let ((fullname-start (point))) + (insert fullname) + (let ((fullname-end (point-marker))) + (goto-char fullname-start) + ;; RFC 822 says \ and nonmatching parentheses + ;; must be escaped in comments. + ;; Escape every instance of ()\ ... + (while (re-search-forward "[()\\]" fullname-end 1) + (replace-match "\\\\\\&" t)) + ;; ... then undo escaping of matching parentheses, + ;; including matching nested parentheses. + (goto-char fullname-start) + (while (re-search-forward + "\\(\\=\\|[^\\]\\(\\\\\\\\\\)*\\)\\\\(\\(\\([^\\]\\|\\\\\\\\\\)*\\)\\\\)" + fullname-end 1) + (replace-match "\\1(\\3)" t) + (goto-char fullname-start)))) + (insert ")\n")) + ((null mail-from-style) + (insert "From: " login "\n"))))) + ;; Insert an extra newline if we need it to work around + ;; Sun's bug that swallows newlines. + (goto-char (1+ delimline)) + (if (eval mail-mailer-swallows-blank-line) + (newline)) + ;; Find and handle any FCC fields. + (goto-char (point-min)) + (if (re-search-forward "^FCC:" delimline t) + (mail-do-fcc delimline)) + (if mail-interactive + (save-excursion + (set-buffer errbuf) + (erase-buffer)))) + ;; + ;; + ;; + (let ((recipient-address-list + (or resend-to-addresses + (smtp-deduce-address-list (current-buffer) + (point-min) delimline)))) + (smtp-do-bcc delimline) + + (if recipient-address-list + (if (not (smtp-via-smtp recipient-address-list + (current-buffer))) + (error "Sending failed; SMTP protocol error")) + (error "Sending failed; no recipients")) + )) + (if (bufferp errbuf) + (kill-buffer errbuf))))) (defun message-send-news (&optional arg) (let ((tembuf (message-generate-new-buffer-clone-locals " *message temp*")) @@ -2547,7 +2559,7 @@ to find out how to use this." (message-check 'from (let* ((case-fold-search t) (from (message-fetch-field "from")) - (ad (nth 1 (funcall gnus-extract-address-components from)))) + (ad (nth 1 (mail-extract-address-components from)))) (cond ((not from) (message "There is no From line. Posting is denied.") @@ -2724,16 +2736,6 @@ to find out how to use this." (timezone-make-date-arpa-standard (current-time-string now) (current-time-zone now)))) -(defun message-make-followup-subject (subject) - "Make a followup Subject." - (cond - ((and (eq message-use-subject-re 'guess) - (string-match message-subject-encoded-re-regexp subject)) - subject) - (message-use-subject-re - (concat "Re: " (message-strip-subject-re subject))) - (t subject))) - (defun message-make-message-id () "Make a unique Message-ID." (concat "<" (message-unique-id) @@ -2830,20 +2832,18 @@ to find out how to use this." (defun message-make-in-reply-to () "Return the In-Reply-To header for this message." (when message-reply-headers - (let ((mid (mail-header-message-id message-reply-headers)) - (from (mail-header-from message-reply-headers)) + (let ((from (mail-header-from message-reply-headers)) (date (mail-header-date message-reply-headers))) - (when mid - (concat mid - (when from - (let ((stop-pos - (string-match " *at \\| *@ \\| *(\\| *<" from))) - (concat "\n (" - (if stop-pos (substring from 0 stop-pos) from) - "'s message of " - (if (or (not date) (string= date "")) - "(unknown date)" date) - ")")))))))) + (when from + (let ((stop-pos + (string-match " *at \\| *@ \\| *(\\| *<" from))) + (concat (if (and stop-pos + (not (zerop stop-pos))) + (substring from 0 stop-pos) from) + "'s message of \"" + (if (or (not date) (string= date "")) + "(unknown date)" date) + "\"")))))) (defun message-make-distribution () "Make a Distribution header." @@ -2947,7 +2947,7 @@ give as trustworthy answer as possible." "Return the pertinent part of `user-mail-address'." (when user-mail-address (if (string-match " " user-mail-address) - (nth 1 (funcall gnus-extract-address-components user-mail-address)) + (nth 1 (mail-extract-address-components user-mail-address)) user-mail-address))) (defun message-make-fqdn () @@ -2999,7 +2999,9 @@ Headers already prepared in the buffer are not modified." (To nil) (Distribution (message-make-distribution)) (Lines (message-make-lines)) - (User-Agent message-user-agent) + (X-Newsreader message-newsreader) + (X-Mailer (and (not (message-fetch-field "X-Newsreader")) + message-mailer)) (Expires (message-make-expires)) (case-fold-search t) header value elem) @@ -3096,15 +3098,13 @@ Headers already prepared in the buffer are not modified." (not (message-check-element 'sender)) (not (string= (downcase - (cadr (funcall gnus-extract-address-components - from))) + (cadr (mail-extract-address-components from))) (downcase secure-sender))) (or (null sender) (not (string= (downcase - (cadr (funcall gnus-extract-address-components - sender))) + (cadr (mail-extract-address-components sender))) (downcase secure-sender))))) (goto-char (point-min)) ;; Rename any old Sender headers to Original-Sender. @@ -3152,12 +3152,14 @@ Headers already prepared in the buffer are not modified." (if (or (= (following-char) ?,) (eobp)) (when (not quoted) - (if last - (save-excursion - (goto-char last) - (looking-at "[ \t]*") - (replace-match "\n " t t))) - (setq last (1+ (point)))) + (if (and (> (current-column) 78) + last) + (progn + (save-excursion + (goto-char last) + (insert "\n\t")) + (setq last (1+ (point)))) + (setq last (1+ (point))))) (setq quoted (not quoted))) (unless (eobp) (forward-char 1)))) @@ -3165,10 +3167,17 @@ Headers already prepared in the buffer are not modified." (widen) (forward-line 1))) +(defun message-fill-references (header value) + (insert (capitalize (symbol-name header)) + ": " + (std11-fill-msg-id-list-string + (if (consp value) (car value) value)) + "\n")) + (defun message-fill-header (header value) (let ((begin (point)) - (fill-column 78) - (fill-prefix " ")) + (fill-column 990) + (fill-prefix "\t")) (insert (capitalize (symbol-name header)) ": " (if (consp value) (car value) value) @@ -3236,7 +3245,7 @@ Headers already prepared in the buffer are not modified." (concat "*" type (if to (concat " to " - (or (car (funcall gnus-extract-address-components to)) + (or (car (mail-extract-address-components to)) to) "") "") (if (and group (not (string= group ""))) (concat " on " group) "") @@ -3396,10 +3405,10 @@ Headers already prepared in the buffer are not modified." "Start editing a reply to the article in the current buffer." (interactive) (let ((cur (current-buffer)) + from subject date reply-to to cc + references message-id follow-to (inhibit-point-motion-hooks t) - from date subject mct mft mrt - never-mct to cc - references message-id follow-to gnus-warning) + mct never-mct gnus-warning) (save-restriction (message-narrow-to-head) ;; Allow customizations to have their say. @@ -3414,120 +3423,73 @@ Headers already prepared in the buffer are not modified." (funcall message-wide-reply-to-function))))) ;; Find all relevant headers we need. (setq from (message-fetch-field "from") - date (message-fetch-field "date" t) + date (message-fetch-field "date") subject (or (message-fetch-field "subject") "none") - references (message-fetch-field "references") - message-id (message-fetch-field "message-id" t) to (message-fetch-field "to") cc (message-fetch-field "cc") - mct (when (and wide message-use-mail-copies-to) - (message-fetch-field "mail-copies-to")) - mft (when (and wide message-use-mail-followup-to) - (message-fetch-field "mail-followup-to")) - mrt (when message-use-mail-reply-to - (or (message-fetch-field "mail-reply-to") - (message-fetch-field "reply-to"))) - gnus-warning (message-fetch-field "gnus-warning")) - (when (and gnus-warning (string-match "<[^>]+>" gnus-warning)) - (setq message-id (match-string 0 gnus-warning))) + mct (message-fetch-field "mail-copies-to") + reply-to (message-fetch-field "reply-to") + references (message-fetch-field "references") + message-id (message-fetch-field "message-id" t)) ;; Remove any (buggy) Re:'s that are present and make a ;; proper one. - (setq subject (message-make-followup-subject subject)) - (widen)) + (when (string-match message-subject-re-regexp subject) + (setq subject (substring subject (match-end 0)))) + (setq subject (concat "Re: " subject)) - ;; Handle special values of Mail-Copies-To. - (when mct - (cond - ((and (equal (downcase mct) "never") - (or (not (eq message-use-mail-copies-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Copies-To: never? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: never' -directs you not to send your response to the author."))) - (setq never-mct t) - (setq mct nil)) - ((and (equal (downcase mct) "always") - (or (not (eq message-use-mail-copies-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Copies-To: always? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: always' -sends a copy of your response to the author."))) - (setq mct (or mrt from))) - ((and (eq message-use-mail-copies-to 'ask) - (not - (message-y-or-n-p - (concat "Obey Mail-Copies-To: " mct " ? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: " mct "' -sends a copy of your response to " (if (string-match "," mct) - "the specified addresses" - "that address") "."))) - (setq mct nil)) - )) - - (unless follow-to - (cond - (to-address (setq follow-to (list (cons 'To to-address)))) - ((not wide) (setq follow-to (list (cons 'To (or mrt from))))) - ;; Handle Mail-Followup-To. - ((and mft - (or (not (eq message-use-mail-followup-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Followup-To: " mft "? ") t "\ -You should normally obey the Mail-Followup-To: header. - - `Mail-Followup-To: " mft "' -directs your response to " (if (string-match "," mft) - "the specified addresses" - "that address only") ". - -A typical situation where Mail-Followup-To is used is when the author thinks -that further discussion should take place only in " - (if (string-match "," mft) - "the specified mailing lists" - "that mailing list") "."))) - (setq follow-to (list (cons 'To mft))) - (when mct - (push (cons 'Cc mct) follow-to))) - (t - (let (ccalist) - (save-excursion - (message-set-work-buffer) - (unless never-mct - (insert (or mrt from ""))) - (insert (if to (concat (if (bolp) "" ", ") to "") "")) - (insert (if mct (concat (if (bolp) "" ", ") mct) "")) - (insert (if cc (concat (if (bolp) "" ", ") cc) "")) - (goto-char (point-min)) - (while (re-search-forward "[ \t]+" nil t) - (replace-match " " t t)) - ;; Remove addresses that match `rmail-dont-reply-to-names'. - (insert (prog1 (rmail-dont-reply-to (buffer-string)) - (erase-buffer))) - (goto-char (point-min)) - ;; Perhaps Mail-Copies-To: never removed the only address? - (when (eobp) - (insert (or mrt from ""))) - (setq ccalist - (mapcar - (lambda (addr) - (cons (mail-strip-quoted-names addr) addr)) - (message-tokenize-header (buffer-string)))) - (let ((s ccalist)) - (while s - (setq ccalist (delq (assoc (car (pop s)) s) ccalist))))) - (setq follow-to (list (cons 'To (cdr (pop ccalist))))) - (when ccalist - (let ((ccs (cons 'Cc (mapconcat - (lambda (addr) (cdr addr)) ccalist ", ")))) - (when (string-match "^ +" (cdr ccs)) - (setcdr ccs (substring (cdr ccs) (match-end 0)))) - (push ccs follow-to))))))) + (when (and (setq gnus-warning (message-fetch-field "gnus-warning")) + (string-match "<[^>]+>" gnus-warning)) + (setq message-id (match-string 0 gnus-warning))) + + ;; Handle special values of Mail-Copies-To. + (when mct + (cond ((equal (downcase mct) "never") + (setq never-mct t) + (setq mct nil)) + ((equal (downcase mct) "always") + (setq mct (or reply-to from))))) + + (unless follow-to + (if (or (not wide) + to-address) + (progn + (setq follow-to (list (cons 'To (or to-address reply-to from)))) + (when (and wide mct) + (push (cons 'Cc mct) follow-to))) + (let (ccalist) + (save-excursion + (message-set-work-buffer) + (unless never-mct + (insert (or reply-to from ""))) + (insert (if to (concat (if (bolp) "" ", ") to "") "")) + (insert (if mct (concat (if (bolp) "" ", ") mct) "")) + (insert (if cc (concat (if (bolp) "" ", ") cc) "")) + (goto-char (point-min)) + (while (re-search-forward "[ \t]+" nil t) + (replace-match " " t t)) + ;; Remove addresses that match `rmail-dont-reply-to-names'. + (insert (prog1 (rmail-dont-reply-to (buffer-string)) + (erase-buffer))) + (goto-char (point-min)) + ;; Perhaps Mail-Copies-To: never removed the only address? + (when (eobp) + (insert (or reply-to from ""))) + (setq ccalist + (mapcar + (lambda (addr) + (cons (mail-strip-quoted-names addr) addr)) + (message-tokenize-header (buffer-string)))) + (let ((s ccalist)) + (while s + (setq ccalist (delq (assoc (car (pop s)) s) ccalist))))) + (setq follow-to (list (cons 'To (cdr (pop ccalist))))) + (when ccalist + (let ((ccs (cons 'Cc (mapconcat + (lambda (addr) (cdr addr)) ccalist ", ")))) + (when (string-match "^ +" (cdr ccs)) + (setcdr ccs (substring (cdr ccs) (match-end 0)))) + (push ccs follow-to)))))) + (widen)) (message-pop-to-buffer (message-buffer-name (if wide "wide reply" "reply") from @@ -3541,7 +3503,8 @@ that further discussion should take place only in " ,@follow-to ,@(if (or references message-id) `((References . ,(concat (or references "") (and references " ") - (or message-id "")))))) + (or message-id "")))) + nil)) cur))) ;;;###autoload @@ -3552,41 +3515,37 @@ that further discussion should take place only in " ;;;###autoload (defun message-followup (&optional to-newsgroups) - "Follow up to the message in the current buffer." + "Follow up to the message in the current buffer. +If TO-NEWSGROUPS, use that as the new Newsgroups line." (interactive) (let ((cur (current-buffer)) + from subject date reply-to mct + references message-id follow-to (inhibit-point-motion-hooks t) - from date subject mct mft mrt (message-this-is-news t) - followup-to distribution newsgroups posted-to - references message-id follow-to gnus-warning) + followup-to distribution newsgroups gnus-warning posted-to) (save-restriction - (message-narrow-to-head) - ;; Allow customizations to have their say. - ;; This is a followup. + (narrow-to-region + (goto-char (point-min)) + (if (search-forward "\n\n" nil t) + (1- (point)) + (point-max))) (when (message-functionp message-followup-to-function) (setq follow-to (funcall message-followup-to-function))) - ;; Find all relevant headers we need. (setq from (message-fetch-field "from") - date (message-fetch-field "date" t) + date (message-fetch-field "date") subject (or (message-fetch-field "subject") "none") references (message-fetch-field "references") message-id (message-fetch-field "message-id" t) - followup-to (when message-use-followup-to - (message-fetch-field "followup-to")) - distribution (message-fetch-field "distribution") + followup-to (message-fetch-field "followup-to") newsgroups (message-fetch-field "newsgroups") posted-to (message-fetch-field "posted-to") - mct (when message-use-mail-copies-to - (message-fetch-field "mail-copies-to")) - mft (when message-use-mail-followup-to - (message-fetch-field "mail-followup-to")) - mrt (when message-use-mail-reply-to - (or (message-fetch-field "mail-reply-to") - (message-fetch-field "reply-to"))) - gnus-warning (message-fetch-field "gnus-warning")) - (when (and gnus-warning (string-match "<[^>]+>" gnus-warning)) + reply-to (message-fetch-field "reply-to") + distribution (message-fetch-field "distribution") + mct (message-fetch-field "mail-copies-to")) + (when (and (setq gnus-warning (message-fetch-field "gnus-warning")) + (string-match "<[^>]+>" gnus-warning)) (setq message-id (match-string 0 gnus-warning))) ;; Remove bogus distribution. (when (and (stringp distribution) @@ -3595,68 +3554,40 @@ that further discussion should take place only in " (setq distribution nil)) ;; Remove any (buggy) Re:'s that are present and make a ;; proper one. - (setq subject (message-make-followup-subject subject)) + (when (string-match message-subject-re-regexp subject) + (setq subject (substring subject (match-end 0)))) + (setq subject (concat "Re: " subject)) (widen)) - ;; Handle special values of Mail-Copies-To. - (when mct - (cond - ((and (equal (downcase mct) "never") - (or (not (eq message-use-mail-copies-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Copies-To: never? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: never' -directs you not to send your response to the author."))) - (setq mct nil)) - ((and (equal (downcase mct) "always") - (or (not (eq message-use-mail-copies-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Copies-To: always? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: always' -sends a copy of your response to the author."))) - (setq mct (or mrt from))) - ((and (eq message-use-mail-copies-to 'ask) - (not - (message-y-or-n-p - (concat "Obey Mail-Copies-To: " mct " ? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: " mct "' -sends a copy of your response to " (if (string-match "," mct) - "the specified addresses" - "that address") "."))) - (setq mct nil)) - )) - - (unless follow-to - (cond - (to-newsgroups (setq follow-to (list (cons 'Newsgroups to-newsgroups)))) - ;; Handle Followup-To. - (followup-to - (cond - ((equal (downcase followup-to) "poster") - (if (or (eq message-use-followup-to 'use) - (message-y-or-n-p "Obey Followup-To: poster? " t "\ + (message-pop-to-buffer (message-buffer-name "followup" from newsgroups)) + + (message-setup + `((Subject . ,subject) + ,@(cond + (to-newsgroups + (list (cons 'Newsgroups to-newsgroups))) + (follow-to follow-to) + ((and followup-to message-use-followup-to) + (list + (cond + ((equal (downcase followup-to) "poster") + (if (or (eq message-use-followup-to 'use) + (message-y-or-n-p "Obey Followup-To: poster? " t "\ You should normally obey the Followup-To: header. - `Followup-To: poster' -sends your response via e-mail instead of news. +`Followup-To: poster' sends your response via e-mail instead of news. -A typical situation where `Followup-To: poster' is used is when the author +A typical situation where `Followup-To: poster' is used is when the poster does not read the newsgroup, so he wouldn't see any replies sent to it.")) - (setq message-this-is-news nil - distribution nil - follow-to (list (cons 'To (or mrt from "")))) - (setq follow-to (list (cons 'Newsgroups newsgroups))))) - (t - (if (or (equal followup-to newsgroups) - (not (eq message-use-followup-to 'ask)) - (message-y-or-n-p - (concat "Obey Followup-To: " followup-to "? ") t "\ + (progn + (setq message-this-is-news nil) + (cons 'To (or reply-to from ""))) + (cons 'Newsgroups newsgroups))) + (t + (if (or (equal followup-to newsgroups) + (not (eq message-use-followup-to 'ask)) + (message-y-or-n-p + (concat "Obey Followup-To: " followup-to "? ") t "\ You should normally obey the Followup-To: header. `Followup-To: " followup-to "' @@ -3671,46 +3602,27 @@ be fragmented and very difficult to follow. Also, some source/announcement newsgroups are not indented for discussion; responses here are directed to other newsgroups.")) - (setq follow-to (list (cons 'Newsgroups followup-to))) - (setq follow-to (list (cons 'Newsgroups newsgroups))))))) - ;; Handle Mail-Followup-To, followup via e-mail. - ((and mft - (or (not (eq message-use-mail-followup-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Followup-To: " mft "? ") t "\ -You should normally obey the Mail-Followup-To: header. - - `Mail-Followup-To: " mft "' -directs your response to " (if (string-match "," mft) - "the specified addresses" - "that address only") " instead of news. - -A typical situation where Mail-Followup-To is used is when the author thinks -that further discussion should take place only in " - (if (string-match "," mft) - "the specified mailing lists" - "that mailing list") "."))) - (setq message-this-is-news nil - distribution nil - follow-to (list (cons 'To mft)))) - (posted-to (setq follow-to (list (cons 'Newsgroups posted-to)))) - (t - (setq follow-to (list (cons 'Newsgroups newsgroups)))))) + (cons 'Newsgroups followup-to) + (cons 'Newsgroups newsgroups)))))) + (posted-to + `((Newsgroups . ,posted-to))) + (t + `((Newsgroups . ,newsgroups)))) + ,@(and distribution (list (cons 'Distribution distribution))) + ,@(if (or references message-id) + `((References . ,(concat (or references "") (and references " ") + (or message-id ""))))) + ,@(when (and mct + (not (equal (downcase mct) "never"))) + (list (cons 'Cc (if (equal (downcase mct) "always") + (or reply-to from "") + mct))))) - (message-pop-to-buffer (message-buffer-name "followup" from newsgroups)) + cur) (setq message-reply-headers - (vector 0 subject from date message-id references 0 0 "")) + (vector 0 subject from date message-id references 0 0 "")))) - (message-setup - `((Subject . ,subject) - ,@follow-to - ,@(and mct (list (cons 'Cc mct))) - ,@(and distribution (list (cons 'Distribution distribution))) - ,@(if (or references message-id) - `((References . ,(concat (or references "") (and references " ") - (or message-id "")))))) - cur))) ;;;###autoload (defun message-cancel-news () @@ -3735,10 +3647,9 @@ that further discussion should take place only in " (downcase sender) (downcase (message-make-sender)))) (string-equal - (downcase (cadr (funcall gnus-extract-address-components - from))) - (downcase (cadr (funcall gnus-extract-address-components - (message-make-from)))))) + (downcase (cadr (mail-extract-address-components from))) + (downcase (cadr (mail-extract-address-components + (message-make-from)))))) (error "This article is not yours")) ;; Make control message. (setq buf (set-buffer (get-buffer-create " *message cancel*"))) @@ -3772,8 +3683,8 @@ header line with the old Message-ID." ;; Check whether the user owns the article that is to be superseded. (unless (string-equal (downcase (or (message-fetch-field "sender") - (cadr (funcall gnus-extract-address-components - (message-fetch-field "from"))))) + (cadr (mail-extract-address-components + (message-fetch-field "from"))))) (downcase (message-make-sender))) (error "This article is not yours")) ;; Get a normal message buffer. @@ -3925,7 +3836,7 @@ you." (insert-buffer-substring cur) (undo-boundary) (message-narrow-to-head) - (if (and (message-fetch-field "MIME-Version") + (if (and (message-fetch-field "Mime-Version") (setq boundary (message-fetch-field "Content-Type"))) (if (string-match "boundary=\"\\([^\"]+\\)\"" boundary) (setq boundary (concat (match-string 1 boundary) " *\n" diff --git a/make.bat b/make.bat index d183af9..4a6b8a0 100755 --- a/make.bat +++ b/make.bat @@ -1,57 +1,57 @@ -@echo off - -rem Written by David Charlap - -rem There are two catches, however. The emacs.bat batch file may not exist -rem in all distributions. It is part of the Voelker build of Emacs 19.34 -rem (http://www.cs.washington.edu/homes/voelker/ntemacs.html). If the user -rem installs Gnus with some other build, he may have to replace calls to -rem %1\emacs.bat with something else. -rem -rem Also, the emacs.bat file that Voelker ships does not accept more than 9 -rem parameters, so the attempts to compile the .texi files will fail. To -rem fix that (at least on NT. I don't know about Win95), the following -rem change should be made to emacs.bat: -rem -rem %emacs_dir%\bin\emacs.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 -rem -rem should become -rem -rem %emacs_dir%\bin\emacs.exe %* -rem -rem which will allow the batch file to accept an unlimited number of -rem parameters. - -if "%1" == "" goto usage - -cd lisp -call %1\bin\emacs.bat -batch -q -no-site-file -l ./dgnushack.el -f dgnushack-compile -if not "%2" == "copy" goto info -copy *.el* %1\lisp - -:info -cd ..\texi -call %1\bin\emacs.bat -batch -q -no-site-file gnus.texi -l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer -call %1\bin\emacs.bat -batch -q -no-site-file message.texi -l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer -if not "%2" == "copy" goto done -copy gnus %1\info -copy gnus-?? %1\info -copy message %1\info - -:etc -cd ..\etc -copy gnus-tut.txt %1\etc - -:done -cd .. -goto end - -:usage -echo Usage: make ^ [copy] -echo. -echo where: ^ is the directory you installed emacs in -echo eg. d:\emacs\19.34 -echo copy indicates that the compiled files should be copied to your -echo emacs lisp, info, and etc directories - -:end +@echo off + +rem Written by David Charlap + +rem There are two catches, however. The emacs.bat batch file may not exist +rem in all distributions. It is part of the Voelker build of Emacs 19.34 +rem (http://www.cs.washington.edu/homes/voelker/ntemacs.html). If the user +rem installs Gnus with some other build, he may have to replace calls to +rem %1\emacs.bat with something else. +rem +rem Also, the emacs.bat file that Voelker ships does not accept more than 9 +rem parameters, so the attempts to compile the .texi files will fail. To +rem fix that (at least on NT. I don't know about Win95), the following +rem change should be made to emacs.bat: +rem +rem %emacs_dir%\bin\emacs.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 +rem +rem should become +rem +rem %emacs_dir%\bin\emacs.exe %* +rem +rem which will allow the batch file to accept an unlimited number of +rem parameters. + +if "%1" == "" goto usage + +cd lisp +call %1\bin\emacs.bat -batch -q -no-site-file -l ./dgnushack.el -f dgnushack-compile +if not "%2" == "copy" goto info +copy *.el* %1\lisp + +:info +cd ..\texi +call %1\bin\emacs.bat -batch -q -no-site-file gnus.texi -l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer +call %1\bin\emacs.bat -batch -q -no-site-file message.texi -l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer +if not "%2" == "copy" goto done +copy gnus %1\info +copy gnus-?? %1\info +copy message %1\info + +:etc +cd ..\etc +copy gnus-tut.txt %1\etc + +:done +cd .. +goto end + +:usage +echo Usage: make ^ [copy] +echo. +echo where: ^ is the directory you installed emacs in +echo eg. d:\emacs\19.34 +echo copy indicates that the compiled files should be copied to your +echo emacs lisp, info, and etc directories + +:end diff --git a/texi/ChangeLog b/texi/ChangeLog index d575325..a2ec074 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,11 @@ +1998-08-09 15:32:24 Lars Magne Ingebrigtsen + + * gnus.texi (Hiding Headers): Fix. + +1998-08-08 06:06:37 Lars Magne Ingebrigtsen + + * gnus.texi (Fancy Mail Splitting): Change. + 1998-08-06 02:12:04 Lars Magne Ingebrigtsen * gnus.texi: De-legalize. diff --git a/texi/gnus.texi b/texi/gnus.texi index 14350f8..3647abd 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -1,7 +1,7 @@ \input texinfo @c -*-texinfo-*- @setfilename gnus -@settitle Semi-gnus 6.8.6 Manual +@settitle Semi-gnus 6.8.8 Manual @synindex fn cp @synindex vr cp @synindex pg cp @@ -316,7 +316,7 @@ into another language, under the above conditions for modified versions. @tex @titlepage -@title Semi-gnus 6.8.6 Manual +@title Semi-gnus 6.8.8 Manual @author by Lars Magne Ingebrigtsen @page @@ -359,7 +359,7 @@ internationalization/localization and multiscript features based on MULE API. So Semi-gnus does not discriminate various language communities. Oh, if you are a Klingon, please wait Unicode Next Generation. -This manual corresponds to Semi-gnus 6.8.6. +This manual corresponds to Semi-gnus 6.8.7. @end ifinfo @@ -7774,15 +7774,15 @@ These conditions are: @table @code @item empty Remove all empty headers. -@item newsgroups -Remove the @code{Newsgroups} header if it only contains the current group -name. @item followup-to Remove the @code{Followup-To} header if it is identical to the @code{Newsgroups} header. @item reply-to Remove the @code{Reply-To} header if it lists the same address as the @code{From} header. +@item newsgroups +Remove the @code{Newsgroups} header if it only contains the current group +name. @item date Remove the @code{Date} header if the article is less than three days old. @@ -7792,11 +7792,11 @@ Remove the @code{To} header if it is very long. Remove all @code{To} headers if there are more than one. @end table -To include the four first elements, you could say something like; +To include the four three elements, you could say something like; @lisp (setq gnus-boring-article-headers - '(empty newsgroups followup-to reply-to)) + '(empty followup-to reply-to)) @end lisp This is also the default value for this variable. @@ -9675,7 +9675,7 @@ information in the headers (i.e., do @code{replace-match}-like substitutions in the group names), you can say things like: @example -(any "debian-\\(\\w*\\)@@lists.debian.org" "mail.debian.\\1") +(any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1") @end example If the string contains the element @samp{\&}, then the previously @@ -15388,7 +15388,7 @@ On July 28th 1996 work on Red Gnus was begun, and it was released on January 25th 1997 (after 84 releases) as ``Gnus 5.4'' (67 releases). On September 13th 1997, Quassia Gnus was started and lasted 37 -releases. If was released as ``Gnus 5.6.29' on March 8th 1998. +releases. If was released as ``Gnus 5.6.30' on March 8th 1998. If you happen upon a version of Gnus that has a prefixed name -- ``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'' -- @@ -15865,7 +15865,7 @@ actually are people who are using Gnus. Who'd'a thunk it! * ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus. * September Gnus:: The Thing Formally Known As Gnus 5.3/5.3. * Red Gnus:: Third time best---Gnus 5.4/5.5. -* Quassia Gnus:: Two times two is four, or Gnus 5.6.29. +* Quassia Gnus:: Two times two is four, or Gnus 5.6.30. @end menu These lists are, of course, just @emph{short} overviews of the @@ -16400,7 +16400,7 @@ Emphasized text can be properly fontisized: @node Quassia Gnus @subsubsection Quassia Gnus -New features in Gnus 5.6.29: +New features in Gnus 5.6.30: @itemize @bullet @@ -17721,6 +17721,9 @@ many articles in the cache, since it regenerates big parts of the summary buffer for each article. @item +Implement gnus-batch-brew-soup. + +@item Solve the halting problem. @c TODO diff --git a/texi/message.texi b/texi/message.texi index 13e58d6..1d194f9 100644 --- a/texi/message.texi +++ b/texi/message.texi @@ -1,7 +1,7 @@ \input texinfo @c -*-texinfo-*- @setfilename message -@settitle Message 5.6.29 Manual +@settitle Message 5.6.30 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 Message 5.6.29 Manual +@title Message 5.6.30 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 Message 5.6.29. Message is distributed with +This manual corresponds to Message 5.6.30. Message is distributed with the Gnus distribution bearing the same version number as this manual has.