X-Git-Url: https://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Fgnus-msg.el;h=891718e65b8b9ae34cbb5e4a4335a48c3135c886;hb=92bc187d1fcbe58bbd9c638b69a614c3bbad208e;hp=9e151596c83f3a3d0f61cef227e3447a549ed554;hpb=fbfe6e5043b497e2bc7df6cdb033652998254a44;p=gnus diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index 9e151596c..891718e65 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -1,7 +1,7 @@ ;;; gnus-msg.el --- mail and post interface for Gnus ;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, -;; 2004, 2005 Free Software Foundation, Inc. +;; 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. ;; Author: Masanobu UMEDA ;; Lars Magne Ingebrigtsen @@ -9,10 +9,10 @@ ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; GNU Emacs 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. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -20,9 +20,7 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: @@ -67,8 +65,10 @@ message in, you can set this variable to a function that checks the current newsgroup name and then returns a suitable group name (or list of names)." :group 'gnus-message - :type '(choice (string :tag "Group") - (function))) + :type '(choice (const nil) + (function) + (string :tag "Group") + (repeat :tag "List of groups" (string :tag "Group")))) (defcustom gnus-mailing-list-groups nil "*If non-nil a regexp matching groups that are really mailing lists. @@ -107,6 +107,7 @@ the second with the current group name." (defcustom gnus-message-setup-hook nil "Hook run after setting up a message buffer." :group 'gnus-message + :options '(message-remove-blank-cited-lines) :type 'hook) (defcustom gnus-bug-create-help-buffer t @@ -148,7 +149,7 @@ See Info node `(gnus)Posting Styles'." :type 'boolean) (make-obsolete-variable 'gnus-inews-mark-gcc-as-read - 'gnus-gcc-mark-as-read) + 'gnus-gcc-mark-as-read "Emacs 22.1") (defcustom gnus-gcc-externalize-attachments nil "Should local-file attachments be included as external parts in Gcc copies? @@ -259,15 +260,15 @@ See also the `mml-default-encrypt-method' variable." This is done because new users often reply by mistake when reading news. This can also be a function receiving the group name as the only -parameter which should return non-nil iff a confirmation is needed, or -a regexp, in which case a confirmation is asked for iff the group name +parameter, which should return non-nil if a confirmation is needed; or +a regexp, in which case a confirmation is asked for if the group name matches the regexp." - :version "22.1" + :version "23.1" ;; No Gnus (default changed) :group 'gnus-message :type '(choice (const :tag "No" nil) (const :tag "Yes" t) - (regexp :tag "Iff group matches regexp") - (function :tag "Iff function evaluates to non-nil"))) + (regexp :tag "If group matches regexp") + (function :tag "If function evaluates to non-nil"))) (defcustom gnus-confirm-treat-mail-like-news nil @@ -287,6 +288,16 @@ If nil, the address field will always be empty after invoking :group 'gnus-message :type 'boolean) +(defcustom gnus-message-highlight-citation + t ;; gnus-treat-highlight-citation ;; gnus-cite dependency + "Enable highlighting of different citation levels in message-mode." + :version "23.1" ;; No Gnus + :group 'gnus-cite + :group 'gnus-message + :type 'boolean) + +(autoload 'gnus-message-citation-mode "gnus-cite" nil t) + ;;; Internal variables. (defvar gnus-inhibit-posting-styles nil @@ -322,8 +333,7 @@ Please describe the bug in annoying, painstaking detail. Thank you for your help in stamping out bugs. ") -(eval-and-compile - (autoload 'gnus-uu-post-news "gnus-uu" nil t)) +(autoload 'gnus-uu-post-news "gnus-uu" nil t) ;;; @@ -367,7 +377,7 @@ Thank you for your help in stamping out bugs. (defun gnus-inews-make-draft (articles) `(lambda () (gnus-inews-make-draft-meta-information - ,gnus-newsgroup-name ',articles))) + ,(gnus-group-decoded-name gnus-newsgroup-name) ',articles))) (defvar gnus-article-reply nil) (defmacro gnus-setup-message (config &rest forms) @@ -388,6 +398,13 @@ Thank you for your help in stamping out bugs. (setq mml-buffer-list nil) (add-hook 'message-header-setup-hook 'gnus-inews-insert-gcc) (add-hook 'message-header-setup-hook 'gnus-inews-insert-archive-gcc) + ;; message-newsreader and message-mailer were formerly set in + ;; gnus-inews-add-send-actions, but this is too late when + ;; message-generate-headers-first is used. --ansel + (add-hook 'message-mode-hook + (lambda nil + (setq message-newsreader + (setq message-mailer (gnus-extended-version))))) ;; #### FIXME: for a reason that I did not manage to identify yet, ;; the variable `gnus-newsgroup-name' does not honor a dynamically ;; scoped or setq'ed value from a caller like `C-u gnus-summary-mail'. @@ -420,6 +437,9 @@ Thank you for your help in stamping out bugs. (set (make-local-variable 'gnus-message-group-art) (cons ,group ,article)) (set (make-local-variable 'gnus-newsgroup-name) ,group) + ;; Enable highlighting of different citation levels + (when gnus-message-highlight-citation + (gnus-message-citation-mode 1)) (gnus-run-hooks 'gnus-message-setup-hook) (if (eq major-mode 'message-mode) (let ((mbl1 mml-buffer-list)) @@ -517,7 +537,6 @@ Gcc: header for archiving purposes." (setq message-post-method `(lambda (&optional arg) (gnus-post-method arg ,gnus-newsgroup-name))) - (setq message-newsreader (setq message-mailer (gnus-extended-version))) (message-add-action `(when (gnus-buffer-exists-p ,buffer) (set-window-configuration ,winconf)) @@ -530,8 +549,7 @@ Gcc: header for archiving purposes." (t nil)))) (message-add-action `(when (gnus-buffer-exists-p ,buffer) - (save-excursion - (set-buffer ,buffer) + (with-current-buffer ,buffer ,(when to-be-marked (if (eq config 'forward) `(gnus-summary-mark-article-as-forwarded ',to-be-marked) @@ -559,15 +577,14 @@ If ARG is 1, prompt for a group name to find the posting style." (setq gnus-newsgroup-name (if arg (if (= 1 (prefix-numeric-value arg)) - (completing-read "Use posting style of group: " - gnus-active-hashtb nil - (gnus-read-active-file-p)) + (gnus-group-completing-read + "Use posting style of group" + nil (gnus-read-active-file-p)) (gnus-group-group-name)) "")) ;; #### see comment in gnus-setup-message -- drv (gnus-setup-message 'message (message-mail))) - (save-excursion - (set-buffer buffer) + (with-current-buffer buffer (setq gnus-newsgroup-name group))))) (defun gnus-group-news (&optional arg) @@ -590,16 +607,15 @@ network. The corresponding back end must have a 'request-post method." (setq gnus-newsgroup-name (if arg (if (= 1 (prefix-numeric-value arg)) - (completing-read "Use group: " - gnus-active-hashtb nil - (gnus-read-active-file-p)) + (gnus-group-completing-read "Use group" + nil + (gnus-read-active-file-p)) (gnus-group-group-name)) "")) ;; #### see comment in gnus-setup-message -- drv (gnus-setup-message 'message (message-news (gnus-group-real-name gnus-newsgroup-name)))) - (save-excursion - (set-buffer buffer) + (with-current-buffer buffer (setq gnus-newsgroup-name group))))) (defun gnus-group-post-news (&optional arg) @@ -612,8 +628,8 @@ a news." (let ((gnus-newsgroup-name (if arg (if (= 1 (prefix-numeric-value arg)) - (completing-read "Newsgroup: " gnus-active-hashtb nil - (gnus-read-active-file-p)) + (gnus-group-completing-read "Newsgroup" nil + (gnus-read-active-file-p)) (gnus-group-group-name)) "")) ;; make sure last viewed article doesn't affect posting styles: @@ -638,15 +654,14 @@ posting style." (setq gnus-newsgroup-name (if arg (if (= 1 (prefix-numeric-value arg)) - (completing-read "Use group: " - gnus-active-hashtb nil - (gnus-read-active-file-p)) + (gnus-group-completing-read "Use group" + nil + (gnus-read-active-file-p)) "") gnus-newsgroup-name)) ;; #### see comment in gnus-setup-message -- drv (gnus-setup-message 'message (message-mail))) - (save-excursion - (set-buffer buffer) + (with-current-buffer buffer (setq gnus-newsgroup-name group))))) (defun gnus-summary-news-other-window (&optional arg) @@ -669,9 +684,9 @@ network. The corresponding back end must have a 'request-post method." (setq gnus-newsgroup-name (if arg (if (= 1 (prefix-numeric-value arg)) - (completing-read "Use group: " - gnus-active-hashtb nil - (gnus-read-active-file-p)) + (gnus-group-completing-read "Use group" + nil + (gnus-read-active-file-p)) "") gnus-newsgroup-name)) ;; #### see comment in gnus-setup-message -- drv @@ -682,8 +697,7 @@ network. The corresponding back end must have a 'request-post method." (remove (car (gnus-find-method-for-group gnus-newsgroup-name)) gnus-discouraged-post-methods))))) - (save-excursion - (set-buffer buffer) + (with-current-buffer buffer (setq gnus-newsgroup-name group))))) (defun gnus-summary-post-news (&optional arg) @@ -696,8 +710,8 @@ a news." (let ((gnus-newsgroup-name (if arg (if (= 1 (prefix-numeric-value arg)) - (completing-read "Newsgroup: " gnus-active-hashtb nil - (gnus-read-active-file-p)) + (gnus-group-completing-read "Newsgroup" nil + (gnus-read-active-file-p)) "") gnus-newsgroup-name)) ;; make sure last viewed article doesn't affect posting styles: @@ -768,6 +782,7 @@ active, the entire article will be yanked." (nnheader-narrow-to-headers) (nnheader-parse-naked-head))))) (message-yank-original) + (message-exchange-point-and-mark) (setq beg (or beg (mark t)))) (when articles (insert "\n"))) @@ -797,7 +812,8 @@ post using the current select method." This is done simply by taking the old article and adding a Supersedes header line with the old Message-ID." (interactive) - (let ((article (gnus-summary-article-number))) + (let ((article (gnus-summary-article-number)) + (mail-parse-charset gnus-newsgroup-charset)) (gnus-setup-message 'reply-yank (gnus-summary-select-article t) (set-buffer gnus-original-article-buffer) @@ -805,11 +821,13 @@ header line with the old Message-ID." (push `((lambda () (when (gnus-buffer-exists-p ,gnus-summary-buffer) - (save-excursion - (set-buffer ,gnus-summary-buffer) + (with-current-buffer ,gnus-summary-buffer (gnus-cache-possibly-remove-article ,article nil nil nil t) (gnus-summary-mark-as-read ,article gnus-canceled-mark))))) - message-send-actions)))) + message-send-actions) + ;; Add Gcc header. + (gnus-inews-insert-archive-gcc) + (gnus-inews-insert-gcc)))) @@ -819,16 +837,14 @@ header line with the old Message-ID." ;; if ARTICLE-BUFFER is nil, gnus-article-buffer is used ;; this buffer should be passed to all mail/news reply/post routines. (setq gnus-article-copy (gnus-get-buffer-create " *gnus article copy*")) - (save-excursion - (set-buffer gnus-article-copy) + (with-current-buffer gnus-article-copy (mm-enable-multibyte)) (let ((article-buffer (or article-buffer gnus-article-buffer)) end beg) (if (not (and (get-buffer article-buffer) (gnus-buffer-exists-p article-buffer))) (error "Can't find any article buffer") - (save-excursion - (set-buffer article-buffer) + (with-current-buffer article-buffer (let ((gnus-newsgroup-charset (or gnus-article-charset gnus-newsgroup-charset)) (gnus-newsgroup-ignored-charsets @@ -845,6 +861,7 @@ header line with the old Message-ID." (delete-region (point) (point-max)) (insert yank-string)) (gnus-article-delete-text-of-type 'annotation) + (gnus-article-delete-text-of-type 'multipart) (gnus-remove-text-with-property 'gnus-prev) (gnus-remove-text-with-property 'gnus-next) (gnus-remove-text-with-property 'gnus-decoration) @@ -1011,8 +1028,8 @@ If SILENT, don't prompt the user." gnus-last-posting-server) ;; Just use the last value. gnus-last-posting-server - (completing-read - "Posting method: " method-alist nil t + (gnus-completing-read + "Posting method" (mapcar 'car method-alist) t (cons (or gnus-last-posting-server "") 0)))) method-alist)))) ;; Override normal method. @@ -1074,7 +1091,10 @@ If VERY-WIDE, make a very wide reply." ((functionp gnus-confirm-mail-reply-to-news) (funcall gnus-confirm-mail-reply-to-news gnus-newsgroup-name)) (t gnus-confirm-mail-reply-to-news))) - (y-or-n-p "Really reply by mail to article author? ")) + (if (or wide very-wide) + t ;; Ignore gnus-confirm-mail-reply-to-news for wide and very + ;; wide replies. + (y-or-n-p "Really reply by mail to article author? "))) (let* ((article (if (listp (car yank)) (caar yank) @@ -1090,8 +1110,7 @@ If VERY-WIDE, make a very wide reply." (gnus-summary-select-article) (dolist (article very-wide) (gnus-summary-select-article nil nil nil article) - (save-excursion - (set-buffer (gnus-copy-article-buffer)) + (with-current-buffer (gnus-copy-article-buffer) (gnus-msg-treat-broken-reply-to) (save-restriction (message-narrow-to-head) @@ -1114,8 +1133,7 @@ If VERY-WIDE, make a very wide reply." "Check the various replysign variables and take action accordingly." (when (or gnus-message-replysign gnus-message-replyencrypt) (let (signed encrypted) - (save-excursion - (set-buffer gnus-article-buffer) + (with-current-buffer gnus-article-buffer (setq signed (memq 'signed gnus-article-wash-types)) (setq encrypted (memq 'encrypted gnus-article-wash-types))) (cond ((and gnus-message-replyencrypt encrypted) @@ -1246,9 +1264,9 @@ For the `inline' alternatives, also see the variable current-prefix-arg)) (dolist (article (gnus-summary-work-articles n)) (gnus-summary-select-article nil nil nil article) - (save-excursion - (set-buffer gnus-original-article-buffer) - (message-resend address)) + (with-current-buffer gnus-original-article-buffer + (let ((gnus-gcc-externalize-attachments nil)) + (message-resend address))) (gnus-summary-mark-article-as-forwarded article))) ;; From: Matthieu Moy @@ -1258,7 +1276,7 @@ A new buffer will be created to allow the user to modify body and contents of the message, and then, everything will happen as when composing a new message." (interactive) - (let ((article (gnus-summary-article-number))) + (let ((mail-parse-charset gnus-newsgroup-charset)) (gnus-setup-message 'reply-yank (gnus-summary-select-article t) (set-buffer gnus-original-article-buffer) @@ -1271,10 +1289,13 @@ composing a new message." (message-narrow-to-head-1) ;; Gnus will generate a new one when sending. (message-remove-header "Message-ID") - (message-remove-header message-ignored-resent-headers t) ;; Remove unwanted headers. + (message-remove-header message-ignored-resent-headers t) (goto-char (point-max)) (insert mail-header-separator) + ;; Add Gcc header. + (gnus-inews-insert-archive-gcc) + (gnus-inews-insert-gcc) (goto-char (point-min)) (when (re-search-forward "^To:\\|^Newsgroups:" nil 'move) (forward-char 1)) @@ -1451,8 +1472,7 @@ If YANK is non-nil, include the original article." (insert nntp-server-type)) (insert "\n\n\n\n\n") (let (text) - (save-excursion - (set-buffer (gnus-get-buffer-create " *gnus environment info*")) + (with-current-buffer (gnus-get-buffer-create " *gnus environment info*") (erase-buffer) (gnus-debug) (setq text (buffer-string))) @@ -1468,13 +1488,12 @@ If YANK is non-nil, include the original article." (defun gnus-summary-yank-message (buffer n) "Yank the current article into a composed message." (interactive - (list (completing-read "Buffer: " (mapcar 'list (message-buffers)) nil t) + (list (gnus-completing-read "Buffer" (message-buffers) t) current-prefix-arg)) (gnus-summary-iterate n (let ((gnus-inhibit-treatment t)) (gnus-summary-select-article)) - (save-excursion - (set-buffer buffer) + (with-current-buffer buffer (message-yank-buffer gnus-article-buffer)))) (defun gnus-debug () @@ -1487,8 +1506,7 @@ The source file has to be in the Emacs load path." (gnus-message 4 "Please wait while we snoop your variables...") (sit-for 0) ;; Go through all the files looking for non-default values for variables. - (save-excursion - (set-buffer (gnus-get-buffer-create " *gnus bug info*")) + (with-current-buffer (gnus-get-buffer-create " *gnus bug info*") (while files (erase-buffer) (when (and (setq file (locate-library (pop files))) @@ -1529,7 +1547,7 @@ The source file has to be in the Emacs load path." ;; Remove any control chars - they seem to cause trouble for some ;; mailers. (Byte-compiled output from the stuff above.) (goto-char point) - (while (re-search-forward (mm-string-as-multibyte + (while (re-search-forward (mm-string-to-multibyte "[\000-\010\013-\037\200-\237]") nil t) (replace-match (format "\\%03o" (string-to-char (match-string 0))) t t)))) @@ -1546,15 +1564,29 @@ If FETCH, try to fetch the article that this is a reply to, if indeed this is a reply." (interactive "P") (gnus-summary-select-article t) - (set-buffer gnus-original-article-buffer) - (gnus-setup-message 'compose-bounce - (let* ((references (mail-fetch-field "references")) - (parent (and references (gnus-parent-id references)))) + (let (summary-buffer parent) + (if fetch + (progn + (setq summary-buffer (current-buffer)) + (set-buffer gnus-original-article-buffer) + (article-goto-body) + (when (re-search-forward "^References:\n?" nil t) + (while (memq (char-after) '(?\t ? )) + (forward-line 1)) + (skip-chars-backward "\t\n ") + (setq parent + (gnus-parent-id (buffer-substring (match-end 0) (point)))))) + (set-buffer gnus-original-article-buffer)) + (gnus-setup-message 'compose-bounce (message-bounce) + ;; Add Gcc header. + (gnus-inews-insert-archive-gcc) + (gnus-inews-insert-gcc) ;; If there are references, we fetch the article we answered to. - (and fetch parent - (gnus-summary-refer-article parent) - (gnus-summary-show-all-headers))))) + (when parent + (with-current-buffer summary-buffer + (gnus-summary-refer-article parent) + (gnus-summary-show-all-headers)))))) ;;; Gcc handling. @@ -1589,8 +1621,11 @@ this is a reply." (message-tokenize-header gcc " ,"))) ;; Copy the article over to some group(s). (while (setq group (pop groups)) - (unless (gnus-check-server - (setq method (gnus-inews-group-method group))) + (setq method (gnus-inews-group-method group) + group (mm-encode-coding-string + group + (gnus-group-name-charset method group))) + (unless (gnus-check-server method) (error "Can't open server %s" (if (stringp method) method (car method)))) (unless (gnus-request-group group nil method) @@ -1643,6 +1678,11 @@ this is a reply." group method t t)))) (gnus-message 1 "Couldn't store article in group %s: %s" group (gnus-status-message method))) + (when (stringp method) + (setq method (gnus-server-to-method method))) + (when (and (listp method) + (gnus-native-method-p method)) + (setq group (gnus-group-short-name group))) (when (and group-art ;; FIXME: Should gcc-mark-as-read work when ;; Gnus is not running? @@ -1680,8 +1720,13 @@ this is a reply." (defun gnus-inews-insert-archive-gcc (&optional group) "Insert the Gcc to say where the article is to be archived." + (setq group (cond (group + (gnus-group-decoded-name group)) + (gnus-newsgroup-name + (gnus-group-decoded-name gnus-newsgroup-name)) + (t + ""))) (let* ((var gnus-message-archive-group) - (group (or group gnus-newsgroup-name "")) (gcc-self-val (and gnus-newsgroup-name (not (equal gnus-newsgroup-name "")) @@ -1863,6 +1908,13 @@ this is a reply." ((eq element 'x-face-file) (setq element 'x-face filep t))) + ;; Post-processing for the signature posting-style: + (and (eq element 'signature) filep + message-signature-directory + ;; don't actually use the signature directory + ;; if message-signature-file contains a path. + (not (file-name-directory v)) + (setq v (nnheader-concat message-signature-directory v))) ;; Get the contents of file elems. (when (and filep v) (setq v (with-temp-buffer @@ -1938,5 +1990,4 @@ this is a reply." (provide 'gnus-msg) -;;; arch-tag: 9f22b2f5-1c0a-49de-916e-4c88e984852b ;;; gnus-msg.el ends here