Merge remote branch 'origin/no-gnus'
[gnus] / lisp / gnus-msg.el
index aa4ed4b..8d16a42 100644 (file)
@@ -313,6 +313,22 @@ If nil, the address field will always be empty after invoking
   :group 'gnus-message
   :type 'boolean)
 
+(defcustom gnus-gcc-pre-body-encode-hook nil
+  "A hook called before encoding the body of the Gcc copy of a message.
+The current buffer (when the hook is run) contains the message
+including the message header.  Changes made to the message will
+only affect the Gcc copy, but not the original message."
+  :group 'gnus-message
+  :type 'hook)
+
+(defcustom gnus-gcc-post-body-encode-hook nil
+    "A hook called after encoding the body of the Gcc copy of a message.
+The current buffer (when the hook is run) contains the message
+including the message header.  Changes made to the message will
+only affect the Gcc copy, but not the original message."
+  :group 'gnus-message
+  :type 'hook)
+
 (autoload 'gnus-message-citation-mode "gnus-cite" nil t)
 
 ;;; Internal variables.
@@ -494,22 +510,28 @@ Thank you for your help in stamping out bugs.
 
 ;;;###autoload
 (defun gnus-msg-mail (&optional to subject other-headers continue
-                     switch-action yank-action send-actions return-action)
+                               switch-action yank-action send-actions
+                               return-action)
   "Start editing a mail message to be sent.
 Like `message-mail', but with Gnus paraphernalia, particularly the
-Gcc: header for archiving purposes."
+Gcc: header for archiving purposes.
+If Gnus isn't running, a plain `message-mail' setup is used
+instead."
   (interactive)
-  (let ((buf (current-buffer))
-       mail-buf)
-    (gnus-setup-message 'message
+  (if (not (gnus-alive-p))
       (message-mail to subject other-headers continue
-                   nil yank-action send-actions return-action))
-    (when switch-action
-      (setq mail-buf (current-buffer))
-      (switch-to-buffer buf)
-      (apply switch-action mail-buf nil)))
-  ;; COMPOSEFUNC should return t if succeed.  Undocumented ???
-  t)
+                    nil yank-action send-actions return-action)
+    (let ((buf (current-buffer))
+         mail-buf)
+      (gnus-setup-message 'message
+       (message-mail to subject other-headers continue
+                     nil yank-action send-actions return-action))
+      (when switch-action
+       (setq mail-buf (current-buffer))
+       (switch-to-buffer buf)
+       (apply switch-action mail-buf nil))
+      ;; COMPOSEFUNC should return t if succeed.  Undocumented ???
+      t)))
 
 ;;;###autoload
 (defun gnus-button-mailto (address)
@@ -652,7 +674,7 @@ a news."
             (if (= 1 (prefix-numeric-value arg))
                 (gnus-group-completing-read "Newsgroup" nil
                                             (gnus-read-active-file-p))
-              (gnus-group-group-name))
+              (or (gnus-group-group-name) ""))
           ""))
        ;; make sure last viewed article doesn't affect posting styles:
        (gnus-article-copy))
@@ -819,9 +841,21 @@ post using the current select method."
   (interactive (gnus-interactive "P\ny"))
   (let ((message-post-method
         `(lambda (arg)
-           (gnus-post-method (eq ',symp 'a) ,gnus-newsgroup-name))))
+           (gnus-post-method (eq ',symp 'a) ,gnus-newsgroup-name)))
+       (user-mail-address user-mail-address))
     (dolist (article (gnus-summary-work-articles n))
       (when (gnus-summary-select-article t nil nil article)
+       ;; Pretend that we're doing a followup so that we can see what
+       ;; the From header would have ended up being.
+       (save-window-excursion
+         (save-excursion
+           (gnus-summary-followup nil)
+           (let ((from (message-fetch-field "from")))
+             (when from
+               (setq user-mail-address
+                     (car (mail-header-parse-address from)))))
+           (kill-buffer (current-buffer))))
+       ;; Now cancel the article using the From header we got.
        (when (gnus-eval-in-buffer-window gnus-original-article-buffer
                (message-cancel-news))
          (gnus-summary-mark-as-read article gnus-canceled-mark)
@@ -1291,26 +1325,27 @@ For the \"inline\" alternatives, also see the variable
                                          group)))
              (message-unquote-tokens
               (message-tokenize-header (mail-fetch-field "gcc" nil t)
-                                       " ,")))))
+                                       " ,"))))
+       (self (with-current-buffer gnus-summary-buffer
+               gnus-gcc-self-resent-messages)))
     (message-remove-header "gcc")
     (when gcc
       (goto-char (point-max))
-      (cond ((eq gnus-gcc-self-resent-messages  'none))
-           ((eq gnus-gcc-self-resent-messages t)
+      (cond ((eq self 'none))
+           ((eq self t)
             (insert "Gcc: \"" gnus-newsgroup-name "\"\n"))
-           ((stringp gnus-gcc-self-resent-messages)
+           ((stringp self)
             (insert "Gcc: "
                     (mm-encode-coding-string
-                     (if (string-match " " gnus-gcc-self-resent-messages)
-                         (concat "\"" gnus-gcc-self-resent-messages "\"")
-                       gnus-gcc-self-resent-messages)
-                     (gnus-group-name-charset
-                      (gnus-inews-group-method gnus-gcc-self-resent-messages)
-                      gnus-gcc-self-resent-messages))
+                     (if (string-match " " self)
+                         (concat "\"" self "\"")
+                       self)
+                     (gnus-group-name-charset (gnus-inews-group-method self)
+                                              self))
                     "\n"))
-           ((null gnus-gcc-self-resent-messages)
+           ((null self)
             (insert "Gcc: " (mapconcat 'identity gcc ", ") "\n"))
-           ((eq gnus-gcc-self-resent-messages 'no-gcc-self)
+           ((eq self 'no-gcc-self)
             (when (setq gcc (delete
                              gnus-newsgroup-name
                              (delete (concat "\"" gnus-newsgroup-name "\"")
@@ -1332,11 +1367,15 @@ For the \"inline\" alternatives, also see the variable
         current-prefix-arg))
   (let ((message-header-setup-hook (copy-sequence message-header-setup-hook))
        (message-sent-hook (copy-sequence message-sent-hook)))
+    ;; `gnus-summary-resend-message-insert-gcc' must run last.
     (add-hook 'message-header-setup-hook
-             'gnus-summary-resend-message-insert-gcc)
-    (add-hook 'message-sent-hook (if gnus-agent
-                                    'gnus-agent-possibly-do-gcc
-                                  'gnus-inews-do-gcc))
+             'gnus-summary-resend-message-insert-gcc t)
+    (add-hook 'message-sent-hook
+             `(lambda ()
+                (let ((rfc2047-encode-encoded-words nil))
+                  ,(if gnus-agent
+                       '(gnus-agent-possibly-do-gcc)
+                     '(gnus-inews-do-gcc)))))
     (dolist (article (gnus-summary-work-articles n))
       (gnus-summary-select-article nil nil nil article)
       (with-current-buffer gnus-original-article-buffer
@@ -1508,7 +1547,6 @@ If YANK is non-nil, include the original article."
     (error "Gnus has been shut down"))
   (gnus-setup-message (if (message-mail-user-agent) 'message 'bug)
     (unless (message-mail-user-agent)
-      (delete-other-windows)
       (when gnus-bug-create-help-buffer
        (switch-to-buffer "*Gnus Help Bug*")
        (erase-buffer)
@@ -1636,7 +1674,9 @@ this is a reply."
              (nnheader-set-temp-buffer " *acc*")
              (setq message-options (with-current-buffer cur message-options))
              (insert-buffer-substring cur)
+             (run-hooks 'gnus-gcc-pre-body-encode-hook)
              (message-encode-message-body)
+             (run-hooks 'gnus-gcc-post-body-encode-hook)
              (save-restriction
                (message-narrow-to-headers)
                (let* ((mail-parse-charset message-default-charset)
@@ -1730,11 +1770,13 @@ this is a reply."
                        (not
                         (setq result
                               (cond
-                               ((stringp (caar var))
+                               ((and group
+                                     (stringp (caar var)))
                                 ;; Regexp.
                                 (when (string-match (caar var) group)
                                   (cdar var)))
-                               ((functionp (car var))
+                               ((and group
+                                     (functionp (car var)))
                                 ;; Function.
                                 (funcall (car var) group))
                                (t