diff lisp/gnus/gnus-msg.el @ 70:131b0175ea99 r20-0b30

Import from CVS: tag r20-0b30
author cvs
date Mon, 13 Aug 2007 09:02:59 +0200
parents 8b8b7f3559a2
children 0d2f883870bc
line wrap: on
line diff
--- a/lisp/gnus/gnus-msg.el	Mon Aug 13 09:00:04 2007 +0200
+++ b/lisp/gnus/gnus-msg.el	Mon Aug 13 09:02:59 2007 +0200
@@ -1,5 +1,5 @@
 ;;; gnus-msg.el --- mail and post interface for Gnus
-;; Copyright (C) 1995,96,97 Free Software Foundation, Inc.
+;; Copyright (C) 1995,96 Free Software Foundation, Inc.
 
 ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
 ;;	Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
@@ -29,7 +29,7 @@
 (require 'gnus)
 (require 'gnus-ems)
 (require 'message)
-(require 'gnus-art)
+(eval-when-compile (require 'cl))
 
 ;; Added by Sudish Joseph <joseph@cis.ohio-state.edu>.
 (defvar gnus-post-method nil
@@ -47,8 +47,8 @@
 (defvar gnus-outgoing-message-group nil
   "*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.
+\"nnml:archive\", you set this variable to that value. This variable
+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,60 +61,19 @@
 gatewayed to a newsgroup, and you want to followup to an article in
 the group.")
 
-(defvar gnus-sent-message-ids-file
+(defvar gnus-sent-message-ids-file 
   (nnheader-concat gnus-directory "Sent-Message-IDs")
   "File where Gnus saves a cache of sent message ids.")
 
 (defvar gnus-sent-message-ids-length 1000
   "The number of sent Message-IDs to save.")
 
-(defvar gnus-crosspost-complaint
-  "Hi,
-
-You posted the article below with the following Newsgroups header:
-
-Newsgroups: %s
-
-The %s group, at least, was an inappropriate recipient
-of this message.  Please trim your Newsgroups header to exclude this
-group before posting in the future.
-
-Thank you.
-
-"
-  "Format string to be inserted when complaining about crossposts.
-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)
 
-(defconst gnus-bug-message
-  "Sending a bug report to the Gnus Towers.
-========================================
-
-The buffer below is a mail buffer.  When you press `C-c C-c', it will
-be sent to the Gnus Bug Exterminators.
-
-At the bottom of the buffer you'll see lots of variable settings.
-Please do not delete those.  They will tell the Bug People what your
-environment is, so that it will be easier to locate the bugs.
-
-If you have found a bug that makes Emacs go \"beep\", set
-debug-on-error to t (`M-x set-variable RET debug-on-error RET t RET')
-and include the backtrace in your bug report.
-
-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 'news-setup "rnewspost")
@@ -127,30 +86,27 @@
 ;;; Gnus Posting Functions
 ;;;
 
-(gnus-define-keys (gnus-summary-send-map "S" gnus-summary-mode-map)
-  "p" gnus-summary-post-news
-  "f" gnus-summary-followup
-  "F" gnus-summary-followup-with-original
-  "c" gnus-summary-cancel-article
-  "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
-  "u" gnus-uu-post-news
-  "\M-c" gnus-summary-mail-crosspost-complaint
-  "om" gnus-summary-mail-forward
-  "op" gnus-summary-post-forward
-  "Om" gnus-uu-digest-mail-forward
-  "Op" gnus-uu-digest-post-forward)
+(gnus-define-keys 
+ (gnus-summary-send-map "S" gnus-summary-mode-map)
+ "p" gnus-summary-post-news
+ "f" gnus-summary-followup
+ "F" gnus-summary-followup-with-original
+ "c" gnus-summary-cancel-article
+ "s" gnus-summary-supersede-article
+ "r" gnus-summary-reply
+ "R" gnus-summary-reply-with-original
+ "m" gnus-summary-mail-other-window
+ "u" gnus-uu-post-news
+ "om" gnus-summary-mail-forward
+ "op" gnus-summary-post-forward
+ "Om" gnus-uu-digest-mail-forward
+ "Op" gnus-uu-digest-post-forward)
 
-(gnus-define-keys (gnus-send-bounce-map "D" gnus-summary-send-map)
-  "b" gnus-summary-resend-bounced-mail
-  ;; "c" gnus-summary-send-draft
-  "r" gnus-summary-resend-message)
+(gnus-define-keys
+ (gnus-send-bounce-map "D" gnus-summary-send-map)
+ "b" gnus-summary-resend-bounced-mail
+; "c" gnus-summary-send-draft
+ "r" gnus-summary-resend-message)
 
 ;;; Internal functions.
 
@@ -160,23 +116,19 @@
 	(buffer (make-symbol "buffer"))
 	(article (make-symbol "article")))
     `(let ((,winconf (current-window-configuration))
-	   (,buffer (buffer-name (current-buffer)))
+	   (,buffer (current-buffer))
 	   (,article (and gnus-article-reply (gnus-summary-article-number)))
 	   (message-header-setup-hook
 	    (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)
-       (unwind-protect
-	   ,@forms
-	 (gnus-inews-add-send-actions ,winconf ,buffer ,article)
-	 (setq gnus-message-buffer (current-buffer))
-	 (make-local-variable 'gnus-newsgroup-name)
-	 (run-hooks 'gnus-message-setup-hook))
-       (gnus-configure-windows ,config t)
-       (set-buffer-modified-p nil))))
-
+       ,@forms
+       (gnus-inews-add-send-actions ,winconf ,buffer ,article)
+       (setq gnus-message-buffer (current-buffer))
+       (gnus-configure-windows ,config t))))
+    
 (defun gnus-inews-add-send-actions (winconf buffer article)
-  (make-local-hook 'message-sent-hook)
+  (gnus-make-local-hook 'message-sent-hook)
   (gnus-add-hook 'message-sent-hook 'gnus-inews-do-gcc nil t)
   (setq message-post-method
 	`(lambda (arg)
@@ -185,14 +137,15 @@
   (message-add-action
    `(set-window-configuration ,winconf) 'exit 'postpone 'kill)
   (message-add-action
-   `(when (buffer-name (get-buffer ,buffer))
+   `(when (buffer-name ,buffer)
       (save-excursion
-	(set-buffer (get-buffer ,buffer))
+	(set-buffer ,buffer)
 	,(when article
 	   `(gnus-summary-mark-article-as-replied ,article))))
    'send))
 
 (put 'gnus-setup-message 'lisp-indent-function 1)
+(put 'gnus-setup-message 'lisp-indent-hook 1)
 (put 'gnus-setup-message 'edebug-form-spec '(form body))
 
 ;;; Post news commands of Gnus group mode and summary mode
@@ -228,8 +181,8 @@
 (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
@@ -240,7 +193,7 @@
 	(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)
@@ -248,21 +201,8 @@
   (interactive "P")
   (gnus-summary-followup (gnus-summary-work-articles n) force-news))
 
-(defun gnus-summary-followup-to-mail (&optional arg)
-  "Followup to the current mail message via news."
-  (interactive
-   (list (and current-prefix-arg
-	      (gnus-summary-work-articles 1))))
-  (gnus-summary-followup arg t))
-
-(defun gnus-summary-followup-to-mail-with-original (&optional arg)
-  "Followup to the current mail message via news."
-  (interactive "P")
-  (gnus-summary-followup (gnus-summary-work-articles arg) t))
-
 (defun gnus-inews-yank-articles (articles)
   (let (beg article)
-    (message-goto-body)
     (while (setq article (pop articles))
       (save-window-excursion
 	(set-buffer gnus-summary-buffer)
@@ -273,8 +213,8 @@
 	    (message-reply-headers gnus-current-headers))
 	(message-yank-original)
 	(setq beg (or beg (mark t))))
-      (when articles
-	(insert "\n")))
+      (when articles (insert "\n")))
+    
     (push-mark)
     (goto-char beg)))
 
@@ -289,8 +229,8 @@
 	article)
     (while (setq article (pop articles))
       (when (gnus-summary-select-article t nil nil article)
-	(when (gnus-eval-in-buffer-window gnus-original-article-buffer
-		(message-cancel-news))
+	(when (gnus-eval-in-buffer-window 
+	       gnus-original-article-buffer (message-cancel-news))
 	  (gnus-summary-mark-as-read article gnus-canceled-mark)
 	  (gnus-cache-remove-article 1))
 	(gnus-article-hide-headers-if-wanted))
@@ -309,11 +249,7 @@
       (message-supersede)
       (push
        `((lambda ()
-	   (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)))))
+	   (gnus-cache-possibly-remove-article ,article nil nil nil t)))
        message-send-actions))))
 
 
@@ -326,41 +262,28 @@
   (setq gnus-article-copy (get-buffer-create " *gnus article copy*"))
   (buffer-disable-undo gnus-article-copy)
   (or (memq gnus-article-copy gnus-buffer-list)
-      (push gnus-article-copy gnus-buffer-list))
+      (setq gnus-buffer-list (cons gnus-article-copy gnus-buffer-list)))
   (let ((article-buffer (or article-buffer gnus-article-buffer))
 	end beg contents)
-    (if (not (and (get-buffer article-buffer)
-		  (buffer-name (get-buffer article-buffer))))
-	(error "Can't find any article buffer")
+    (when (and (get-buffer article-buffer)
+	       (buffer-name (get-buffer article-buffer)))
       (save-excursion
 	(set-buffer article-buffer)
 	(save-restriction
-	  ;; Copy over the (displayed) article buffer, delete
-	  ;; hidden text and remove text properties.
 	  (widen)
-	  (copy-to-buffer gnus-article-copy (point-min) (point-max))
-	  (set-buffer gnus-article-copy)
-	  (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))
-	     (erase-buffer)))
-	  ;; Find the original headers.
+	  (setq contents (format "%s" (buffer-string)))
 	  (set-buffer gnus-original-article-buffer)
 	  (goto-char (point-min))
 	  (while (looking-at message-unix-mail-delimiter)
 	    (forward-line 1))
 	  (setq beg (point))
 	  (setq end (or (search-forward "\n\n" nil t) (point)))
-	  ;; Delete the headers from the displayed articles.
 	  (set-buffer gnus-article-copy)
+	  (erase-buffer)
+	  (insert contents)
 	  (delete-region (goto-char (point-min))
 			 (or (search-forward "\n\n" nil t) (point)))
-	  ;; Insert the original article headers.
-	  (insert-buffer-substring gnus-original-article-buffer beg end)
-	  (gnus-article-decode-rfc1522)))
+	  (insert-buffer-substring gnus-original-article-buffer beg end)))
       gnus-article-copy)))
 
 (defun gnus-post-news (post &optional group header article-buffer yank subject
@@ -373,21 +296,18 @@
 			      (t 'message))
       (let* ((group (or group gnus-newsgroup-name))
 	     (pgroup group)
-	     to-address to-group mailing-list to-list
-	     newsgroup-p)
+	     to-address to-group mailing-list to-list)
 	(when group
-	  (setq to-address (gnus-group-find-parameter group 'to-address)
-		to-group (gnus-group-find-parameter group 'to-group)
-		to-list (gnus-group-find-parameter group 'to-list)
-		newsgroup-p (gnus-group-find-parameter group 'newsgroup)
+	  (setq to-address (gnus-group-get-parameter group 'to-address)
+		to-group (gnus-group-get-parameter group 'to-group)
+		to-list (gnus-group-get-parameter group 'to-list)
 		mailing-list (when gnus-mailing-list-groups
 			       (string-match gnus-mailing-list-groups group))
 		group (gnus-group-real-name group)))
 	(if (or (and to-group
 		     (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))
@@ -398,17 +318,15 @@
 	    (if post
 		(message-news (or to-group group))
 	      (set-buffer gnus-article-copy)
-	      (message-followup (if (or newsgroup-p force-news) nil to-group)))
+	      (message-followup))
 	  ;; The is mail.
 	  (if post
 	      (progn
 		(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.
-		(when (and (not to-list)
-			   (not to-address))
-		  (push (list 'gnus-inews-add-to-address pgroup)
-			message-send-actions)))
+		(push (list 'gnus-inews-add-to-address group)
+		      message-send-actions))
 	    (set-buffer gnus-article-copy)
 	    (message-wide-reply to-address)))
 	(when yank
@@ -418,10 +336,10 @@
   "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)
+     ((null arg)
       (or gnus-post-method gnus-select-method message-post-method))
      ;; We want this group's method.
      ((and arg (not (eq arg 0)))
@@ -449,7 +367,7 @@
 	    (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))
@@ -466,11 +384,27 @@
 		   (cons (or gnus-last-posting-server "") 0))))
 	  method-alist))))
      ;; Override normal method.
-     (gnus-post-method
+     ((and gnus-post-method
+	   (or (gnus-method-option-p group-method 'post)
+	       (gnus-method-option-p group-method 'post-mail)))
       gnus-post-method)
+     ;; Perhaps this is a mail group?
+     ((and (not (gnus-member-of-valid 'post group))
+	   (not (gnus-method-option-p group-method 'post-mail)))
+      group-method)
      ;; 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.
 ;;;
@@ -480,25 +414,27 @@
 (defun gnus-inews-reject-message ()
   "Check whether this message has already been sent."
   (when gnus-sent-message-ids-file
-    (let ((message-id (save-restriction (message-narrow-to-headers)
+    (let ((message-id (save-restriction (gnus-inews-narrow-to-headers)
 					(mail-fetch-field "message-id")))
 	  end)
       (when message-id
 	(unless gnus-inews-sent-ids
-	  (ignore-errors
-	    (load t t t)))
+	  (condition-case ()
+	      (load  t t t)
+	    (error nil)))
 	(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
-	    (gnus-prin1 `(setq gnus-inews-sent-ids ',gnus-inews-sent-ids)))
+	    (prin1 `(setq gnus-inews-sent-ids ',gnus-inews-sent-ids)
+		   (current-buffer)))
 	  nil)))))
 
 
@@ -520,24 +456,18 @@
      (concat "Emacs " (substring emacs-version
 				 (match-beginning 1)
 				 (match-end 1))))
-    ((string-match "\\([A-Z]*[Mm][Aa][Cc][Ss]\\)[^(]*\\(\\((beta.*)\\|'\\)\\)?"
-		   emacs-version)
+    ((string-match "\\([A-Z]*[Mm][Aa][Cc][Ss]\\)" emacs-version)
      (concat (substring emacs-version
 			(match-beginning 1)
 			(match-end 1))
-	     (format " %d.%d" emacs-major-version emacs-minor-version)
-	     (if (match-beginning 3)
-		 (substring emacs-version
-			    (match-beginning 3)
-			    (match-end 3))
-	       "")))
+	     (format " %d.%d" emacs-major-version emacs-minor-version)))
     (t emacs-version))))
 
-;; Written by "Mr. Per Persson" <pp@gnu.ai.mit.edu>.
+;; Written by "Mr. Per Persson" <pp@solace.mh.se>.
 (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)
@@ -561,131 +491,74 @@
 
 
 ;;;
-;;; Gnus Mail Functions
+;;; Gnus Mail Functions 
 ;;;
 
 ;;; Mail reply commands of Gnus summary mode
 
-(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
+(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 
 	      (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 wide (gnus-group-find-parameter
-			       gnus-newsgroup-name 'broken-reply-to))
+      (message-reply nil nil (gnus-group-get-parameter
+			      gnus-newsgroup-name 'broken-reply-to))
       (when yank
 	(gnus-inews-yank-articles yank)))))
 
-(defun gnus-summary-reply-with-original (n &optional wide)
-  "Start composing a reply mail to the current message.
-The original article will be yanked."
+(defun gnus-summary-reply-with-original (n)
+  "Reply mail to news author with original article."
   (interactive "P")
-  (gnus-summary-reply (gnus-summary-work-articles n) wide))
+  (gnus-summary-reply (gnus-summary-work-articles n)))
 
-(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-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."
+(defun gnus-summary-mail-forward (&optional post)
+  "Forward the current message to another user."
   (interactive "P")
   (gnus-set-global-variables)
   (gnus-setup-message 'forward
     (gnus-summary-select-article)
     (set-buffer gnus-original-article-buffer)
-    (let ((message-included-forward-headers
-	   (if full-headers "" message-included-forward-headers)))
-      (message-forward post))))
+    (message-forward post)))
 
-(defun gnus-summary-resend-message (address n)
+(defun gnus-summary-resend-message (address)
   "Resend the current article to 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)))))
+  (interactive "sResend message to: ")
+  (gnus-summary-select-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.
-If FULL-HEADERS (the prefix), include full headers when forwarding."
-  (interactive "P")
-  (gnus-summary-mail-forward full-headers t))
+(defun gnus-summary-post-forward ()
+  "Forward the current article to a newsgroup."
+  (interactive)
+  (gnus-summary-mail-forward t))
 
-(defvar gnus-nastygram-message
-  "The following article was inappropriately posted to %s.\n\n"
+(defvar gnus-nastygram-message 
+  "The following article was inappropriately posted to %s.\n"
   "Format string to insert in nastygrams.
 The current group name will be inserted at \"%s\".")
 
 (defun gnus-summary-mail-nastygram (n)
   "Send a nastygram to the author of the current article."
   (interactive "P")
-  (when (or gnus-expert-user
-	    (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)
-      (set-buffer gnus-message-buffer)
-      (message-goto-body)
-      (insert (format gnus-nastygram-message group))
-      (message-send-and-exit))))
-
-(defun gnus-summary-mail-crosspost-complaint (n)
-  "Send a complaint about crossposting to the current article(s)."
-  (interactive "P")
-  (let ((articles (gnus-summary-work-articles n))
-	article)
-    (while (setq article (pop articles))
-      (set-buffer gnus-summary-buffer)
-      (gnus-summary-goto-subject article)
-      (let ((group (gnus-group-real-name gnus-newsgroup-name))
-	    newsgroups followup-to)
-	(gnus-summary-select-article)
-	(set-buffer gnus-original-article-buffer)
-	(if (and (<= (length (message-tokenize-header
-			      (setq newsgroups (mail-fetch-field "newsgroups"))
-			      ", "))
-		     1)
-		 (or (not (setq followup-to (mail-fetch-field "followup-to")))
-		     (not (member group (message-tokenize-header
-					 followup-to ", ")))))
-	    (if followup-to
-		(gnus-message 1 "Followup-to restricted")
-	      (gnus-message 1 "Not a crossposted article"))
-	  (set-buffer gnus-summary-buffer)
-	  (gnus-summary-reply-with-original 1)
-	  (set-buffer gnus-message-buffer)
-	  (message-goto-body)
-	  (insert (format gnus-crosspost-complaint newsgroups group))
-	  (message-goto-subject)
-	  (re-search-forward " *$")
-	  (replace-match " (crosspost notification)" t t)
-	  (when (gnus-y-or-n-p "Send this complaint? ")
-	    (message-send-and-exit)))))))
+  (if (or gnus-expert-user
+	  (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)
+	(set-buffer gnus-message-buffer)
+	(insert (format gnus-nastygram-message group))
+	(message-send-and-exit))))
 
 (defun gnus-summary-mail-other-window ()
   "Compose mail in other window."
@@ -701,7 +574,7 @@
       (setq beg (point))
       (skip-chars-forward "^,")
       (while (zerop
-	      (save-excursion
+	      (save-excursion 
 		(save-restriction
 		  (let ((i 0))
 		    (narrow-to-region beg (point))
@@ -709,26 +582,31 @@
 		    (logand (progn
 			      (while (search-forward "\"" nil t)
 				(incf i))
-			      (if (zerop i) 2 i))
-			    2)))))
+			      (if (zerop i) 2 i)) 2)))))
 	(skip-chars-forward ",")
 	(skip-chars-forward "^,"))
       (skip-chars-backward " ")
-      (push (buffer-substring beg (point))
-	    accumulated)
+      (setq accumulated
+	    (cons (buffer-substring beg (point))
+		  accumulated))
       (skip-chars-forward "^,")
       (skip-chars-forward ", "))
     accumulated))
 
+(defun gnus-mail-yank-original ()
+  (interactive)
+  (save-excursion
+    (mail-yank-original nil))
+  (or mail-yank-hooks mail-citation-hook
+      (run-hooks 'news-reply-header-hook)))
+
 (defun gnus-inews-add-to-address (group)
   (let ((to-address (mail-fetch-field "to")))
     (when (and to-address
 	       (gnus-alive-p))
       ;; This mail group doesn't have a `to-list', so we add one
-      ;; 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))))))
+      ;; here.  Magic!  
+      (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."
@@ -736,17 +614,17 @@
   (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))))
-    (when (gnus-gethash group gnus-newsrc-hashtb)
-      (error "No such group: %s" group))
+    (and (gnus-gethash group gnus-newsrc-hashtb)
+	 (error "No such group: %s" group))
 
     (save-excursion
       (save-restriction
 	(widen)
-	(message-narrow-to-headers)
+	(gnus-inews-narrow-to-headers)
 	(let (gnus-deletable-headers)
 	  (if (message-news-p)
 	      (message-generate-headers message-required-news-headers)
@@ -757,20 +635,21 @@
 
     (gnus-inews-do-gcc)
 
-    (when (get-buffer gnus-group-buffer)
-      (when (gnus-buffer-exists-p (car-safe reply))
-	(set-buffer (car reply))
-	(and (cdr reply)
-	     (gnus-summary-mark-article-as-replied
-	      (cdr reply))))
-      (when winconf
-	(set-window-configuration winconf)))))
+    (if (get-buffer gnus-group-buffer)
+	(progn
+	  (if (gnus-buffer-exists-p (car-safe reply))
+	      (progn
+		(set-buffer (car reply))
+		(and (cdr reply)
+		     (gnus-summary-mark-article-as-replied 
+		      (cdr reply)))))
+	  (and winconf (set-window-configuration winconf))))))
 
 (defun gnus-article-mail (yank)
   "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))))))
@@ -779,12 +658,9 @@
       (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)
-  (unless (gnus-alive-p)
-    (error "Gnus has been shut down"))
   (gnus-setup-message 'bug
     (delete-other-windows)
     (switch-to-buffer "*Gnus Help Bug*")
@@ -798,10 +674,7 @@
     (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$"))
     (forward-line 1)
     (insert (gnus-version) "\n")
-    (insert (emacs-version) "\n")
-    (when (and (boundp 'nntp-server-type)
-	       (stringp nntp-server-type))
-      (insert nntp-server-type))
+    (insert (emacs-version))
     (insert "\n\n\n\n\n")
     (gnus-debug)
     (goto-char (point-min))
@@ -809,43 +682,49 @@
     (message "")))
 
 (defun gnus-bug-kill-buffer ()
-  (when (get-buffer "*Gnus Help Bug*")
-    (kill-buffer "*Gnus Help Bug*")))
+  (and (get-buffer "*Gnus Help Bug*")
+       (kill-buffer "*Gnus Help Bug*")))
 
 (defun gnus-debug ()
-  "Attempts to go through the Gnus source file and report what variables have been changed.
+  "Attemps to go through the Gnus source file and report what variables have been changed.
 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"
-		 "nnmail.el" "message.el"))
-	file expr olist sym)
+  (let ((files '("gnus.el" "gnus-msg.el" "gnus-score.el" "nnmail.el"
+		 "message.el"))
+	file dirs expr olist sym)
     (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 (get-buffer-create " *gnus bug info*"))
       (buffer-disable-undo (current-buffer))
       (while files
 	(erase-buffer)
-	(when (and (setq file (locate-library (pop files)))
-		   (file-exists-p file))
-	  (insert-file-contents file)
-	  (goto-char (point-min))
-	  (if (not (re-search-forward "^;;* *Internal variables" nil t))
-	      (gnus-message 4 "Malformed sources in file %s" file)
-	    (narrow-to-region (point-min) (point))
+	(setq dirs load-path)
+	(while dirs
+	  (if (or (not (car dirs))
+		  (not (stringp (car dirs)))
+		  (not (file-exists-p 
+			(setq file (concat (file-name-as-directory 
+					    (car dirs)) (car files))))))
+	      (setq dirs (cdr dirs))
+	    (setq dirs nil)
+	    (insert-file-contents file)
 	    (goto-char (point-min))
-	    (while (setq expr (ignore-errors (read (current-buffer))))
-	      (ignore-errors
-		(and (or (eq (car expr) 'defvar)
-			 (eq (car expr) 'defcustom))
-		     (stringp (nth 3 expr))
-		     (or (not (boundp (nth 1 expr)))
-			 (not (equal (eval (nth 2 expr))
-				     (symbol-value (nth 1 expr)))))
-		     (push (nth 1 expr) olist)))))))
+	    (if (not (re-search-forward "^;;* *Internal variables" nil t))
+		(gnus-message 4 "Malformed sources in file %s" file)
+	      (narrow-to-region (point-min) (point))
+	      (goto-char (point-min))
+	      (while (setq expr (condition-case () 
+				    (read (current-buffer)) (error nil)))
+		(condition-case ()
+		    (and (eq (car expr) 'defvar)
+			 (stringp (nth 3 expr))
+			 (or (not (boundp (nth 1 expr)))
+			     (not (equal (eval (nth 2 expr))
+					 (symbol-value (nth 1 expr)))))
+			 (setq olist (cons (nth 1 expr) olist)))
+		  (error nil))))))
+	(setq files (cdr files)))
       (kill-buffer (current-buffer)))
     (when (setq olist (nreverse olist))
       (insert "------------------ Environment follows ------------------\n\n"))
@@ -866,7 +745,7 @@
       (setq olist (cdr olist)))
     (insert "\n\n")
     ;; Remove any null chars - they seem to cause trouble for some
-    ;; mailers.  (Byte-compiled output from the stuff above.)
+    ;; mailers. (Byte-compiled output from the stuff above.) 
     (goto-char (point-min))
     (while (re-search-forward "[\000\200]" nil t)
       (replace-match "" t t))))
@@ -888,16 +767,15 @@
     (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
@@ -911,11 +789,11 @@
 	    (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
@@ -933,12 +811,12 @@
 		(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))))))))))
@@ -947,9 +825,9 @@
   "Insert Gcc headers based on `gnus-outgoing-message-group'."
   (save-excursion
     (save-restriction
-      (message-narrow-to-headers)
+      (gnus-inews-narrow-to-headers)
       (let* ((group gnus-outgoing-message-group)
-	     (gcc (cond
+	     (gcc (cond 
 		   ((gnus-functionp group)
 		    (funcall group))
 		   ((or (stringp group) (list group))
@@ -965,9 +843,8 @@
   (let* ((var gnus-message-archive-group)
 	 (group (or group gnus-newsgroup-name ""))
 	 result
-	 gcc-self-val
 	 (groups
-	  (cond
+	  (cond 
 	   ((null gnus-message-archive-method)
 	    ;; Ignore.
 	    nil)
@@ -988,7 +865,7 @@
 	    (while (and var
 			(not
 			 (setq result
-			       (cond
+			       (cond 
 				((stringp (caar var))
 				 ;; Regexp.
 				 (when (string-match (caar var) group)
@@ -1006,38 +883,23 @@
 	(setq groups (list groups)))
       (save-excursion
 	(save-restriction
-	  (message-narrow-to-headers)
+	  (gnus-inews-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
-		(insert
-		 (if (stringp gcc-self-val)
-		     gcc-self-val
-		   group))
-		(if (not (eq gcc-self-val 'none))
-		    (insert "\n")
-		  (progn
-		    (beginning-of-line)
-		    (kill-line))))
-	    (while (setq name (pop groups))
-	      (insert (if (string-match ":" name)
-			  name
-			(gnus-group-prefixed-name
-			 name gnus-message-archive-method)))
-	      (when groups
-		(insert " ")))
-	    (insert "\n")))))))
+	  (while (setq name (pop groups))
+	    (insert (if (string-match ":" name)
+			name
+		      (gnus-group-prefixed-name 
+		       name gnus-message-archive-method)))
+	    (if 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
+    (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)
@@ -1052,12 +914,12 @@
       (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)