Mercurial > hg > xemacs-beta
diff lisp/gnus/message.el @ 30:ec9a17fef872 r19-15b98
Import from CVS: tag r19-15b98
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:52:29 +0200 |
parents | 1917ad0d78d7 |
children | e04119814345 |
line wrap: on
line diff
--- a/lisp/gnus/message.el Mon Aug 13 08:51:58 2007 +0200 +++ b/lisp/gnus/message.el Mon Aug 13 08:52:29 2007 +0200 @@ -29,8 +29,7 @@ ;;; Code: -(eval-when-compile - (require 'cl)) +(require 'cl) (require 'mailheader) (require 'rmail) (require 'nnheader) @@ -167,8 +166,8 @@ :group 'message-news) (defcustom message-required-news-headers - '(From Newsgroups Subject Date Message-ID - (optional . Organization) Lines + '(From Newsgroups Subject Date Message-ID + (optional . Organization) Lines (optional . X-Newsreader)) "Headers to be generated or prompted for when posting an article. RFC977 and RFC1036 require From, Date, Newsgroups, Subject, @@ -179,7 +178,7 @@ :group 'message-headers :type '(repeat sexp)) -(defcustom message-required-mail-headers +(defcustom message-required-mail-headers '(From Subject Date (optional . In-Reply-To) Message-ID Lines (optional . X-Mailer)) "Headers to be generated or prompted for when mailing a message. @@ -194,7 +193,7 @@ :group 'message-headers :type 'sexp) -(defcustom message-ignored-news-headers +(defcustom message-ignored-news-headers "^NNTP-Posting-Host:\\|^Xref:\\|^Bcc:\\|^Gcc:\\|^Fcc:\\|^Resent-Fcc:" "*Regexp of headers to be removed unconditionally before posting." :group 'message-news @@ -223,7 +222,7 @@ (defcustom message-elide-elipsis "\n[...]\n\n" "*The string which is inserted for elided text.") -(defcustom message-interactive nil +(defcustom message-interactive nil "Non-nil means when sending a message wait for and display errors. nil means let mailer mail back a message to report errors." :group 'message-sending @@ -246,7 +245,7 @@ :type 'boolean) (defvar gnus-local-organization) -(defcustom message-user-organization +(defcustom message-user-organization (or (and (boundp 'gnus-local-organization) (stringp gnus-local-organization) gnus-local-organization) @@ -271,7 +270,7 @@ :group 'message-buffers :type 'directory) -(defcustom message-forward-start-separator +(defcustom message-forward-start-separator "------- Start of forwarded message -------\n" "*Delimiter inserted before forwarded messages." :group 'message-forwarding @@ -288,7 +287,7 @@ :group 'message-forwarding :type 'boolean) -(defcustom message-included-forward-headers +(defcustom message-included-forward-headers "^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:" "*Regexp matching headers to be included in forwarded messages." :group 'message-forwarding @@ -390,7 +389,7 @@ (defvar gnus-post-method) (defvar gnus-select-method) -(defcustom message-post-method +(defcustom message-post-method (cond ((and (boundp 'gnus-post-method) gnus-post-method) gnus-post-method) @@ -417,7 +416,7 @@ (defcustom message-signature-setup-hook nil "Normal hook, run each time a new outgoing message is initialized. -It is run after the headers have been inserted and before +It is run after the headers have been inserted and before the signature is inserted." :group 'message-various :type 'hook) @@ -556,7 +555,7 @@ ;; Note: could use /usr/ucb/mail instead of sendmail; ;; options -t, and -v if not interactive. (defcustom message-mailer-swallows-blank-line - (if (and (string-match "sparc-sun-sunos\\(\\'\\|[^5]\\)" + (if (and (string-match "sparc-sun-sunos\\(\\'\\|[^5]\\)" system-configuration) (file-readable-p "/etc/sendmail.cf") (let ((buffer (get-buffer-create " *temp*"))) @@ -582,7 +581,7 @@ (ignore-errors (define-mail-user-agent 'message-user-agent - 'message-mail 'message-send-and-exit + 'message-mail 'message-send-and-exit 'message-kill-buffer 'message-send-hook)) (defvar message-mh-deletable-headers '(Message-ID Date Lines Sender) @@ -591,7 +590,7 @@ ;;; Internal variables. ;;; Well, not really internal. -(defvar message-mode-syntax-table +(defvar message-mode-syntax-table (let ((table (copy-syntax-table text-mode-syntax-table))) (modify-syntax-entry ?% ". " table) table) @@ -600,27 +599,153 @@ (defvar message-mode-abbrev-table text-mode-abbrev-table "Abbrev table used in Message mode buffers. Defaults to `text-mode-abbrev-table'.") +(defgroup message-headers nil + "Message headers." + :link '(custom-manual "(message)Variables") + :group 'message) + +(defface message-header-to-face + '((((class color) + (background dark)) + (:foreground "green2" :bold t)) + (((class color) + (background light)) + (:foreground "MidnightBlue" :bold t)) + (t + (:bold t :italic t))) + "Face used for displaying From headers." + :group 'message-headers) + +(defface message-header-cc-face + '((((class color) + (background dark)) + (:foreground "green4" :bold t)) + (((class color) + (background light)) + (:foreground "MidnightBlue")) + (t + (:bold t))) + "Face used for displaying Cc headers." + :group 'message-headers) + +(defface message-header-subject-face + '((((class color) + (background dark)) + (:foreground "green3")) + (((class color) + (background light)) + (:foreground "navy blue" :bold t)) + (t + (:bold t))) + "Face used for displaying subject headers." + :group 'message-headers) + +(defface message-header-newsgroups-face + '((((class color) + (background dark)) + (:foreground "yellow" :bold t :italic t)) + (((class color) + (background light)) + (:foreground "blue4" :bold t :italic t)) + (t + (:bold t :italic t))) + "Face used for displaying newsgroups headers." + :group 'message-headers) + +(defface message-header-other-face + '((((class color) + (background dark)) + (:foreground "red4")) + (((class color) + (background light)) + (:foreground "steel blue")) + (t + (:bold t :italic t))) + "Face used for displaying newsgroups headers." + :group 'message-headers) + +(defface message-header-name-face + '((((class color) + (background dark)) + (:foreground "DarkGreen")) + (((class color) + (background light)) + (:foreground "cornflower blue")) + (t + (:bold t))) + "Face used for displaying header names." + :group 'message-headers) + +(defface message-header-xheader-face + '((((class color) + (background dark)) + (:foreground "blue")) + (((class color) + (background light)) + (:foreground "blue")) + (t + (:bold t))) + "Face used for displaying X-Header headers." + :group 'message-headers) + +(defface message-separator-face + '((((class color) + (background dark)) + (:foreground "blue4")) + (((class color) + (background light)) + (:foreground "brown")) + (t + (:bold t))) + "Face used for displaying the separator." + :group 'message-headers) + +(defface message-cited-text-face + '((((class color) + (background dark)) + (:foreground "red")) + (((class color) + (background light)) + (:foreground "red")) + (t + (:bold t))) + "Face used for displaying cited text names." + :group 'message-headers) (defvar message-font-lock-keywords - (let* ((cite-prefix "A-Za-z") (cite-suffix (concat cite-prefix "0-9_.@-"))) - (list '("^To:" . font-lock-function-name-face) - '("^[GBF]?[Cc][Cc]:\\|^Reply-To:" . font-lock-keyword-face) - '("^\\(Subject:\\)[ \t]*\\(.+\\)?" - (1 font-lock-comment-face) (2 font-lock-type-face nil t)) - (list (concat "^\\(" (regexp-quote mail-header-separator) "\\)$") - 1 'font-lock-comment-face) - (cons (concat "^[ \t]*" - "\\([" cite-prefix "]+[" cite-suffix "]*\\)?" - "[>|}].*") - 'font-lock-reference-face) - '("^\\(X-[A-Za-z0-9-]+\\|In-Reply-To\\):.*" - . font-lock-string-face))) + (let* ((cite-prefix "A-Za-z") + (cite-suffix (concat cite-prefix "0-9_.@-")) + (content "[ \t]*\\(.+\\(\n[ \t].*\\)*\\)")) + `((,(concat "^\\(To:\\)" content) + (1 'message-header-name-face) + (2 'message-header-to-face nil t)) + (,(concat "^\\(^[GBF]?[Cc][Cc]:\\|^Reply-To:\\)" content) + (1 'message-header-name-face) + (2 'message-header-cc-face nil t)) + (,(concat "^\\(Subject:\\)" content) + (1 'message-header-name-face) + (2 'message-header-subject-face nil t)) + (,(concat "^\\(Newsgroups:\\|Followup-to:\\)" content) + (1 'message-header-name-face) + (2 'message-header-newsgroups-face nil t)) + (,(concat "^\\([^: \n\t]+:\\)" content) + (1 'message-header-name-face) + (2 'message-header-other-face nil t)) + (,(concat "^\\(X-[A-Za-z0-9-]+\\|In-Reply-To\\):" content) + (1 'message-header-name-face) + (2 'message-header-name-face)) + (,(concat "^\\(" (regexp-quote mail-header-separator) "\\)$") + 1 'message-separator-face) + (,(concat "^[ \t]*" + "\\([" cite-prefix "]+[" cite-suffix "]*\\)?" + "[>|}].*") + (0 'message-cited-text-face)))) "Additional expressions to highlight in Message mode.") (defvar message-face-alist '((bold . bold-region) (underline . underline-region) - (default . (lambda (b e) + (default . (lambda (b e) (unbold-region b e) (ununderline-region b e)))) "Alist of mail and news faces for facemenu. @@ -658,7 +783,7 @@ (defvar gnus-read-active-file) ;;; Regexp matching the delimiter of messages in UNIX mail format -;;; (UNIX From lines), minus the initial ^. +;;; (UNIX From lines), minus the initial ^. (defvar message-unix-mail-delimiter (let ((time-zone-regexp (concat "\\([A-Z]?[A-Z]?[A-Z][A-Z]\\( DST\\)?" @@ -706,9 +831,9 @@ "^|? *---+ +Message text follows: +---+ *|?$") "A regexp that matches the separator before the text of a failed message.") -(defvar message-header-format-alist +(defvar message-header-format-alist `((Newsgroups) - (To . message-fill-address) + (To . message-fill-address) (Cc . message-fill-address) (Subject) (In-Reply-To) @@ -731,11 +856,12 @@ (autoload 'gnus-point-at-eol "gnus-util") (autoload 'gnus-point-at-bol "gnus-util") (autoload 'gnus-output-to-mail "gnus-util") - (autoload 'gnus-output-to-rmail "gnus-util")) + (autoload 'gnus-output-to-rmail "gnus-util") + (autoload 'mail-abbrev-in-expansion-header-p "mailabbrev")) -;;; +;;; ;;; Utility functions. ;;; @@ -782,6 +908,16 @@ (setq paren nil)))) (nreverse elems))))) +(defun message-mail-file-mbox-p (file) + "Say whether FILE looks like a Unix mbox file." + (when (and (file-exists-p file) + (file-readable-p file) + (file-regular-p file)) + (nnheader-temp-write nil + (nnheader-insert-file-contents file) + (goto-char (point-min)) + (looking-at message-unix-mail-delimiter)))) + (defun message-fetch-field (header &optional not-all) "The same as `mail-fetch-field', only remove all newlines." (let ((value (mail-fetch-field header nil (not not-all)))) @@ -896,12 +1032,12 @@ (not (if (re-search-forward "^[^ \t]" nil t) (beginning-of-line) (goto-char (point-max))))) - + (defun message-sort-headers-1 () "Sort the buffer as headers using `message-rank' text props." (goto-char (point-min)) - (sort-subr - nil 'message-next-header + (sort-subr + nil 'message-next-header (lambda () (message-next-header) (unless (bobp) @@ -961,7 +1097,7 @@ (define-key message-mode-map "\C-c\C-t" 'message-insert-to) (define-key message-mode-map "\C-c\C-n" 'message-insert-newsgroups) - + (define-key message-mode-map "\C-c\C-y" 'message-yank-original) (define-key message-mode-map "\C-c\C-q" 'message-fill-yanked-message) (define-key message-mode-map "\C-c\C-w" 'message-insert-signature) @@ -978,7 +1114,7 @@ (define-key message-mode-map "\t" 'message-tab)) -(easy-menu-define +(easy-menu-define message-mode-menu message-mode-map "Message Menu." '("Message" ["Sort Headers" message-sort-headers t] @@ -994,7 +1130,7 @@ ["Send Message" message-send-and-exit t] ["Abort Message" message-dont-send t])) -(easy-menu-define +(easy-menu-define message-mode-field-menu message-mode-map "" '("Field" ["Fetch To" message-insert-to t] @@ -1177,7 +1313,7 @@ "Insert a To header that points to the author of the article being replied to." (interactive) (let ((co (message-fetch-field "courtesy-copies-to"))) - (when (and co + (when (and co (equal (downcase co) "never")) (error "The user has requested not to have copies sent via mail"))) (when (and (message-position-on-field "To") @@ -1203,7 +1339,7 @@ (defun message-insert-signature (&optional force) "Insert a signature. See documentation for the `message-signature' variable." (interactive (list 0)) - (let* ((signature + (let* ((signature (cond ((and (null message-signature) (eq force 0)) @@ -1266,17 +1402,17 @@ (/= (aref message-caesar-translation-table ?a) (+ ?a n))) (setq message-caesar-translation-table (message-make-caesar-translation-table n))) - ;; Then we translate the region. Do it this way to retain + ;; Then we translate the region. Do it this way to retain ;; text properties. (while (< b e) - (subst-char-in-region + (subst-char-in-region b (1+ b) (char-after b) (aref message-caesar-translation-table (char-after b))) (incf b)))) (defun message-make-caesar-translation-table (n) "Create a rot table with offset N." - (let ((i -1) + (let ((i -1) (table (make-string 256 0))) (while (< (incf i) 256) (aset table i i)) @@ -1313,17 +1449,17 @@ (unless (equal 0 (call-process-region (point-min) (point-max) program t t)) (insert body) - (gnus-message 1 "%s failed." program)))))) + (message "%s failed." program)))))) (defun message-rename-buffer (&optional enter-string) - "Rename the *message* buffer to \"*message* RECIPIENT\". + "Rename the *message* buffer to \"*message* RECIPIENT\". If the function is run with a prefix, it will ask for a new buffer name, rather than giving an automatic name." (interactive "Pbuffer name: ") (save-excursion (save-restriction (goto-char (point-min)) - (narrow-to-region (point) + (narrow-to-region (point) (search-forward mail-header-separator nil 'end)) (let* ((mail-to (or (if (message-news-p) (message-fetch-field "Newsgroups") @@ -1362,7 +1498,7 @@ ;; Remove unwanted headers. (when message-ignored-cited-headers (save-restriction - (narrow-to-region + (narrow-to-region (goto-char start) (if (search-forward "\n\n" nil t) (1- (point)) @@ -1417,7 +1553,7 @@ (defun message-cite-original () "Cite function in the standard Message manner." (let ((start (point)) - (functions + (functions (when message-indent-citation-function (if (listp message-indent-citation-function) message-indent-citation-function @@ -1441,7 +1577,7 @@ (narrow-to-region (goto-char (point-min)) (progn - (re-search-forward + (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$")) (match-beginning 0))) (goto-char (point-min)) @@ -1452,7 +1588,7 @@ (skip-chars-backward "\n") t) (while (and afters - (not (re-search-forward + (not (re-search-forward (concat "^" (regexp-quote (car afters)) ":") nil t))) (pop afters)) @@ -1515,9 +1651,10 @@ (defun message-kill-buffer () "Kill the current buffer." (interactive) - (let ((actions message-kill-actions)) - (kill-buffer (current-buffer)) - (message-do-actions actions))) + (when (yes-or-no-p "Kill the buffer? ") + (let ((actions message-kill-actions)) + (kill-buffer (current-buffer)) + (message-do-actions actions)))) (defun message-bury (buffer) "Bury this mail buffer." @@ -1594,7 +1731,7 @@ ;; Now perform actions on successful sending. (while actions (ignore-errors - (cond + (cond ;; A simple function. ((message-functionp (car actions)) (funcall (car actions))) @@ -1622,7 +1759,7 @@ (set-buffer tembuf) (erase-buffer) ;; Avoid copying text props. - (insert (format + (insert (format "%s" (save-excursion (set-buffer mailbuf) (buffer-string)))) @@ -1732,7 +1869,7 @@ ;; ;; qmail also has the advantage of not having been raped by ;; various vendors, so we don't have to allow for that, either -- - ;; compare this with message-send-mail-with-sendmail and weep + ;; compare this with message-send-mail-with-sendmail and weep ;; for sendmail's lost innocence. ;; ;; all this is way cool coz it lets us keep the arguments entirely @@ -1752,7 +1889,7 @@ "Send the prepared message buffer with mh." (let ((mh-previous-window-config nil) (name (make-temp-name - (concat (file-name-as-directory + (concat (file-name-as-directory (expand-file-name message-autosave-directory)) "msg.")))) (setq buffer-file-name name) @@ -1760,8 +1897,8 @@ (when message-mh-deletable-headers (let ((headers message-mh-deletable-headers)) (while headers - (goto-char (point-min)) - (and (re-search-forward + (goto-char (point-min)) + (and (re-search-forward (concat "^" (symbol-name (car headers)) ": *") nil t) (message-delete-line)) (pop headers)))) @@ -1797,9 +1934,9 @@ (save-excursion (set-buffer tembuf) (buffer-disable-undo (current-buffer)) - (erase-buffer) + (erase-buffer) ;; Avoid copying text props. - (insert (format + (insert (format "%s" (save-excursion (set-buffer messbuf) (buffer-string)))) @@ -1859,7 +1996,7 @@ (save-excursion (save-restriction (widen) - (and + (and ;; We narrow to the headers and check them first. (save-excursion (save-restriction @@ -1869,7 +2006,7 @@ (message-check-news-body-syntax))))) (defun message-check-news-header-syntax () - (and + (and ;; Check for commands in Subject. (message-check 'subject-cmsg (if (string-match "^cmsg " (message-fetch-field "subject")) @@ -1879,11 +2016,11 @@ ;; Check for multiple identical headers. (message-check 'multiple-headers (let (found) - (while (and (not found) + (while (and (not found) (re-search-forward "^[^ \t:]+: " nil t)) (save-excursion - (or (re-search-forward - (concat "^" + (or (re-search-forward + (concat "^" (regexp-quote (setq found (buffer-substring @@ -1899,7 +2036,7 @@ (if (re-search-forward "^Sendsys:\\|^Version:" nil t) (y-or-n-p (format "The article contains a %s command. Really post? " - (buffer-substring (match-beginning 0) + (buffer-substring (match-beginning 0) (1- (match-end 0))))) t)) ;; See whether we can shorten Followup-To. @@ -1913,11 +2050,11 @@ (not (zerop (length - (setq to (completing-read - "Followups to: (default all groups) " + (setq to (completing-read + "Followups to: (default all groups) " (mapcar (lambda (g) (list g)) - (cons "poster" - (message-tokenize-header + (cons "poster" + (message-tokenize-header newsgroups))))))))) (goto-char (point-min)) (insert "Followup-To: " to "\n")) @@ -1951,7 +2088,7 @@ (and subject (not (string-match "\\`[ \t]*\\'" subject))) (ignore - (message + (message "The subject field is empty or missing. Posting is denied."))))) ;; Check the Newsgroups & Followup-To headers. (message-check 'existing-newsgroups @@ -1991,12 +2128,12 @@ (while (and headers (not error)) (when (setq header (mail-fetch-field (car headers))) (if (or - (not + (not (string-match "\\`\\([-+_&.a-zA-Z0-9]+\\)?\\(,[-+_&.a-zA-Z0-9]+\\)*\\'" header)) - (memq - nil (mapcar + (memq + nil (mapcar (lambda (g) (not (string-match "\\.\\'\\|\\.\\." g))) (message-tokenize-header header ",")))) @@ -2059,7 +2196,7 @@ ;; Check for control characters. (message-check 'control-chars (if (re-search-forward "[\000-\007\013\015-\037\200-\237]" nil t) - (y-or-n-p + (y-or-n-p "The article contains control characters. Really post? ") t)) ;; Check excessive size. @@ -2140,7 +2277,7 @@ (rmail-output file 1 nil t) (let ((mail-use-rfc822 t)) (rmail-output file 1 t t)))))) - + (kill-buffer (current-buffer))))) (defun message-output (filename) @@ -2184,19 +2321,19 @@ (defun message-make-date () "Make a valid data header." (let ((now (current-time))) - (timezone-make-date-arpa-standard + (timezone-make-date-arpa-standard (current-time-string now) (current-time-zone now)))) (defun message-make-message-id () "Make a unique Message-ID." - (concat "<" (message-unique-id) + (concat "<" (message-unique-id) (let ((psubject (save-excursion (message-fetch-field "subject")))) (if (and message-reply-headers (mail-header-references message-reply-headers) (mail-header-subject message-reply-headers) psubject (mail-header-subject message-reply-headers) - (not (string= + (not (string= (message-strip-subject-re (mail-header-subject message-reply-headers)) (message-strip-subject-re psubject)))) @@ -2225,7 +2362,7 @@ (aset user (match-beginning 0) ?_)) user) (message-number-base36 (user-uid) -1)) - (message-number-base36 (+ (car tm) + (message-number-base36 (+ (car tm) (lsh (% message-unique-id-char 25) 16)) 4) (message-number-base36 (+ (nth 1 tm) (lsh (/ message-unique-id-char 25) 16)) 4) @@ -2245,7 +2382,7 @@ (defun message-make-organization () "Make an Organization header." - (let* ((organization + (let* ((organization (or (getenv "ORGANIZATION") (when message-user-organization (if (message-functionp message-user-organization) @@ -2271,7 +2408,7 @@ (save-restriction (widen) (goto-char (point-min)) - (re-search-forward + (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$")) (forward-line 1) (int-to-string (count-lines (point) (point-max)))))) @@ -2282,10 +2419,10 @@ (let ((from (mail-header-from message-reply-headers)) (date (mail-header-date message-reply-headers))) (when from - (let ((stop-pos + (let ((stop-pos (string-match " *at \\| *@ \\| *(\\| *<" from))) (concat (if stop-pos (substring from 0 stop-pos) from) - "'s message of " + "'s message of " (if (or (not date) (string= date "")) "(unknown date)" date))))))) @@ -2304,7 +2441,7 @@ (setcar current (+ (car current) (round (/ future (expt 2 16))))) (setcar (cdr current) (+ (nth 1 current) (% (round future) (expt 2 16)))) ;; Return the date in the future in UT. - (timezone-make-date-arpa-standard + (timezone-make-date-arpa-standard (current-time-string current) (current-time-zone current) '(0 "UT")))) (defun message-make-path () @@ -2320,7 +2457,7 @@ (defun message-make-from () "Make a From header." (let* ((login (message-make-address)) - (fullname + (fullname (or (and (boundp 'user-full-name) user-full-name) (user-full-name)))) @@ -2328,7 +2465,7 @@ (setq fullname (user-login-name))) (save-excursion (message-set-work-buffer) - (cond + (cond ((or (null message-from-style) (equal fullname "")) (insert login)) @@ -2367,7 +2504,7 @@ ;; ... then undo escaping of matching parentheses, ;; including matching nested parentheses. (goto-char fullname-start) - (while (re-search-forward + (while (re-search-forward "\\(\\=\\|[^\\]\\(\\\\\\\\\\)*\\)\\\\(\\(\\([^\\]\\|\\\\\\\\\\)*\\)\\\\)" nil 1) (replace-match "\\1(\\3)" t) @@ -2377,7 +2514,7 @@ (defun message-make-sender () "Return the \"real\" user address. -This function tries to ignore all user modifications, and +This function tries to ignore all user modifications, and give as trustworthy answer as possible." (concat (user-login-name) "@" (system-name))) @@ -2397,7 +2534,7 @@ "Return user's fully qualified domain name." (let ((system-name (system-name)) (user-mail (message-user-mail-address))) - (cond + (cond ((string-match "[^.]\\.[^.]" system-name) ;; `system-name' returned the right result. system-name) @@ -2451,7 +2588,7 @@ (let ((headers message-deletable-headers)) (while headers (goto-char (point-min)) - (and (re-search-forward + (and (re-search-forward (concat "^" (symbol-name (car headers)) ": *") nil t) (get-text-property (1+ (match-beginning 0)) 'message-deletable) (message-delete-line)) @@ -2459,7 +2596,7 @@ ;; Go through all the required headers and see if they are in the ;; articles already. If they are not, or are empty, they are ;; inserted automatically - except for Subject, Newsgroups and - ;; Distribution. + ;; Distribution. (while headers (goto-char (point-min)) (setq elem (pop headers)) @@ -2468,8 +2605,8 @@ (setq header (cdr elem)) (setq header (car elem))) (setq header elem)) - (when (or (not (re-search-forward - (concat "^" (downcase (symbol-name header)) ":") + (when (or (not (re-search-forward + (concat "^" (downcase (symbol-name header)) ":") nil t)) (progn ;; The header was found. We insert a space after the @@ -2479,7 +2616,7 @@ (looking-at "[ \t]*$"))) ;; So we find out what value we should insert. (setq value - (cond + (cond ((and (consp elem) (eq (car elem) 'optional)) ;; This is an optional header. If the cdr of this ;; is something that is nil, then we do not insert @@ -2504,7 +2641,7 @@ (read-from-minibuffer (format "Empty header for %s; enter value: " header))))) ;; Finally insert the header. - (when (and value + (when (and value (not (equal value ""))) (save-excursion (if (bolp) @@ -2520,26 +2657,26 @@ ;; Add the deletable property to the headers that require it. (and (memq header message-deletable-headers) (progn (beginning-of-line) (looking-at "[^:]+: ")) - (add-text-properties + (add-text-properties (point) (match-end 0) '(message-deletable t face italic) (current-buffer))))))) - ;; Insert new Sender if the From is strange. + ;; Insert new Sender if the From is strange. (let ((from (message-fetch-field "from")) (sender (message-fetch-field "sender")) (secure-sender (message-make-sender))) - (when (and from + (when (and from (not (message-check-element 'sender)) (not (string= (downcase (cadr (mail-extract-address-components from))) (downcase secure-sender))) (or (null sender) - (not + (not (string= (downcase (cadr (mail-extract-address-components sender))) (downcase secure-sender))))) - (goto-char (point-min)) + (goto-char (point-min)) ;; Rename any old Sender headers to Original-Sender. (when (re-search-forward "^\\(Original-\\)*Sender:" nil t) (beginning-of-line) @@ -2563,7 +2700,7 @@ (insert (format message-courtesy-message newsgroups))) (t (insert message-courtesy-message))))))) - + ;;; ;;; Setting up a message buffer ;;; @@ -2622,7 +2759,7 @@ (defun message-position-point () "Move point to where the user probably wants to find it." (message-narrow-to-headers) - (cond + (cond ((re-search-forward "^[^:]+:[ \t]*$" nil t) (search-backward ":" ) (widen) @@ -2641,7 +2778,7 @@ (defun message-buffer-name (type &optional to group) "Return a new (unique) buffer name based on TYPE and TO." (cond - ;; Check whether `message-generate-new-buffers' is a function, + ;; Check whether `message-generate-new-buffers' is a function, ;; and if so, call it. ((message-functionp message-generate-new-buffers) (funcall message-generate-new-buffers type to group)) @@ -2692,11 +2829,11 @@ (if message-send-rename-function (funcall message-send-rename-function) (when (string-match "\\`\\*" (buffer-name)) - (rename-buffer + (rename-buffer (concat "*sent " (substring (buffer-name) (match-end 0))) t))) ;; Push the current buffer onto the list. (when message-max-buffers - (setq message-buffer-list + (setq message-buffer-list (nconc message-buffer-list (list (current-buffer)))))) (defvar mc-modes-alist) @@ -2711,7 +2848,7 @@ (setq message-reply-buffer replybuffer) (goto-char (point-min)) ;; Insert all the headers. - (mail-header-format + (mail-header-format (let ((h headers) (alist message-header-format-alist)) (while h @@ -2789,7 +2926,7 @@ (interactive) (let ((message-this-is-mail t)) (message-pop-to-buffer (message-buffer-name "mail" to)) - (message-setup + (message-setup (nconc `((To . ,(or to "")) (Subject . ,(or subject ""))) (when other-headers other-headers))))) @@ -2800,7 +2937,7 @@ (interactive) (let ((message-this-is-news t)) (message-pop-to-buffer (message-buffer-name "news" nil newsgroups)) - (message-setup `((Newsgroups . ,(or newsgroups "")) + (message-setup `((Newsgroups . ,(or newsgroups "")) (Subject . ,(or subject "")))))) ;;;###autoload @@ -2809,7 +2946,7 @@ (interactive) (let ((cur (current-buffer)) from subject date reply-to to cc - references message-id follow-to + references message-id follow-to (inhibit-point-motion-hooks t) mct never-mct gnus-warning) (save-restriction @@ -2826,7 +2963,7 @@ (funcall message-wide-reply-to-function))))) ;; Find all relevant headers we need. (setq from (message-fetch-field "from") - date (message-fetch-field "date") + date (message-fetch-field "date") subject (or (message-fetch-field "subject") "none") to (message-fetch-field "to") cc (message-fetch-field "cc") @@ -2843,7 +2980,7 @@ (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") @@ -2864,7 +3001,7 @@ (insert (if (bolp) "" ", ") (or to "")) (insert (if mct (concat (if (bolp) "" ", ") mct) "")) (insert (if cc (concat (if (bolp) "" ", ") cc) "")) - ;; Remove addresses that match `rmail-dont-reply-to-names'. + ;; Remove addresses that match `rmail-dont-reply-to-names'. (insert (prog1 (rmail-dont-reply-to (buffer-string)) (erase-buffer))) (goto-char (point-min)) @@ -2881,7 +3018,7 @@ (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 + (let ((ccs (cons 'Cc (mapconcat (lambda (addr) (cdr addr)) ccalist ", ")))) (when (string-match "^ +" (cdr ccs)) (setcdr ccs (substring (cdr ccs) (match-end 0)))) @@ -2897,7 +3034,7 @@ (message-setup `((Subject . ,subject) - ,@follow-to + ,@follow-to ,@(if (or references message-id) `((References . ,(concat (or references "") (and references " ") (or message-id "")))) @@ -2917,7 +3054,7 @@ (interactive) (let ((cur (current-buffer)) from subject date reply-to mct - references message-id follow-to + references message-id follow-to (inhibit-point-motion-hooks t) (message-this-is-news t) followup-to distribution newsgroups gnus-warning posted-to) @@ -2931,7 +3068,7 @@ (setq follow-to (funcall message-followup-to-function))) (setq from (message-fetch-field "from") - date (message-fetch-field "date") + 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) @@ -2960,13 +3097,13 @@ (message-setup `((Subject . ,subject) - ,@(cond + ,@(cond (to-newsgroups (list (cons 'Newsgroups to-newsgroups))) (follow-to follow-to) ((and followup-to message-use-followup-to) (list - (cond + (cond ((equal (downcase followup-to) "poster") (if (or (eq message-use-followup-to 'use) (message-y-or-n-p "Obey Followup-To: poster? " t "\ @@ -3068,7 +3205,7 @@ header line with the old Message-ID." (interactive) (let ((cur (current-buffer))) - ;; Check whether the user owns the article that is to be superseded. + ;; Check whether the user owns the article that is to be superseded. (unless (string-equal (downcase (cadr (mail-extract-address-components (message-fetch-field "from")))) @@ -3116,14 +3253,14 @@ (save-restriction (current-buffer) (message-narrow-to-head) - (concat "[" (or (message-fetch-field + (concat "[" (or (message-fetch-field (if (message-news-p) "newsgroups" "from")) "(nowhere)") "] " (or (message-fetch-field "Subject") ""))))) ;;;###autoload (defun message-forward (&optional news) - "Forward the current message via mail. + "Forward the current message via mail. Optional NEWS will use news to forward instead of mail." (interactive "P") (let ((cur (current-buffer)) @@ -3131,7 +3268,7 @@ art-beg) (if news (message-news nil subject) (message-mail nil subject)) ;; Put point where we want it before inserting the forwarded - ;; message. + ;; message. (if message-signature-before-forwarded-message (goto-char (point-max)) (message-goto-body)) @@ -3234,7 +3371,7 @@ (and (search-forward "\n\n" nil t) (re-search-forward "^Return-Path:.*\n" nil t))) ;; We remove everything before the bounced mail. - (delete-region + (delete-region (point-min) (if (re-search-forward "^[^ \n\t]+:" nil t) (match-beginning 0) @@ -3284,7 +3421,7 @@ (same-window-buffer-names nil) (same-window-regexps nil)) (message-pop-to-buffer (message-buffer-name "news" nil newsgroups))) - (message-setup `((Newsgroups . ,(or newsgroups "")) + (message-setup `((Newsgroups . ,(or newsgroups "")) (Subject . ,(or subject ""))))) ;;;###autoload @@ -3297,12 +3434,12 @@ (same-window-buffer-names nil) (same-window-regexps nil)) (message-pop-to-buffer (message-buffer-name "news" nil newsgroups))) - (message-setup `((Newsgroups . ,(or newsgroups "")) + (message-setup `((Newsgroups . ,(or newsgroups "")) (Subject . ,(or subject ""))))) ;;; underline.el -;; This code should be moved to underline.el (from which it is stolen). +;; This code should be moved to underline.el (from which it is stolen). ;;;###autoload (defun bold-region (start end) @@ -3329,7 +3466,7 @@ (save-excursion (let ((end1 (make-marker))) (move-marker end1 (max start end)) - (goto-char (min start end)) + (goto-char (min start end)) (while (re-search-forward "\b" end1 t) (if (eq (following-char) (char-after (- (point) 2))) (delete-char -2)))))) @@ -3343,7 +3480,7 @@ ;;; Group name completion. (defvar message-newgroups-header-regexp - "^\\(Newsgroups\\|Followup-To\\|Posted-To\\):" + "^\\(Newsgroups\\|Followup-To\\|Posted-To\\|Gcc\\):" "Regexp that match headers that lists groups.") (defun message-tab () @@ -3357,9 +3494,9 @@ (defvar gnus-active-hashtb) (defun message-expand-group () - (let* ((b (save-excursion + (let* ((b (save-excursion (save-restriction - (narrow-to-region + (narrow-to-region (save-excursion (beginning-of-line) (skip-chars-forward "^:") @@ -3373,7 +3510,7 @@ (cur (current-buffer)) comp) (delete-region b (point)) - (cond + (cond ((= (length completions) 1) (if (string= (car completions) string) (progn @@ -3399,7 +3536,7 @@ ;;; Help stuff. (defun message-talkative-question (ask question show &rest text) - "Call FUNCTION with argument QUESTION, displaying the rest of the arguments in a temporary buffer if SHOW. + "Call FUNCTION with argument QUESTION, displaying the rest of the arguments in a temporary buffer if SHOW. The following arguments may contain lists of values." (if (and show (setq text (message-flatten-list text))) @@ -3417,7 +3554,7 @@ \(message-flatten-list '(1 (2 3 (4 5 (6))) 7)) => (1 2 3 4 5 6 7)" - (cond ((consp list) + (cond ((consp list) (apply 'append (mapcar 'message-flatten-list list))) (list (list list))))