*** empty log message ***
[gnus] / lisp / gnus-msg.el
index df5ec15..dbf2722 100644 (file)
@@ -1,5 +1,5 @@
 ;;; gnus-msg.el --- mail and post interface for Gnus
-;; Copyright (C) 1995,96 Free Software Foundation, Inc.
+;; Copyright (C) 1995,96,97 Free Software Foundation, Inc.
 
 ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
 ;;     Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
@@ -26,6 +26,8 @@
 
 ;;; Code:
 
+(eval-when-compile (require 'cl))
+
 (require 'gnus)
 (require 'gnus-ems)
 (require 'message)
@@ -48,7 +50,7 @@ posting.")
   "*All outgoing messages will be put in this group.
 If you want to store all your outgoing mail and articles in the group
 \"nnml:archive\", you set this variable to that value.  This variable
-can also be a list of group names. 
+can also be a list of group names.
 
 If you want to have greater control over what group to put each
 message in, you can set this variable to a function that checks the
@@ -61,7 +63,10 @@ This is useful when you're reading a mailing list that has been
 gatewayed to a newsgroup, and you want to followup to an article in
 the group.")
 
-(defvar gnus-sent-message-ids-file 
+(defvar gnus-add-to-list nil
+  "*If non-nil, add a `to-list' parameter automatically.")
+
+(defvar gnus-sent-message-ids-file
   (nnheader-concat gnus-directory "Sent-Message-IDs")
   "File where Gnus saves a cache of sent message ids.")
 
@@ -86,11 +91,15 @@ Thank you.
 The first %s will be replaced by the Newsgroups header;
 the second with the current group name.")
 
+(defvar gnus-message-setup-hook nil
+  "Hook run after setting up a message buffer.")
+
 ;;; Internal variables.
 
 (defvar gnus-message-buffer "*Mail Gnus*")
 (defvar gnus-article-copy nil)
 (defvar gnus-last-posting-server nil)
+(defvar gnus-message-group-art nil)
 
 (defconst gnus-bug-message
   "Sending a bug report to the Gnus Towers.
@@ -132,6 +141,8 @@ Thank you for your help in stamping out bugs.
   "s" gnus-summary-supersede-article
   "r" gnus-summary-reply
   "R" gnus-summary-reply-with-original
+  "w" gnus-summary-wide-reply
+  "W" gnus-summary-wide-reply-with-original
   "n" gnus-summary-followup-to-mail
   "N" gnus-summary-followup-to-mail-with-original
   "m" gnus-summary-mail-other-window
@@ -151,9 +162,9 @@ Thank you for your help in stamping out bugs.
 
 (defvar gnus-article-reply nil)
 (defmacro gnus-setup-message (config &rest forms)
-  (let ((winconf (make-symbol "winconf"))
-       (buffer (make-symbol "buffer"))
-       (article (make-symbol "article")))
+  (let ((winconf (make-symbol "gnus-setup-message-winconf"))
+       (buffer (make-symbol "gnus-setup-message-buffer"))
+       (article (make-symbol "gnus-setup-message-article")))
     `(let ((,winconf (current-window-configuration))
           (,buffer (buffer-name (current-buffer)))
           (,article (and gnus-article-reply (gnus-summary-article-number)))
@@ -161,15 +172,21 @@ Thank you for your help in stamping out bugs.
            (copy-sequence message-header-setup-hook)))
        (add-hook 'message-header-setup-hook 'gnus-inews-insert-gcc)
        (add-hook 'message-header-setup-hook 'gnus-inews-insert-archive-gcc)
-       ,@forms
-       (gnus-inews-add-send-actions ,winconf ,buffer ,article)
-       (setq gnus-message-buffer (current-buffer))
-       (make-local-variable 'gnus-newsgroup-name)
-       (gnus-configure-windows ,config t))))
-    
+       (unwind-protect
+          (progn
+            ,@forms)
+        (gnus-inews-add-send-actions ,winconf ,buffer ,article)
+        (setq gnus-message-buffer (current-buffer))
+        (set (make-local-variable 'gnus-message-group-art)
+             (cons ,gnus-newsgroup-name ,article))
+        (make-local-variable 'gnus-newsgroup-name)
+        (run-hooks 'gnus-message-setup-hook))
+       (gnus-configure-windows ,config t)
+       (set-buffer-modified-p nil))))
+
 (defun gnus-inews-add-send-actions (winconf buffer article)
-  (gnus-make-local-hook 'message-sent-hook)
-  (gnus-add-hook 'message-sent-hook 'gnus-inews-do-gcc nil t)
+  (make-local-hook 'message-sent-hook)
+  (add-hook 'message-sent-hook 'gnus-inews-do-gcc nil t)
   (setq message-post-method
        `(lambda (arg)
           (gnus-post-method arg ,gnus-newsgroup-name)))
@@ -200,8 +217,7 @@ Thank you for your help in stamping out bugs.
 If ARG, post to the group under point.
 If ARG is 1, prompt for a group name."
   (interactive "P")
-  ;; Bind this variable here to make message mode hooks
-  ;; work ok.
+  ;; Bind this variable here to make message mode hooks work ok.
   (let ((gnus-newsgroup-name
         (if arg
             (if (= 1 (prefix-numeric-value arg))
@@ -214,16 +230,14 @@ If ARG is 1, prompt for a group name."
 (defun gnus-summary-post-news ()
   "Start composing a news message."
   (interactive)
-  (gnus-set-global-variables)
   (gnus-post-news 'post gnus-newsgroup-name))
 
 (defun gnus-summary-followup (yank &optional force-news)
   "Compose a followup to an article.
 If prefix argument YANK is non-nil, original article is yanked automatically."
-  (interactive 
-   (list (and current-prefix-arg 
+  (interactive
+   (list (and current-prefix-arg
              (gnus-summary-work-articles 1))))
-  (gnus-set-global-variables)
   (when yank
     (gnus-summary-goto-subject (car yank)))
   (save-window-excursion
@@ -232,7 +246,7 @@ If prefix argument YANK is non-nil, original article is yanked automatically."
        (gnus-newsgroup-name gnus-newsgroup-name))
     ;; Send a followup.
     (gnus-post-news nil gnus-newsgroup-name
-                   headers gnus-article-buffer 
+                   headers gnus-article-buffer
                    yank nil force-news)))
 
 (defun gnus-summary-followup-with-original (n &optional force-news)
@@ -242,8 +256,8 @@ If prefix argument YANK is non-nil, original article is yanked automatically."
 
 (defun gnus-summary-followup-to-mail (&optional arg)
   "Followup to the current mail message via news."
-  (interactive 
-   (list (and current-prefix-arg 
+  (interactive
+   (list (and current-prefix-arg
              (gnus-summary-work-articles 1))))
   (gnus-summary-followup arg t))
 
@@ -270,14 +284,16 @@ If prefix argument YANK is non-nil, original article is yanked automatically."
     (push-mark)
     (goto-char beg)))
 
-(defun gnus-summary-cancel-article (n)
-  "Cancel an article you posted."
-  (interactive "P")
-  (gnus-set-global-variables)
+(defun gnus-summary-cancel-article (&optional n symp)
+  "Cancel an article you posted.
+Uses the process-prefix convention.  If given the symbolic
+prefix `a', cancel using the standard posting method; if not
+post using the current select method."
+  (interactive (gnus-interactive "P\ny"))
   (let ((articles (gnus-summary-work-articles n))
        (message-post-method
         `(lambda (arg)
-           (gnus-post-method nil ,gnus-newsgroup-name)))
+           (gnus-post-method (not (eq symp 'a)) ,gnus-newsgroup-name)))
        article)
     (while (setq article (pop articles))
       (when (gnus-summary-select-article t nil nil article)
@@ -293,7 +309,6 @@ If prefix argument YANK is non-nil, original article is yanked automatically."
 This is done simply by taking the old article and adding a Supersedes
 header line with the old Message-ID."
   (interactive)
-  (gnus-set-global-variables)
   (let ((article (gnus-summary-article-number)))
     (gnus-setup-message 'reply-yank
       (gnus-summary-select-article t)
@@ -301,7 +316,11 @@ header line with the old Message-ID."
       (message-supersede)
       (push
        `((lambda ()
-          (gnus-cache-possibly-remove-article ,article nil nil nil t)))
+          (when (buffer-name (get-buffer ,gnus-summary-buffer))
+            (save-excursion
+              (set-buffer (get-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))))
 
 \f
@@ -317,8 +336,9 @@ header line with the old Message-ID."
       (push gnus-article-copy gnus-buffer-list))
   (let ((article-buffer (or article-buffer gnus-article-buffer))
        end beg contents)
-    (when (and (get-buffer article-buffer)
-              (buffer-name (get-buffer article-buffer)))
+    (if (not (and (get-buffer article-buffer)
+                 (buffer-name (get-buffer article-buffer))))
+       (error "Can't find any article buffer")
       (save-excursion
        (set-buffer article-buffer)
        (save-restriction
@@ -327,7 +347,9 @@ header line with the old Message-ID."
          (widen)
          (copy-to-buffer gnus-article-copy (point-min) (point-max))
          (set-buffer gnus-article-copy)
-         (article-delete-text-of-type 'annotation)
+         (gnus-article-delete-text-of-type 'annotation)
+         (gnus-remove-text-with-property 'gnus-prev)
+         (gnus-remove-text-with-property 'gnus-next)
          (insert
           (prog1
               (format "%s" (buffer-string))
@@ -345,20 +367,21 @@ header line with the old Message-ID."
                         (or (search-forward "\n\n" nil t) (point)))
          ;; Insert the original article headers.
          (insert-buffer-substring gnus-original-article-buffer beg end)
-         (article-decode-rfc1522)))
+         (gnus-article-decode-rfc1522)))
       gnus-article-copy)))
 
 (defun gnus-post-news (post &optional group header article-buffer yank subject
                            force-news)
   (when article-buffer
     (gnus-copy-article-buffer))
-  (let ((gnus-article-reply article-buffer))
+  (let ((gnus-article-reply article-buffer)
+       (add-to-list gnus-add-to-list))
     (gnus-setup-message (cond (yank 'reply-yank)
                              (article-buffer 'reply)
                              (t 'message))
       (let* ((group (or group gnus-newsgroup-name))
             (pgroup group)
-            to-address to-group mailing-list to-list 
+            to-address to-group mailing-list to-list
             newsgroup-p)
        (when group
          (setq to-address (gnus-group-find-parameter group 'to-address)
@@ -372,7 +395,7 @@ header line with the old Message-ID."
                     (gnus-news-group-p to-group))
                newsgroup-p
                force-news
-               (and (gnus-news-group-p 
+               (and (gnus-news-group-p
                      (or pgroup gnus-newsgroup-name)
                      (if header (mail-header-number header)
                        gnus-current-article))
@@ -390,10 +413,15 @@ header line with the old Message-ID."
                (message-mail (or to-address to-list))
                ;; Arrange for mail groups that have no `to-address' to
                ;; get that when the user sends off the mail.
-               (push (list 'gnus-inews-add-to-address group)
-                     message-send-actions))
+               (when (and (not to-list)
+                          (not to-address)
+                          add-to-list)
+                 (push (list 'gnus-inews-add-to-address pgroup)
+                       message-send-actions)))
            (set-buffer gnus-article-copy)
-           (message-wide-reply to-address)))
+           (message-wide-reply to-address
+                               (gnus-group-find-parameter
+                                gnus-newsgroup-name 'broken-reply-to))))
        (when yank
          (gnus-inews-yank-articles yank))))))
 
@@ -401,8 +429,8 @@ header line with the old Message-ID."
   "Return the posting method based on GROUP and ARG.
 If SILENT, don't prompt the user."
   (let ((group-method (gnus-find-method-for-group group)))
-    (cond 
-     ;; If the group-method is nil (which shouldn't happen) we use 
+    (cond
+     ;; If the group-method is nil (which shouldn't happen) we use
      ;; the default method.
      ((null group-method)
       (or gnus-post-method gnus-select-method message-post-method))
@@ -432,7 +460,7 @@ If SILENT, don't prompt the user."
            (push method post-methods)))
        ;; Create a name-method alist.
        (setq method-alist
-             (mapcar 
+             (mapcar
               (lambda (m)
                 (list (concat (cadr m) " (" (symbol-name (car m)) ")") m))
               post-methods))
@@ -454,16 +482,6 @@ If SILENT, don't prompt the user."
      ;; Use the normal select method.
      (t gnus-select-method))))
 
-(defun gnus-inews-narrow-to-headers ()
-  (widen)
-  (narrow-to-region
-   (goto-char (point-min))
-   (or (and (re-search-forward 
-            (concat "^" (regexp-quote mail-header-separator) "$") nil t)
-           (match-beginning 0))
-       (point-max)))
-  (goto-char (point-min)))
-
 ;;;
 ;;; Check whether the message has been sent already.
 ;;;
@@ -473,7 +491,7 @@ If SILENT, don't prompt the user."
 (defun gnus-inews-reject-message ()
   "Check whether this message has already been sent."
   (when gnus-sent-message-ids-file
-    (let ((message-id (save-restriction (gnus-inews-narrow-to-headers)
+    (let ((message-id (save-restriction (message-narrow-to-headers)
                                        (mail-fetch-field "message-id")))
          end)
       (when message-id
@@ -482,12 +500,12 @@ If SILENT, don't prompt the user."
            (load t t t)))
        (if (member message-id gnus-inews-sent-ids)
            ;; Reject this message.
-           (not (gnus-yes-or-no-p 
+           (not (gnus-yes-or-no-p
                  (format "Message %s already sent.  Send anyway? "
                          message-id)))
          (push message-id gnus-inews-sent-ids)
          ;; Chop off the last Message-IDs.
-         (when (setq end (nthcdr gnus-sent-message-ids-length 
+         (when (setq end (nthcdr gnus-sent-message-ids-length
                                  gnus-inews-sent-ids))
            (setcdr end nil))
          (nnheader-temp-write gnus-sent-message-ids-file
@@ -498,6 +516,7 @@ If SILENT, don't prompt the user."
 
 ;; Dummy to avoid byte-compile warning.
 (defvar nnspool-rejected-article-hook)
+(defvar xemacs-codename)
 
 ;;; Since the X-Newsreader/X-Mailer are ``vanity'' headers, they might
 ;;; as well include the Emacs version as well.
@@ -513,18 +532,26 @@ If SILENT, don't prompt the user."
      (concat "Emacs " (substring emacs-version
                                 (match-beginning 1)
                                 (match-end 1))))
-    ((string-match "\\([A-Z]*[Mm][Aa][Cc][Ss]\\)" emacs-version)
+    ((string-match "\\([A-Z]*[Mm][Aa][Cc][Ss]\\)[^(]*\\(\\((beta.*)\\|'\\)\\)?"
+                  emacs-version)
      (concat (substring emacs-version
                        (match-beginning 1)
                        (match-end 1))
-            (format " %d.%d" emacs-major-version emacs-minor-version)))
+            (format " %d.%d" emacs-major-version emacs-minor-version)
+            (if (match-beginning 3)
+                (substring emacs-version
+                           (match-beginning 3)
+                           (match-end 3))
+              "")
+            (if (boundp 'xemacs-codename)
+                (concat " - \"" xemacs-codename "\""))))
     (t emacs-version))))
 
 ;; Written by "Mr. Per Persson" <pp@gnu.ai.mit.edu>.
 (defun gnus-inews-insert-mime-headers ()
   (goto-char (point-min))
-  (let ((mail-header-separator 
-        (progn 
+  (let ((mail-header-separator
+        (progn
           (goto-char (point-min))
           (if (and (search-forward (concat "\n" mail-header-separator "\n")
                                    nil t)
@@ -548,41 +575,55 @@ If SILENT, don't prompt the user."
 
 \f
 ;;;
-;;; Gnus Mail Functions 
+;;; Gnus Mail Functions
 ;;;
 
 ;;; Mail reply commands of Gnus summary mode
 
-(defun gnus-summary-reply (&optional yank)
-  "Reply mail to news author.
-If prefix argument YANK is non-nil, original article is yanked automatically."
-  (interactive 
-   (list (and current-prefix-arg 
+(defun gnus-summary-reply (&optional yank wide)
+  "Start composing a reply mail to the current message.
+If prefix argument YANK is non-nil, the original article is yanked
+automatically."
+  (interactive
+   (list (and current-prefix-arg
              (gnus-summary-work-articles 1))))
-  ;; Bug fix by jbw@bigbird.bu.edu (Joe Wells)
   ;; Stripping headers should be specified with mail-yank-ignored-headers.
-  (gnus-set-global-variables)
-  (when yank 
+  (when yank
     (gnus-summary-goto-subject (car yank)))
   (let ((gnus-article-reply t))
     (gnus-setup-message (if yank 'reply-yank 'reply)
       (gnus-summary-select-article)
       (set-buffer (gnus-copy-article-buffer))
-      (message-reply nil nil (gnus-group-find-parameter
-                             gnus-newsgroup-name 'broken-reply-to))
+      (message-reply nil wide (gnus-group-find-parameter
+                              gnus-newsgroup-name 'broken-reply-to))
       (when yank
        (gnus-inews-yank-articles yank)))))
 
-(defun gnus-summary-reply-with-original (n)
-  "Reply mail to news author with original article."
+(defun gnus-summary-reply-with-original (n &optional wide)
+  "Start composing a reply mail to the current message.
+The original article will be yanked."
+  (interactive "P")
+  (gnus-summary-reply (gnus-summary-work-articles n) wide))
+
+(defun gnus-summary-wide-reply (&optional yank)
+  "Start composing a wide reply mail to the current message.
+If prefix argument YANK is non-nil, the original article is yanked
+automatically."
+  (interactive
+   (list (and current-prefix-arg
+             (gnus-summary-work-articles 1))))
+  (gnus-summary-reply yank t))
+
+(defun gnus-summary-wide-reply-with-original (n)
+  "Start composing a wide reply mail to the current message.
+The original article will be yanked."
   (interactive "P")
-  (gnus-summary-reply (gnus-summary-work-articles n)))
+  (gnus-summary-reply-with-original n t))
 
 (defun gnus-summary-mail-forward (&optional full-headers post)
   "Forward the current message to another user.
 If FULL-HEADERS (the prefix), include full headers when forwarding."
   (interactive "P")
-  (gnus-set-global-variables)
   (gnus-setup-message 'forward
     (gnus-summary-select-article)
     (set-buffer gnus-original-article-buffer)
@@ -590,13 +631,16 @@ If FULL-HEADERS (the prefix), include full headers when forwarding."
           (if full-headers "" message-included-forward-headers)))
       (message-forward post))))
 
-(defun gnus-summary-resend-message (address)
+(defun gnus-summary-resend-message (address n)
   "Resend the current article to ADDRESS."
-  (interactive "sResend message to: ")
-  (gnus-summary-select-article)
-  (save-excursion
-    (set-buffer gnus-original-article-buffer)
-    (message-resend address)))
+  (interactive "sResend message(s) to: \nP")
+  (let ((articles (gnus-summary-work-articles n))
+       article)
+    (while (setq article (pop articles))
+      (gnus-summary-select-article nil nil nil article)
+      (save-excursion
+       (set-buffer gnus-original-article-buffer)
+       (message-resend address)))))
 
 (defun gnus-summary-post-forward (&optional full-headers)
   "Forward the current article to a newsgroup.
@@ -604,7 +648,7 @@ If FULL-HEADERS (the prefix), include full headers when forwarding."
   (interactive "P")
   (gnus-summary-mail-forward full-headers t))
 
-(defvar gnus-nastygram-message 
+(defvar gnus-nastygram-message
   "The following article was inappropriately posted to %s.\n\n"
   "Format string to insert in nastygrams.
 The current group name will be inserted at \"%s\".")
@@ -613,7 +657,7 @@ The current group name will be inserted at \"%s\".")
   "Send a nastygram to the author of the current article."
   (interactive "P")
   (when (or gnus-expert-user
-           (gnus-y-or-n-p 
+           (gnus-y-or-n-p
             "Really send a nastygram to the author of the current article? "))
     (let ((group gnus-newsgroup-name))
       (gnus-summary-reply-with-original n)
@@ -652,6 +696,7 @@ The current group name will be inserted at \"%s\".")
          (message-goto-subject)
          (re-search-forward " *$")
          (replace-match " (crosspost notification)" t t)
+         (gnus-deactivate-mark)
          (when (gnus-y-or-n-p "Send this complaint? ")
            (message-send-and-exit)))))))
 
@@ -669,7 +714,7 @@ The current group name will be inserted at \"%s\".")
       (setq beg (point))
       (skip-chars-forward "^,")
       (while (zerop
-             (save-excursion 
+             (save-excursion
                (save-restriction
                  (let ((i 0))
                    (narrow-to-region beg (point))
@@ -693,8 +738,10 @@ The current group name will be inserted at \"%s\".")
     (when (and to-address
               (gnus-alive-p))
       ;; This mail group doesn't have a `to-list', so we add one
-      ;; here.  Magic!  
-      (gnus-group-add-parameter group (cons 'to-list to-address)))))
+      ;; here.  Magic!
+      (when (gnus-y-or-n-p
+            (format "Do you want to add this as `to-list': %s " to-address))
+       (gnus-group-add-parameter group (cons 'to-list to-address))))))
 
 (defun gnus-put-message ()
   "Put the current message in some group and return to Gnus."
@@ -702,7 +749,7 @@ The current group name will be inserted at \"%s\".")
   (let ((reply gnus-article-reply)
        (winconf gnus-prev-winconf)
        (group gnus-newsgroup-name))
-    
+
     (or (and group (not (gnus-group-read-only-p group)))
        (setq group (read-string "Put in group: " nil
                                 (gnus-writable-groups))))
@@ -712,7 +759,7 @@ The current group name will be inserted at \"%s\".")
     (save-excursion
       (save-restriction
        (widen)
-       (gnus-inews-narrow-to-headers)
+       (message-narrow-to-headers)
        (let (gnus-deletable-headers)
          (if (message-news-p)
              (message-generate-headers message-required-news-headers)
@@ -727,7 +774,7 @@ The current group name will be inserted at \"%s\".")
       (when (gnus-buffer-exists-p (car-safe reply))
        (set-buffer (car reply))
        (and (cdr reply)
-            (gnus-summary-mark-article-as-replied 
+            (gnus-summary-mark-article-as-replied
              (cdr reply))))
       (when winconf
        (set-window-configuration winconf)))))
@@ -736,7 +783,7 @@ The current group name will be inserted at \"%s\".")
   "Send a reply to the address near point.
 If YANK is non-nil, include the original article."
   (interactive "P")
-  (let ((address 
+  (let ((address
         (buffer-substring
          (save-excursion (re-search-backward "[ \t\n]" nil t) (1+ (point)))
          (save-excursion (re-search-forward "[ \t\n]" nil t) (1- (point))))))
@@ -745,6 +792,7 @@ If YANK is non-nil, include the original article."
       (when yank
        (gnus-inews-yank-articles (list (cdr gnus-article-current)))))))
 
+(defvar nntp-server-type)
 (defun gnus-bug ()
   "Send a bug report to the Gnus maintainers."
   (interactive)
@@ -752,7 +800,7 @@ If YANK is non-nil, include the original article."
     (error "Gnus has been shut down"))
   (gnus-setup-message 'bug
     (delete-other-windows)
-    (switch-to-buffer "*Gnus Help Bug*")
+    (switch-to-buffer (get-buffer-create "*Gnus Help Bug*"))
     (erase-buffer)
     (insert gnus-bug-message)
     (goto-char (point-min))
@@ -763,7 +811,10 @@ If YANK is non-nil, include the original article."
     (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$"))
     (forward-line 1)
     (insert (gnus-version) "\n")
-    (insert (emacs-version))
+    (insert (emacs-version) "\n")
+    (when (and (boundp 'nntp-server-type)
+              (stringp nntp-server-type))
+      (insert nntp-server-type))
     (insert "\n\n\n\n\n")
     (gnus-debug)
     (goto-char (point-min))
@@ -780,8 +831,9 @@ The source file has to be in the Emacs load path."
   (interactive)
   (let ((files '("gnus.el" "gnus-sum.el" "gnus-group.el"
                 "gnus-art.el" "gnus-start.el" "gnus-async.el"
-                "gnus-msg.el" "gnus-score.el" "gnus-win.el"
+                "gnus-msg.el" "gnus-score.el" "gnus-win.el" "gnus-topic.el"
                 "nnmail.el" "message.el"))
+       (point (point))
        file expr olist sym)
     (gnus-message 4 "Please wait while we snoop your variables...")
     (sit-for 0)
@@ -827,11 +879,12 @@ The source file has to be in the Emacs load path."
        (insert ";; (makeunbound '" (symbol-name (car olist)) ")\n"))
       (setq olist (cdr olist)))
     (insert "\n\n")
-    ;; Remove any null chars - they seem to cause trouble for some
+    ;; Remove any control chars - they seem to cause trouble for some
     ;; mailers.  (Byte-compiled output from the stuff above.)
-    (goto-char (point-min))
-    (while (re-search-forward "[\000\200]" nil t)
-      (replace-match "" t t))))
+    (goto-char point)
+    (while (re-search-forward "[\000-\010\013-\037\200-\237]" nil t)
+      (replace-match (format "\\%03o" (string-to-char (match-string 0)))
+                    t t))))
 
 ;;; Treatment of rejected articles.
 ;;; Bounced mail.
@@ -850,15 +903,16 @@ this is a reply."
     (let* ((references (mail-fetch-field "references"))
           (parent (and references (gnus-parent-id references))))
       (message-bounce)
-      ;; If there are references, we fetch the article we answered to.  
+      ;; If there are references, we fetch the article we answered to.
       (and fetch parent
           (gnus-summary-refer-article parent)
           (gnus-summary-show-all-headers)))))
 
 ;;; Gcc handling.
 
-;; Do Gcc handling, which copied the message over to some group. 
+;; Do Gcc handling, which copied the message over to some group.
 (defun gnus-inews-do-gcc (&optional gcc)
+  (interactive)
   (when (gnus-alive-p)
     (save-excursion
       (save-restriction
@@ -872,11 +926,11 @@ this is a reply."
            (setq groups (message-tokenize-header gcc " ,"))
            ;; Copy the article over to some group(s).
            (while (setq group (pop groups))
-             (gnus-check-server 
+             (gnus-check-server
               (setq method
                     (cond ((and (null (gnus-get-info group))
                                 (eq (car gnus-message-archive-method)
-                                    (car 
+                                    (car
                                      (gnus-server-to-method
                                       (gnus-group-method group)))))
                            ;; If the group doesn't exist, we assume
@@ -894,12 +948,12 @@ this is a reply."
                (nnheader-set-temp-buffer " *acc*")
                (insert-buffer-substring cur)
                (goto-char (point-min))
-               (when (re-search-forward 
+               (when (re-search-forward
                       (concat "^" (regexp-quote mail-header-separator) "$")
                       nil t)
                  (replace-match "" t t ))
                (unless (gnus-request-accept-article group method t)
-                 (gnus-message 1 "Couldn't store article in group %s: %s" 
+                 (gnus-message 1 "Couldn't store article in group %s: %s"
                                group (gnus-status-message method))
                  (sit-for 2))
                (kill-buffer (current-buffer))))))))))
@@ -908,9 +962,9 @@ this is a reply."
   "Insert Gcc headers based on `gnus-outgoing-message-group'."
   (save-excursion
     (save-restriction
-      (gnus-inews-narrow-to-headers)
+      (message-narrow-to-headers)
       (let* ((group gnus-outgoing-message-group)
-            (gcc (cond 
+            (gcc (cond
                   ((gnus-functionp group)
                    (funcall group))
                   ((or (stringp group) (list group))
@@ -925,10 +979,13 @@ this is a reply."
   "Insert the Gcc to say where the article is to be archived."
   (let* ((var gnus-message-archive-group)
         (group (or group gnus-newsgroup-name ""))
-        result
-        gcc-self-val
+        (gcc-self-val
+         (and gnus-newsgroup-name
+              (gnus-group-find-parameter
+               gnus-newsgroup-name 'gcc-self)))
+        result 
         (groups
-         (cond 
+         (cond
           ((null gnus-message-archive-method)
            ;; Ignore.
            nil)
@@ -949,7 +1006,7 @@ this is a reply."
            (while (and var
                        (not
                         (setq result
-                              (cond 
+                              (cond
                                ((stringp (caar var))
                                 ;; Regexp.
                                 (when (string-match (caar var) group)
@@ -962,19 +1019,17 @@ this is a reply."
              (setq var (cdr var)))
            result)))
         name)
-    (when groups
+    (when (or groups gcc-self-val)
       (when (stringp groups)
        (setq groups (list groups)))
       (save-excursion
        (save-restriction
-         (gnus-inews-narrow-to-headers)
+         (message-narrow-to-headers)
          (goto-char (point-max))
          (insert "Gcc: ")
-         (if (and gnus-newsgroup-name
-                  (setq gcc-self-val
-                        (gnus-group-find-parameter
-                         gnus-newsgroup-name 'gcc-self)))
-             (progn 
+         (if gcc-self-val
+             ;; Use the `gcc-self' param value instead.
+             (progn
                (insert
                 (if (stringp gcc-self-val)
                     gcc-self-val
@@ -984,41 +1039,21 @@ this is a reply."
                  (progn
                    (beginning-of-line)
                    (kill-line))))
+           ;; Use the list of groups.
            (while (setq name (pop groups))
              (insert (if (string-match ":" name)
                          name
-                       (gnus-group-prefixed-name 
+                       (gnus-group-prefixed-name
                         name gnus-message-archive-method)))
              (when groups
                (insert " ")))
            (insert "\n")))))))
 
-(defun gnus-summary-send-draft ()
-  "Enter a mail/post buffer to edit and send the draft."
-  (interactive)
-  (gnus-set-global-variables)
-  (let (buf)
-    (if (not (setq buf (gnus-request-restore-buffer 
-                       (gnus-summary-article-number) gnus-newsgroup-name)))
-       (error "Couldn't restore the article")
-      (switch-to-buffer buf)
-      (when (eq major-mode 'news-reply-mode)
-       (local-set-key "\C-c\C-c" 'gnus-inews-news))
-      ;; Insert the separator.
-      (goto-char (point-min))
-      (search-forward "\n\n")
-      (forward-char -1)
-      (insert mail-header-separator)
-      ;; Configure windows.
-      (let ((gnus-draft-buffer (current-buffer)))
-       (gnus-configure-windows 'draft t)
-       (goto-char (point))))))
-  
 (gnus-add-shutdown 'gnus-inews-close 'gnus)
 
 (defun gnus-inews-close ()
   (setq gnus-inews-sent-ids nil))
-  
+
 ;;; Allow redefinition of functions.
 
 (gnus-ems-redefine)