Mercurial > emacs
comparison lisp/gnus/gnus-msg.el @ 88155:d7ddb3e565de
sync with trunk
author | Henrik Enberg <henrik.enberg@telia.com> |
---|---|
date | Mon, 16 Jan 2006 00:03:54 +0000 |
parents | 0d8b17d428b5 |
children |
comparison
equal
deleted
inserted
replaced
88154:8ce476d3ba36 | 88155:d7ddb3e565de |
---|---|
1 ;;; gnus-msg.el --- mail and post interface for Gnus | 1 ;;; gnus-msg.el --- mail and post interface for Gnus |
2 ;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 | 2 |
3 ;; Free Software Foundation, Inc. | 3 ;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, |
4 ;; 2004, 2005 Free Software Foundation, Inc. | |
4 | 5 |
5 ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet> | 6 ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet> |
6 ;; Lars Magne Ingebrigtsen <larsi@gnus.org> | 7 ;; Lars Magne Ingebrigtsen <larsi@gnus.org> |
7 ;; Keywords: news | 8 ;; Keywords: news |
8 | 9 |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
19 ;; GNU General Public License for more details. | 20 ;; GNU General Public License for more details. |
20 | 21 |
21 ;; You should have received a copy of the GNU General Public License | 22 ;; You should have received a copy of the GNU General Public License |
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the | 23 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 24 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
24 ;; Boston, MA 02111-1307, USA. | 25 ;; Boston, MA 02110-1301, USA. |
25 | 26 |
26 ;;; Commentary: | 27 ;;; Commentary: |
27 | 28 |
28 ;;; Code: | 29 ;;; Code: |
29 | 30 |
31 | 32 |
32 (require 'gnus) | 33 (require 'gnus) |
33 (require 'gnus-ems) | 34 (require 'gnus-ems) |
34 (require 'message) | 35 (require 'message) |
35 (require 'gnus-art) | 36 (require 'gnus-art) |
37 (require 'gnus-util) | |
36 | 38 |
37 (defcustom gnus-post-method 'current | 39 (defcustom gnus-post-method 'current |
38 "*Preferred method for posting USENET news. | 40 "*Preferred method for posting USENET news. |
39 | 41 |
40 If this variable is `current' (which is the default), Gnus will use | 42 If this variable is `current' (which is the default), Gnus will use |
52 :link '(custom-manual "(gnus)Posting Server") | 54 :link '(custom-manual "(gnus)Posting Server") |
53 :type `(choice (const native) | 55 :type `(choice (const native) |
54 (const current) | 56 (const current) |
55 (sexp :tag "Methods" ,gnus-select-method))) | 57 (sexp :tag "Methods" ,gnus-select-method))) |
56 | 58 |
57 (defvar gnus-outgoing-message-group nil | 59 (defcustom gnus-outgoing-message-group nil |
58 "*All outgoing messages will be put in this group. | 60 "*All outgoing messages will be put in this group. |
59 If you want to store all your outgoing mail and articles in the group | 61 If you want to store all your outgoing mail and articles in the group |
60 \"nnml:archive\", you set this variable to that value. This variable | 62 \"nnml:archive\", you set this variable to that value. This variable |
61 can also be a list of group names. | 63 can also be a list of group names. |
62 | 64 |
63 If you want to have greater control over what group to put each | 65 If you want to have greater control over what group to put each |
64 message in, you can set this variable to a function that checks the | 66 message in, you can set this variable to a function that checks the |
65 current newsgroup name and then returns a suitable group name (or list | 67 current newsgroup name and then returns a suitable group name (or list |
66 of names).") | 68 of names)." |
67 | 69 :group 'gnus-message |
68 (defvar gnus-mailing-list-groups nil | 70 :type '(choice (const nil) |
69 "*Regexp matching groups that are really mailing lists. | 71 (function) |
72 (string :tag "Group") | |
73 (repeat :tag "List of groups" (string :tag "Group")))) | |
74 | |
75 (defcustom gnus-mailing-list-groups nil | |
76 "*If non-nil a regexp matching groups that are really mailing lists. | |
70 This is useful when you're reading a mailing list that has been | 77 This is useful when you're reading a mailing list that has been |
71 gatewayed to a newsgroup, and you want to followup to an article in | 78 gatewayed to a newsgroup, and you want to followup to an article in |
72 the group.") | 79 the group." |
73 | 80 :group 'gnus-message |
74 (defvar gnus-add-to-list nil | 81 :type '(choice (regexp) |
75 "*If non-nil, add a `to-list' parameter automatically.") | 82 (const nil))) |
76 | 83 |
77 (defvar gnus-crosspost-complaint | 84 (defcustom gnus-add-to-list nil |
85 "*If non-nil, add a `to-list' parameter automatically." | |
86 :group 'gnus-message | |
87 :type 'boolean) | |
88 | |
89 (defcustom gnus-crosspost-complaint | |
78 "Hi, | 90 "Hi, |
79 | 91 |
80 You posted the article below with the following Newsgroups header: | 92 You posted the article below with the following Newsgroups header: |
81 | 93 |
82 Newsgroups: %s | 94 Newsgroups: %s |
88 Thank you. | 100 Thank you. |
89 | 101 |
90 " | 102 " |
91 "Format string to be inserted when complaining about crossposts. | 103 "Format string to be inserted when complaining about crossposts. |
92 The first %s will be replaced by the Newsgroups header; | 104 The first %s will be replaced by the Newsgroups header; |
93 the second with the current group name.") | 105 the second with the current group name." |
94 | 106 :group 'gnus-message |
95 (defvar gnus-message-setup-hook nil | 107 :type 'string) |
96 "Hook run after setting up a message buffer.") | 108 |
97 | 109 (defcustom gnus-message-setup-hook nil |
98 (defvar gnus-bug-create-help-buffer t | 110 "Hook run after setting up a message buffer." |
99 "*Should we create the *Gnus Help Bug* buffer?") | 111 :group 'gnus-message |
100 | 112 :type 'hook) |
101 (defvar gnus-posting-styles nil | 113 |
102 "*Alist of styles to use when posting.") | 114 (defcustom gnus-bug-create-help-buffer t |
103 | 115 "*Should we create the *Gnus Help Bug* buffer?" |
104 (defcustom gnus-group-posting-charset-alist | 116 :group 'gnus-message |
117 :type 'boolean) | |
118 | |
119 (defcustom gnus-posting-styles nil | |
120 "*Alist of styles to use when posting. | |
121 See Info node `(gnus)Posting Styles'." | |
122 :group 'gnus-message | |
123 :link '(custom-manual "(gnus)Posting Styles") | |
124 :type '(repeat (cons (choice (regexp) | |
125 (variable) | |
126 (list (const header) | |
127 (string :tag "Header") | |
128 (regexp :tag "Regexp")) | |
129 (function) | |
130 (sexp)) | |
131 (repeat (list | |
132 (choice (const signature) | |
133 (const signature-file) | |
134 (const organization) | |
135 (const address) | |
136 (const x-face-file) | |
137 (const name) | |
138 (const body) | |
139 (symbol) | |
140 (string :tag "Header")) | |
141 (choice (string) | |
142 (function) | |
143 (variable) | |
144 (sexp))))))) | |
145 | |
146 (defcustom gnus-gcc-mark-as-read nil | |
147 "If non-nil, automatically mark Gcc articles as read." | |
148 :version "22.1" | |
149 :group 'gnus-message | |
150 :type 'boolean) | |
151 | |
152 (make-obsolete-variable 'gnus-inews-mark-gcc-as-read | |
153 'gnus-gcc-mark-as-read) | |
154 | |
155 (defcustom gnus-gcc-externalize-attachments nil | |
156 "Should local-file attachments be included as external parts in Gcc copies? | |
157 If it is `all', attach files as external parts; | |
158 if a regexp and matches the Gcc group name, attach files as external parts; | |
159 if nil, attach files as normal parts." | |
160 :version "22.1" | |
161 :group 'gnus-message | |
162 :type '(choice (const nil :tag "None") | |
163 (const all :tag "Any") | |
164 (string :tag "Regexp"))) | |
165 | |
166 (gnus-define-group-parameter | |
167 posting-charset-alist | |
168 :type list | |
169 :function-document | |
170 "Return the permitted unencoded charsets for posting of GROUP." | |
171 :variable gnus-group-posting-charset-alist | |
172 :variable-default | |
105 '(("^\\(no\\|fr\\)\\.[^,]*\\(,[ \t\n]*\\(no\\|fr\\)\\.[^,]*\\)*$" iso-8859-1 (iso-8859-1)) | 173 '(("^\\(no\\|fr\\)\\.[^,]*\\(,[ \t\n]*\\(no\\|fr\\)\\.[^,]*\\)*$" iso-8859-1 (iso-8859-1)) |
106 ("^\\(fido7\\|relcom\\)\\.[^,]*\\(,[ \t\n]*\\(fido7\\|relcom\\)\\.[^,]*\\)*$" koi8-r (koi8-r)) | 174 ("^\\(fido7\\|relcom\\)\\.[^,]*\\(,[ \t\n]*\\(fido7\\|relcom\\)\\.[^,]*\\)*$" koi8-r (koi8-r)) |
107 (message-this-is-mail nil nil) | 175 (message-this-is-mail nil nil) |
108 (message-this-is-news nil t)) | 176 (message-this-is-news nil t)) |
177 :variable-document | |
109 "Alist of regexps and permitted unencoded charsets for posting. | 178 "Alist of regexps and permitted unencoded charsets for posting. |
110 Each element of the alist has the form (TEST HEADER BODY-LIST), where | 179 Each element of the alist has the form (TEST HEADER BODY-LIST), where |
111 TEST is either a regular expression matching the newsgroup header or a | 180 TEST is either a regular expression matching the newsgroup header or a |
112 variable to query, | 181 variable to query, |
113 HEADER is the charset which may be left unencoded in the header (nil | 182 HEADER is the charset which may be left unencoded in the header (nil |
116 content-transfer encoding in the body, or one of the special values | 185 content-transfer encoding in the body, or one of the special values |
117 nil (always encode using quoted-printable) or t (always use 8bit). | 186 nil (always encode using quoted-printable) or t (always use 8bit). |
118 | 187 |
119 Note that any value other than nil for HEADER infringes some RFCs, so | 188 Note that any value other than nil for HEADER infringes some RFCs, so |
120 use this option with care." | 189 use this option with care." |
121 :type '(repeat (list :tag "Permitted unencoded charsets" | 190 :variable-group gnus-charset |
122 (choice :tag "Where" | 191 :variable-type |
123 (regexp :tag "Group") | 192 '(repeat (list :tag "Permitted unencoded charsets" |
124 (const :tag "Mail message" :value message-this-is-mail) | 193 (choice :tag "Where" |
125 (const :tag "News article" :value message-this-is-news)) | 194 (regexp :tag "Group") |
126 (choice :tag "Header" | 195 (const :tag "Mail message" :value message-this-is-mail) |
127 (const :tag "None" nil) | 196 (const :tag "News article" :value message-this-is-news)) |
128 (symbol :tag "Charset")) | 197 (choice :tag "Header" |
129 (choice :tag "Body" | 198 (const :tag "None" nil) |
130 (const :tag "Any" :value t) | 199 (symbol :tag "Charset")) |
131 (const :tag "None" :value nil) | 200 (choice :tag "Body" |
132 (repeat :tag "Charsets" | 201 (const :tag "Any" :value t) |
133 (symbol :tag "Charset"))))) | 202 (const :tag "None" :value nil) |
134 :group 'gnus-charset) | 203 (repeat :tag "Charsets" |
204 (symbol :tag "Charset"))))) | |
205 :parameter-type '(choice :tag "Permitted unencoded charsets" | |
206 :value nil | |
207 (repeat (symbol))) | |
208 :parameter-document "\ | |
209 List of charsets that are permitted to be unencoded.") | |
210 | |
211 (defcustom gnus-debug-files | |
212 '("gnus.el" "gnus-sum.el" "gnus-group.el" | |
213 "gnus-art.el" "gnus-start.el" "gnus-async.el" | |
214 "gnus-msg.el" "gnus-score.el" "gnus-win.el" "gnus-topic.el" | |
215 "gnus-agent.el" "gnus-cache.el" "gnus-srvr.el" | |
216 "mm-util.el" "mm-decode.el" "nnmail.el" "message.el") | |
217 "Files whose variables will be reported in `gnus-bug'." | |
218 :version "22.1" | |
219 :group 'gnus-message | |
220 :type '(repeat (string :tag "File"))) | |
221 | |
222 (defcustom gnus-debug-exclude-variables | |
223 '(mm-mime-mule-charset-alist | |
224 nnmail-split-fancy message-minibuffer-local-map) | |
225 "Variables that should not be reported in `gnus-bug'." | |
226 :version "22.1" | |
227 :group 'gnus-message | |
228 :type '(repeat (symbol :tag "Variable"))) | |
229 | |
230 (defcustom gnus-discouraged-post-methods | |
231 '(nndraft nnml nnimap nnmaildir nnmh nnfolder nndir) | |
232 "A list of back ends that are not used in \"real\" newsgroups. | |
233 This variable is used only when `gnus-post-method' is `current'." | |
234 :version "22.1" | |
235 :group 'gnus-group-foreign | |
236 :type '(repeat (symbol :tag "Back end"))) | |
237 | |
238 (defcustom gnus-message-replysign | |
239 nil | |
240 "Automatically sign replies to signed messages. | |
241 See also the `mml-default-sign-method' variable." | |
242 :group 'gnus-message | |
243 :type 'boolean) | |
244 | |
245 (defcustom gnus-message-replyencrypt | |
246 nil | |
247 "Automatically encrypt replies to encrypted messages. | |
248 See also the `mml-default-encrypt-method' variable." | |
249 :group 'gnus-message | |
250 :type 'boolean) | |
251 | |
252 (defcustom gnus-message-replysignencrypted | |
253 t | |
254 "Setting this causes automatically encrypted messages to also be signed." | |
255 :group 'gnus-message | |
256 :type 'boolean) | |
257 | |
258 (defcustom gnus-confirm-mail-reply-to-news nil | |
259 "If non-nil, Gnus requests confirmation when replying to news. | |
260 This is done because new users often reply by mistake when reading | |
261 news. | |
262 This can also be a function receiving the group name as the only | |
263 parameter which should return non-nil iff a confirmation is needed, or | |
264 a regexp, in which case a confirmation is asked for iff the group name | |
265 matches the regexp." | |
266 :version "22.1" | |
267 :group 'gnus-message | |
268 :type '(choice (const :tag "No" nil) | |
269 (const :tag "Yes" t) | |
270 (regexp :tag "Iff group matches regexp") | |
271 (function :tag "Iff function evaluates to non-nil"))) | |
272 | |
273 (defcustom gnus-confirm-treat-mail-like-news | |
274 nil | |
275 "If non-nil, Gnus will treat mail like news with regard to confirmation | |
276 when replying by mail. See the `gnus-confirm-mail-reply-to-news' variable | |
277 for fine-tuning this. | |
278 If nil, Gnus will never ask for confirmation if replying to mail." | |
279 :version "22.1" | |
280 :group 'gnus-message | |
281 :type 'boolean) | |
282 | |
283 (defcustom gnus-summary-resend-default-address t | |
284 "If non-nil, Gnus tries to suggest a default address to resend to. | |
285 If nil, the address field will always be empty after invoking | |
286 `gnus-summary-resend-message'." | |
287 :version "22.1" | |
288 :group 'gnus-message | |
289 :type 'boolean) | |
135 | 290 |
136 ;;; Internal variables. | 291 ;;; Internal variables. |
137 | 292 |
138 (defvar gnus-inhibit-posting-styles nil | 293 (defvar gnus-inhibit-posting-styles nil |
139 "Inhibit the use of posting styles.") | 294 "Inhibit the use of posting styles.") |
140 | 295 |
296 (defvar gnus-article-yanked-articles nil) | |
141 (defvar gnus-message-buffer "*Mail Gnus*") | 297 (defvar gnus-message-buffer "*Mail Gnus*") |
142 (defvar gnus-article-copy nil) | 298 (defvar gnus-article-copy nil) |
299 (defvar gnus-check-before-posting nil) | |
143 (defvar gnus-last-posting-server nil) | 300 (defvar gnus-last-posting-server nil) |
144 (defvar gnus-message-group-art nil) | 301 (defvar gnus-message-group-art nil) |
302 | |
303 (defvar gnus-msg-force-broken-reply-to nil) | |
145 | 304 |
146 (defconst gnus-bug-message | 305 (defconst gnus-bug-message |
147 "Sending a bug report to the Gnus Towers. | 306 "Sending a bug report to the Gnus Towers. |
148 ======================================== | 307 ======================================== |
149 | 308 |
164 Thank you for your help in stamping out bugs. | 323 Thank you for your help in stamping out bugs. |
165 ") | 324 ") |
166 | 325 |
167 (eval-and-compile | 326 (eval-and-compile |
168 (autoload 'gnus-uu-post-news "gnus-uu" nil t) | 327 (autoload 'gnus-uu-post-news "gnus-uu" nil t) |
328 (autoload 'news-setup "rnewspost") | |
329 (autoload 'news-reply-mode "rnewspost") | |
169 (autoload 'rmail-dont-reply-to "mail-utils") | 330 (autoload 'rmail-dont-reply-to "mail-utils") |
170 (autoload 'rmail-output "rmailout")) | 331 (autoload 'rmail-output "rmailout")) |
171 | 332 |
172 | 333 |
173 ;;; | 334 ;;; |
174 ;;; Gnus Posting Functions | 335 ;;; Gnus Posting Functions |
175 ;;; | 336 ;;; |
176 | 337 |
177 (gnus-define-keys (gnus-summary-send-map "S" gnus-summary-mode-map) | 338 (gnus-define-keys (gnus-summary-send-map "S" gnus-summary-mode-map) |
178 "p" gnus-summary-post-news | 339 "p" gnus-summary-post-news |
340 "i" gnus-summary-news-other-window | |
179 "f" gnus-summary-followup | 341 "f" gnus-summary-followup |
180 "F" gnus-summary-followup-with-original | 342 "F" gnus-summary-followup-with-original |
181 "c" gnus-summary-cancel-article | 343 "c" gnus-summary-cancel-article |
182 "s" gnus-summary-supersede-article | 344 "s" gnus-summary-supersede-article |
183 "r" gnus-summary-reply | 345 "r" gnus-summary-reply |
184 "y" gnus-summary-yank-message | 346 "y" gnus-summary-yank-message |
185 "R" gnus-summary-reply-with-original | 347 "R" gnus-summary-reply-with-original |
186 "w" gnus-summary-wide-reply | 348 "w" gnus-summary-wide-reply |
187 "W" gnus-summary-wide-reply-with-original | 349 "W" gnus-summary-wide-reply-with-original |
350 "v" gnus-summary-very-wide-reply | |
351 "V" gnus-summary-very-wide-reply-with-original | |
188 "n" gnus-summary-followup-to-mail | 352 "n" gnus-summary-followup-to-mail |
189 "N" gnus-summary-followup-to-mail-with-original | 353 "N" gnus-summary-followup-to-mail-with-original |
190 "m" gnus-summary-mail-other-window | 354 "m" gnus-summary-mail-other-window |
191 "u" gnus-uu-post-news | 355 "u" gnus-uu-post-news |
192 "\M-c" gnus-summary-mail-crosspost-complaint | 356 "\M-c" gnus-summary-mail-crosspost-complaint |
357 "Br" gnus-summary-reply-broken-reply-to | |
358 "BR" gnus-summary-reply-broken-reply-to-with-original | |
193 "om" gnus-summary-mail-forward | 359 "om" gnus-summary-mail-forward |
194 "op" gnus-summary-post-forward | 360 "op" gnus-summary-post-forward |
195 "Om" gnus-uu-digest-mail-forward | 361 "Om" gnus-uu-digest-mail-forward |
196 "Op" gnus-uu-digest-post-forward) | 362 "Op" gnus-uu-digest-post-forward) |
197 | 363 |
198 (gnus-define-keys (gnus-send-bounce-map "D" gnus-summary-send-map) | 364 (gnus-define-keys (gnus-send-bounce-map "D" gnus-summary-send-map) |
199 "b" gnus-summary-resend-bounced-mail | 365 "b" gnus-summary-resend-bounced-mail |
200 ;; "c" gnus-summary-send-draft | 366 ;; "c" gnus-summary-send-draft |
201 "r" gnus-summary-resend-message) | 367 "r" gnus-summary-resend-message |
368 "e" gnus-summary-resend-message-edit) | |
202 | 369 |
203 ;;; Internal functions. | 370 ;;; Internal functions. |
371 | |
372 (defun gnus-inews-make-draft () | |
373 `(lambda () | |
374 (gnus-inews-make-draft-meta-information | |
375 ,gnus-newsgroup-name ',gnus-article-reply))) | |
204 | 376 |
205 (defvar gnus-article-reply nil) | 377 (defvar gnus-article-reply nil) |
206 (defmacro gnus-setup-message (config &rest forms) | 378 (defmacro gnus-setup-message (config &rest forms) |
207 (let ((winconf (make-symbol "gnus-setup-message-winconf")) | 379 (let ((winconf (make-symbol "gnus-setup-message-winconf")) |
208 (buffer (make-symbol "gnus-setup-message-buffer")) | 380 (buffer (make-symbol "gnus-setup-message-buffer")) |
209 (article (make-symbol "gnus-setup-message-article")) | 381 (article (make-symbol "gnus-setup-message-article")) |
382 (yanked (make-symbol "gnus-setup-yanked-articles")) | |
210 (group (make-symbol "gnus-setup-message-group"))) | 383 (group (make-symbol "gnus-setup-message-group"))) |
211 `(let ((,winconf (current-window-configuration)) | 384 `(let ((,winconf (current-window-configuration)) |
212 (,buffer (buffer-name (current-buffer))) | 385 (,buffer (buffer-name (current-buffer))) |
213 (,article (and gnus-article-reply (gnus-summary-article-number))) | 386 (,article gnus-article-reply) |
387 (,yanked gnus-article-yanked-articles) | |
214 (,group gnus-newsgroup-name) | 388 (,group gnus-newsgroup-name) |
215 (message-header-setup-hook | 389 (message-header-setup-hook |
216 (copy-sequence message-header-setup-hook)) | 390 (copy-sequence message-header-setup-hook)) |
217 (mbl mml-buffer-list) | 391 (mbl mml-buffer-list) |
218 (message-mode-hook (copy-sequence message-mode-hook))) | 392 (message-mode-hook (copy-sequence message-mode-hook))) |
219 (setq mml-buffer-list nil) | 393 (setq mml-buffer-list nil) |
220 (add-hook 'message-header-setup-hook 'gnus-inews-insert-gcc) | 394 (add-hook 'message-header-setup-hook 'gnus-inews-insert-gcc) |
221 (add-hook 'message-header-setup-hook 'gnus-inews-insert-archive-gcc) | 395 (add-hook 'message-header-setup-hook 'gnus-inews-insert-archive-gcc) |
222 (add-hook 'message-mode-hook 'gnus-configure-posting-styles) | 396 ;; #### FIXME: for a reason that I did not manage to identify yet, |
397 ;; the variable `gnus-newsgroup-name' does not honor a dynamically | |
398 ;; scoped or setq'ed value from a caller like `C-u gnus-summary-mail'. | |
399 ;; After evaluation of @forms below, it gets the value we actually want | |
400 ;; to override, and the posting styles are used. For that reason, I've | |
401 ;; added an optional argument to `gnus-configure-posting-styles' to | |
402 ;; make sure that the correct value for the group name is used. -- drv | |
403 (add-hook 'message-mode-hook | |
404 (if (memq ,config '(reply-yank reply)) | |
405 (lambda () | |
406 (gnus-configure-posting-styles ,group)) | |
407 (lambda () | |
408 ;; There may be an old " *gnus article copy*" buffer. | |
409 (let (gnus-article-copy) | |
410 (gnus-configure-posting-styles ,group))))) | |
411 (gnus-pull ',(intern gnus-draft-meta-information-header) | |
412 message-required-headers) | |
413 (when (and ,group | |
414 (not (string= ,group ""))) | |
415 (push (cons | |
416 (intern gnus-draft-meta-information-header) | |
417 (gnus-inews-make-draft)) | |
418 message-required-headers)) | |
223 (unwind-protect | 419 (unwind-protect |
224 (progn | 420 (progn |
225 ,@forms) | 421 ,@forms) |
226 (gnus-inews-add-send-actions ,winconf ,buffer ,article) | 422 (gnus-inews-add-send-actions ,winconf ,buffer ,article ,config |
423 ,yanked) | |
227 (setq gnus-message-buffer (current-buffer)) | 424 (setq gnus-message-buffer (current-buffer)) |
228 (set (make-local-variable 'gnus-message-group-art) | 425 (set (make-local-variable 'gnus-message-group-art) |
229 (cons ,group ,article)) | 426 (cons ,group ,article)) |
230 (set (make-local-variable 'gnus-newsgroup-name) ,group) | 427 (set (make-local-variable 'gnus-newsgroup-name) ,group) |
231 (gnus-run-hooks 'gnus-message-setup-hook) | 428 (gnus-run-hooks 'gnus-message-setup-hook) |
232 (if (eq major-mode 'message-mode) | 429 (if (eq major-mode 'message-mode) |
233 (let ((mbl1 mml-buffer-list)) | 430 (let ((mbl1 mml-buffer-list)) |
234 (setq mml-buffer-list mbl) ;; Global value | 431 (setq mml-buffer-list mbl) ;; Global value |
235 (set (make-local-variable 'mml-buffer-list) mbl1);; Local value | 432 (set (make-local-variable 'mml-buffer-list) mbl1);; Local value |
433 (gnus-make-local-hook 'kill-buffer-hook) | |
434 (gnus-make-local-hook 'change-major-mode-hook) | |
236 (add-hook 'change-major-mode-hook 'mml-destroy-buffers nil t) | 435 (add-hook 'change-major-mode-hook 'mml-destroy-buffers nil t) |
237 (add-hook 'kill-buffer-hook 'mml-destroy-buffers t t)) | 436 (add-hook 'kill-buffer-hook 'mml-destroy-buffers t t)) |
238 (mml-destroy-buffers) | 437 (mml-destroy-buffers) |
239 (setq mml-buffer-list mbl))) | 438 (setq mml-buffer-list mbl))) |
439 (message-hide-headers) | |
240 (gnus-add-buffer) | 440 (gnus-add-buffer) |
241 (gnus-configure-windows ,config t) | 441 (gnus-configure-windows ,config t) |
442 (run-hooks 'post-command-hook) | |
242 (set-buffer-modified-p nil)))) | 443 (set-buffer-modified-p nil)))) |
243 | 444 |
445 (defun gnus-inews-make-draft-meta-information (group article) | |
446 (concat "(\"" group "\" " | |
447 (if article (number-to-string | |
448 (if (listp article) | |
449 (car article) | |
450 article)) "\"\"") | |
451 ")")) | |
452 | |
244 ;;;###autoload | 453 ;;;###autoload |
245 (defun gnus-msg-mail (&rest args) | 454 (defun gnus-msg-mail (&optional to subject other-headers continue |
455 switch-action yank-action send-actions) | |
246 "Start editing a mail message to be sent. | 456 "Start editing a mail message to be sent. |
247 Like `message-mail', but with Gnus paraphernalia, particularly the | 457 Like `message-mail', but with Gnus paraphernalia, particularly the |
248 Gcc: header for archiving purposes." | 458 Gcc: header for archiving purposes." |
249 (interactive) | 459 (interactive) |
250 (gnus-setup-message 'message | 460 (let ((buf (current-buffer)) |
251 (apply 'message-mail args)) | 461 mail-buf) |
462 (gnus-setup-message 'message | |
463 (message-mail to subject other-headers continue | |
464 nil yank-action send-actions)) | |
465 (when switch-action | |
466 (setq mail-buf (current-buffer)) | |
467 (switch-to-buffer buf) | |
468 (apply switch-action mail-buf nil))) | |
252 ;; COMPOSEFUNC should return t if succeed. Undocumented ??? | 469 ;; COMPOSEFUNC should return t if succeed. Undocumented ??? |
253 t) | 470 t) |
254 | 471 |
255 ;;;###autoload | 472 ;;;###autoload |
473 (defun gnus-button-mailto (address) | |
474 "Mail to ADDRESS." | |
475 (set-buffer (gnus-copy-article-buffer)) | |
476 (gnus-setup-message 'message | |
477 (message-reply address))) | |
478 | |
479 ;;;###autoload | |
480 (defun gnus-button-reply (&optional to-address wide) | |
481 "Like `message-reply'." | |
482 (interactive) | |
483 (gnus-setup-message 'message | |
484 (message-reply to-address wide))) | |
485 | |
486 ;;;###autoload | |
256 (define-mail-user-agent 'gnus-user-agent | 487 (define-mail-user-agent 'gnus-user-agent |
257 'gnus-msg-mail 'message-send-and-exit | 488 'gnus-msg-mail 'message-send-and-exit |
258 'message-kill-buffer 'message-send-hook) | 489 'message-kill-buffer 'message-send-hook) |
259 | 490 |
260 (defun gnus-setup-posting-charset (group) | 491 (defun gnus-setup-posting-charset (group) |
261 (let ((alist gnus-group-posting-charset-alist) | 492 (let ((alist gnus-group-posting-charset-alist) |
262 (group (or group "")) | 493 (group (or group "")) |
263 elem) | 494 elem) |
264 (when group | 495 (when group |
265 (catch 'found | 496 (catch 'found |
266 (while (setq elem (pop alist)) | 497 (while (setq elem (pop alist)) |
267 (when (or (and (stringp (car elem)) | 498 (when (or (and (stringp (car elem)) |
268 (string-match (car elem) group)) | 499 (string-match (car elem) group)) |
269 (and (gnus-functionp (car elem)) | 500 (and (functionp (car elem)) |
270 (funcall (car elem) group)) | 501 (funcall (car elem) group)) |
271 (and (symbolp (car elem)) | 502 (and (symbolp (car elem)) |
272 (symbol-value (car elem)))) | 503 (symbol-value (car elem)))) |
273 (throw 'found (cons (cadr elem) (caddr elem))))))))) | 504 (throw 'found (cons (cadr elem) (caddr elem))))))))) |
274 | 505 |
275 (defun gnus-inews-add-send-actions (winconf buffer article) | 506 (defun gnus-inews-add-send-actions (winconf buffer article |
276 (make-local-hook 'message-sent-hook) | 507 &optional config yanked) |
508 (gnus-make-local-hook 'message-sent-hook) | |
277 (add-hook 'message-sent-hook (if gnus-agent 'gnus-agent-possibly-do-gcc | 509 (add-hook 'message-sent-hook (if gnus-agent 'gnus-agent-possibly-do-gcc |
278 'gnus-inews-do-gcc) nil t) | 510 'gnus-inews-do-gcc) nil t) |
279 (when gnus-agent | 511 (when gnus-agent |
280 (make-local-hook 'message-header-hook) | 512 (gnus-make-local-hook 'message-header-hook) |
281 (add-hook 'message-header-hook 'gnus-agent-possibly-save-gcc nil t)) | 513 (add-hook 'message-header-hook 'gnus-agent-possibly-save-gcc nil t)) |
282 (setq message-post-method | 514 (setq message-post-method |
283 `(lambda (arg) | 515 `(lambda (arg) |
284 (gnus-post-method arg ,gnus-newsgroup-name))) | 516 (gnus-post-method arg ,gnus-newsgroup-name))) |
285 (setq message-newsreader (setq message-mailer (gnus-extended-version))) | 517 (setq message-newsreader (setq message-mailer (gnus-extended-version))) |
286 (message-add-action | 518 (message-add-action |
287 `(set-window-configuration ,winconf) 'exit 'postpone 'kill) | |
288 (message-add-action | |
289 `(when (gnus-buffer-exists-p ,buffer) | 519 `(when (gnus-buffer-exists-p ,buffer) |
290 (save-excursion | 520 (set-window-configuration ,winconf)) |
291 (set-buffer ,buffer) | 521 'exit 'postpone 'kill) |
292 ,(when article | 522 (let ((to-be-marked (cond |
293 `(gnus-summary-mark-article-as-replied ,article)))) | 523 (yanked |
294 'send)) | 524 (mapcar |
525 (lambda (x) (if (listp x) (car x) x)) yanked)) | |
526 (article (if (listp article) article (list article))) | |
527 (t nil)))) | |
528 (message-add-action | |
529 `(when (gnus-buffer-exists-p ,buffer) | |
530 (save-excursion | |
531 (set-buffer ,buffer) | |
532 ,(when to-be-marked | |
533 (if (eq config 'forward) | |
534 `(gnus-summary-mark-article-as-forwarded ',to-be-marked) | |
535 `(gnus-summary-mark-article-as-replied ',to-be-marked))))) | |
536 'send))) | |
295 | 537 |
296 (put 'gnus-setup-message 'lisp-indent-function 1) | 538 (put 'gnus-setup-message 'lisp-indent-function 1) |
297 (put 'gnus-setup-message 'edebug-form-spec '(form body)) | 539 (put 'gnus-setup-message 'edebug-form-spec '(form body)) |
298 | 540 |
299 ;;; Post news commands of Gnus group mode and summary mode | 541 ;;; Post news commands of Gnus group mode and summary mode |
304 If ARG is 1, prompt for a group name to find the posting style." | 546 If ARG is 1, prompt for a group name to find the posting style." |
305 (interactive "P") | 547 (interactive "P") |
306 ;; We can't `let' gnus-newsgroup-name here, since that leads | 548 ;; We can't `let' gnus-newsgroup-name here, since that leads |
307 ;; to local variables leaking. | 549 ;; to local variables leaking. |
308 (let ((group gnus-newsgroup-name) | 550 (let ((group gnus-newsgroup-name) |
551 ;; make sure last viewed article doesn't affect posting styles: | |
552 (gnus-article-copy) | |
309 (buffer (current-buffer))) | 553 (buffer (current-buffer))) |
310 (unwind-protect | 554 (unwind-protect |
311 (progn | 555 (progn |
312 (setq gnus-newsgroup-name | 556 (setq gnus-newsgroup-name |
313 (if arg | 557 (if arg |
315 (completing-read "Use posting style of group: " | 559 (completing-read "Use posting style of group: " |
316 gnus-active-hashtb nil | 560 gnus-active-hashtb nil |
317 (gnus-read-active-file-p)) | 561 (gnus-read-active-file-p)) |
318 (gnus-group-group-name)) | 562 (gnus-group-group-name)) |
319 "")) | 563 "")) |
564 ;; #### see comment in gnus-setup-message -- drv | |
320 (gnus-setup-message 'message (message-mail))) | 565 (gnus-setup-message 'message (message-mail))) |
321 (save-excursion | 566 (save-excursion |
322 (set-buffer buffer) | 567 (set-buffer buffer) |
323 (setq gnus-newsgroup-name group))))) | 568 (setq gnus-newsgroup-name group))))) |
324 | 569 |
570 (defun gnus-group-news (&optional arg) | |
571 "Start composing a news. | |
572 If ARG, post to group under point. | |
573 If ARG is 1, prompt for group name to post to. | |
574 | |
575 This function prepares a news even when using mail groups. This is useful | |
576 for posting messages to mail groups without actually sending them over the | |
577 network. The corresponding back end must have a 'request-post method." | |
578 (interactive "P") | |
579 ;; We can't `let' gnus-newsgroup-name here, since that leads | |
580 ;; to local variables leaking. | |
581 (let ((group gnus-newsgroup-name) | |
582 ;; make sure last viewed article doesn't affect posting styles: | |
583 (gnus-article-copy) | |
584 (buffer (current-buffer))) | |
585 (unwind-protect | |
586 (progn | |
587 (setq gnus-newsgroup-name | |
588 (if arg | |
589 (if (= 1 (prefix-numeric-value arg)) | |
590 (completing-read "Use group: " | |
591 gnus-active-hashtb nil | |
592 (gnus-read-active-file-p)) | |
593 (gnus-group-group-name)) | |
594 "")) | |
595 ;; #### see comment in gnus-setup-message -- drv | |
596 (gnus-setup-message 'message | |
597 (message-news (gnus-group-real-name gnus-newsgroup-name)))) | |
598 (save-excursion | |
599 (set-buffer buffer) | |
600 (setq gnus-newsgroup-name group))))) | |
601 | |
325 (defun gnus-group-post-news (&optional arg) | 602 (defun gnus-group-post-news (&optional arg) |
326 "Start composing a news message. | 603 "Start composing a message (a news by default). |
327 If ARG, post to the group under point. | 604 If ARG, post to group under point. If ARG is 1, prompt for group name. |
328 If ARG is 1, prompt for a group name." | 605 Depending on the selected group, the message might be either a mail or |
606 a news." | |
329 (interactive "P") | 607 (interactive "P") |
330 ;; Bind this variable here to make message mode hooks work ok. | 608 ;; Bind this variable here to make message mode hooks work ok. |
331 (let ((gnus-newsgroup-name | 609 (let ((gnus-newsgroup-name |
332 (if arg | 610 (if arg |
333 (if (= 1 (prefix-numeric-value arg)) | 611 (if (= 1 (prefix-numeric-value arg)) |
334 (completing-read "Newsgroup: " gnus-active-hashtb nil | 612 (completing-read "Newsgroup: " gnus-active-hashtb nil |
335 (gnus-read-active-file-p)) | 613 (gnus-read-active-file-p)) |
336 (gnus-group-group-name)) | 614 (gnus-group-group-name)) |
337 ""))) | 615 "")) |
616 ;; make sure last viewed article doesn't affect posting styles: | |
617 (gnus-article-copy)) | |
618 (gnus-post-news 'post gnus-newsgroup-name nil nil nil nil | |
619 (string= gnus-newsgroup-name "")))) | |
620 | |
621 (defun gnus-summary-mail-other-window (&optional arg) | |
622 "Start composing a mail in another window. | |
623 Use the posting of the current group by default. | |
624 If ARG, don't do that. If ARG is 1, prompt for group name to find the | |
625 posting style." | |
626 (interactive "P") | |
627 ;; We can't `let' gnus-newsgroup-name here, since that leads | |
628 ;; to local variables leaking. | |
629 (let ((group gnus-newsgroup-name) | |
630 ;; make sure last viewed article doesn't affect posting styles: | |
631 (gnus-article-copy) | |
632 (buffer (current-buffer))) | |
633 (unwind-protect | |
634 (progn | |
635 (setq gnus-newsgroup-name | |
636 (if arg | |
637 (if (= 1 (prefix-numeric-value arg)) | |
638 (completing-read "Use group: " | |
639 gnus-active-hashtb nil | |
640 (gnus-read-active-file-p)) | |
641 "") | |
642 gnus-newsgroup-name)) | |
643 ;; #### see comment in gnus-setup-message -- drv | |
644 (gnus-setup-message 'message (message-mail))) | |
645 (save-excursion | |
646 (set-buffer buffer) | |
647 (setq gnus-newsgroup-name group))))) | |
648 | |
649 (defun gnus-summary-news-other-window (&optional arg) | |
650 "Start composing a news in another window. | |
651 Post to the current group by default. | |
652 If ARG, don't do that. If ARG is 1, prompt for group name to post to. | |
653 | |
654 This function prepares a news even when using mail groups. This is useful | |
655 for posting messages to mail groups without actually sending them over the | |
656 network. The corresponding back end must have a 'request-post method." | |
657 (interactive "P") | |
658 ;; We can't `let' gnus-newsgroup-name here, since that leads | |
659 ;; to local variables leaking. | |
660 (let ((group gnus-newsgroup-name) | |
661 ;; make sure last viewed article doesn't affect posting styles: | |
662 (gnus-article-copy) | |
663 (buffer (current-buffer))) | |
664 (unwind-protect | |
665 (progn | |
666 (setq gnus-newsgroup-name | |
667 (if arg | |
668 (if (= 1 (prefix-numeric-value arg)) | |
669 (completing-read "Use group: " | |
670 gnus-active-hashtb nil | |
671 (gnus-read-active-file-p)) | |
672 "") | |
673 gnus-newsgroup-name)) | |
674 ;; #### see comment in gnus-setup-message -- drv | |
675 (gnus-setup-message 'message | |
676 (progn | |
677 (message-news (gnus-group-real-name gnus-newsgroup-name)) | |
678 (set (make-local-variable 'gnus-discouraged-post-methods) | |
679 (delq | |
680 (car (gnus-find-method-for-group gnus-newsgroup-name)) | |
681 (copy-sequence gnus-discouraged-post-methods)))))) | |
682 (save-excursion | |
683 (set-buffer buffer) | |
684 (setq gnus-newsgroup-name group))))) | |
685 | |
686 (defun gnus-summary-post-news (&optional arg) | |
687 "Start composing a message. Post to the current group by default. | |
688 If ARG, don't do that. If ARG is 1, prompt for a group name to post to. | |
689 Depending on the selected group, the message might be either a mail or | |
690 a news." | |
691 (interactive "P") | |
692 ;; Bind this variable here to make message mode hooks work ok. | |
693 (let ((gnus-newsgroup-name | |
694 (if arg | |
695 (if (= 1 (prefix-numeric-value arg)) | |
696 (completing-read "Newsgroup: " gnus-active-hashtb nil | |
697 (gnus-read-active-file-p)) | |
698 "") | |
699 gnus-newsgroup-name)) | |
700 ;; make sure last viewed article doesn't affect posting styles: | |
701 (gnus-article-copy)) | |
338 (gnus-post-news 'post gnus-newsgroup-name))) | 702 (gnus-post-news 'post gnus-newsgroup-name))) |
339 | 703 |
340 (defun gnus-summary-post-news () | |
341 "Start composing a news message." | |
342 (interactive) | |
343 (gnus-post-news 'post gnus-newsgroup-name)) | |
344 | 704 |
345 (defun gnus-summary-followup (yank &optional force-news) | 705 (defun gnus-summary-followup (yank &optional force-news) |
346 "Compose a followup to an article. | 706 "Compose a followup to an article. |
347 If prefix argument YANK is non-nil, original article is yanked automatically." | 707 If prefix argument YANK is non-nil, the original article is yanked |
708 automatically. | |
709 YANK is a list of elements, where the car of each element is the | |
710 article number, and the cdr is the string to be yanked." | |
348 (interactive | 711 (interactive |
349 (list (and current-prefix-arg | 712 (list (and current-prefix-arg |
350 (gnus-summary-work-articles 1)))) | 713 (gnus-summary-work-articles 1)))) |
351 (when yank | 714 (when yank |
352 (gnus-summary-goto-subject (car yank))) | 715 (gnus-summary-goto-subject |
716 (if (listp (car yank)) | |
717 (caar yank) | |
718 (car yank)))) | |
353 (save-window-excursion | 719 (save-window-excursion |
354 (gnus-summary-select-article)) | 720 (gnus-summary-select-article)) |
355 (let ((headers (gnus-summary-article-header (gnus-summary-article-number))) | 721 (let ((headers (gnus-summary-article-header (gnus-summary-article-number))) |
356 (gnus-newsgroup-name gnus-newsgroup-name)) | 722 (gnus-newsgroup-name gnus-newsgroup-name)) |
357 ;; Send a followup. | 723 ;; Send a followup. |
358 (gnus-post-news nil gnus-newsgroup-name | 724 (gnus-post-news nil gnus-newsgroup-name |
359 headers gnus-article-buffer | 725 headers gnus-article-buffer |
360 yank nil force-news))) | 726 yank nil force-news) |
727 (gnus-summary-handle-replysign))) | |
361 | 728 |
362 (defun gnus-summary-followup-with-original (n &optional force-news) | 729 (defun gnus-summary-followup-with-original (n &optional force-news) |
363 "Compose a followup to an article and include the original article." | 730 "Compose a followup to an article and include the original article. |
731 The text in the region will be yanked. If the region isn't | |
732 active, the entire article will be yanked." | |
364 (interactive "P") | 733 (interactive "P") |
365 (gnus-summary-followup (gnus-summary-work-articles n) force-news)) | 734 (gnus-summary-followup (gnus-summary-work-articles n) force-news)) |
366 | 735 |
367 (defun gnus-summary-followup-to-mail (&optional arg) | 736 (defun gnus-summary-followup-to-mail (&optional arg) |
368 "Followup to the current mail message via news." | 737 "Followup to the current mail message via news." |
375 "Followup to the current mail message via news." | 744 "Followup to the current mail message via news." |
376 (interactive "P") | 745 (interactive "P") |
377 (gnus-summary-followup (gnus-summary-work-articles arg) t)) | 746 (gnus-summary-followup (gnus-summary-work-articles arg) t)) |
378 | 747 |
379 (defun gnus-inews-yank-articles (articles) | 748 (defun gnus-inews-yank-articles (articles) |
380 (let (beg article) | 749 (let (beg article yank-string) |
381 (message-goto-body) | 750 (message-goto-body) |
382 (while (setq article (pop articles)) | 751 (while (setq article (pop articles)) |
752 (when (listp article) | |
753 (setq yank-string (nth 1 article) | |
754 article (nth 0 article))) | |
383 (save-window-excursion | 755 (save-window-excursion |
384 (set-buffer gnus-summary-buffer) | 756 (set-buffer gnus-summary-buffer) |
385 (gnus-summary-select-article nil nil nil article) | 757 (gnus-summary-select-article nil nil nil article) |
386 (gnus-summary-remove-process-mark article)) | 758 (gnus-summary-remove-process-mark article)) |
387 (gnus-copy-article-buffer) | 759 (gnus-copy-article-buffer nil yank-string) |
388 (let ((message-reply-buffer gnus-article-copy) | 760 (let ((message-reply-buffer gnus-article-copy) |
389 (message-reply-headers gnus-current-headers)) | 761 (message-reply-headers |
762 ;; The headers are decoded. | |
763 (with-current-buffer gnus-article-copy | |
764 (save-restriction | |
765 (nnheader-narrow-to-headers) | |
766 (nnheader-parse-naked-head))))) | |
390 (message-yank-original) | 767 (message-yank-original) |
391 (setq beg (or beg (mark t)))) | 768 (setq beg (or beg (mark t)))) |
392 (when articles | 769 (when articles |
393 (insert "\n"))) | 770 (insert "\n"))) |
394 (push-mark) | 771 (push-mark) |
401 post using the current select method." | 778 post using the current select method." |
402 (interactive (gnus-interactive "P\ny")) | 779 (interactive (gnus-interactive "P\ny")) |
403 (let ((articles (gnus-summary-work-articles n)) | 780 (let ((articles (gnus-summary-work-articles n)) |
404 (message-post-method | 781 (message-post-method |
405 `(lambda (arg) | 782 `(lambda (arg) |
406 (gnus-post-method (not (eq symp 'a)) ,gnus-newsgroup-name))) | 783 (gnus-post-method (eq ',symp 'a) ,gnus-newsgroup-name))) |
407 article) | 784 article) |
408 (while (setq article (pop articles)) | 785 (while (setq article (pop articles)) |
409 (when (gnus-summary-select-article t nil nil article) | 786 (when (gnus-summary-select-article t nil nil article) |
410 (when (gnus-eval-in-buffer-window gnus-original-article-buffer | 787 (when (gnus-eval-in-buffer-window gnus-original-article-buffer |
411 (message-cancel-news)) | 788 (message-cancel-news)) |
433 (gnus-summary-mark-as-read ,article gnus-canceled-mark))))) | 810 (gnus-summary-mark-as-read ,article gnus-canceled-mark))))) |
434 message-send-actions)))) | 811 message-send-actions)))) |
435 | 812 |
436 | 813 |
437 | 814 |
438 (defun gnus-copy-article-buffer (&optional article-buffer) | 815 (defun gnus-copy-article-buffer (&optional article-buffer yank-string) |
439 ;; make a copy of the article buffer with all text properties removed | 816 ;; make a copy of the article buffer with all text properties removed |
440 ;; this copy is in the buffer gnus-article-copy. | 817 ;; this copy is in the buffer gnus-article-copy. |
441 ;; if ARTICLE-BUFFER is nil, gnus-article-buffer is used | 818 ;; if ARTICLE-BUFFER is nil, gnus-article-buffer is used |
442 ;; this buffer should be passed to all mail/news reply/post routines. | 819 ;; this buffer should be passed to all mail/news reply/post routines. |
443 (setq gnus-article-copy (gnus-get-buffer-create " *gnus article copy*")) | 820 (setq gnus-article-copy (gnus-get-buffer-create " *gnus article copy*")) |
449 (if (not (and (get-buffer article-buffer) | 826 (if (not (and (get-buffer article-buffer) |
450 (gnus-buffer-exists-p article-buffer))) | 827 (gnus-buffer-exists-p article-buffer))) |
451 (error "Can't find any article buffer") | 828 (error "Can't find any article buffer") |
452 (save-excursion | 829 (save-excursion |
453 (set-buffer article-buffer) | 830 (set-buffer article-buffer) |
454 (save-restriction | 831 (let ((gnus-newsgroup-charset (or gnus-article-charset |
455 ;; Copy over the (displayed) article buffer, delete | 832 gnus-newsgroup-charset)) |
456 ;; hidden text and remove text properties. | 833 (gnus-newsgroup-ignored-charsets |
457 (widen) | 834 (or gnus-article-ignored-charsets |
458 (copy-to-buffer gnus-article-copy (point-min) (point-max)) | 835 gnus-newsgroup-ignored-charsets))) |
459 (set-buffer gnus-article-copy) | 836 (save-restriction |
460 (gnus-article-delete-text-of-type 'annotation) | 837 ;; Copy over the (displayed) article buffer, delete |
461 (gnus-remove-text-with-property 'gnus-prev) | 838 ;; hidden text and remove text properties. |
462 (gnus-remove-text-with-property 'gnus-next) | 839 (widen) |
463 (insert | 840 (copy-to-buffer gnus-article-copy (point-min) (point-max)) |
464 (prog1 | 841 (set-buffer gnus-article-copy) |
465 (buffer-substring-no-properties (point-min) (point-max)) | 842 (when yank-string |
466 (erase-buffer))) | 843 (message-goto-body) |
467 ;; Find the original headers. | 844 (delete-region (point) (point-max)) |
468 (set-buffer gnus-original-article-buffer) | 845 (insert yank-string)) |
469 (goto-char (point-min)) | 846 (gnus-article-delete-text-of-type 'annotation) |
470 (while (looking-at message-unix-mail-delimiter) | 847 (gnus-article-delete-text-of-type 'multipart) |
471 (forward-line 1)) | 848 (gnus-remove-text-with-property 'gnus-prev) |
472 (setq beg (point)) | 849 (gnus-remove-text-with-property 'gnus-next) |
473 (setq end (or (search-forward "\n\n" nil t) (point))) | 850 (gnus-remove-text-with-property 'gnus-decoration) |
474 ;; Delete the headers from the displayed articles. | 851 (insert |
475 (set-buffer gnus-article-copy) | 852 (prog1 |
476 (delete-region (goto-char (point-min)) | 853 (buffer-substring-no-properties (point-min) (point-max)) |
477 (or (search-forward "\n\n" nil t) (point-max))) | 854 (erase-buffer))) |
478 ;; Insert the original article headers. | 855 ;; Find the original headers. |
479 (insert-buffer-substring gnus-original-article-buffer beg end) | 856 (set-buffer gnus-original-article-buffer) |
480 (article-decode-encoded-words))) | 857 (goto-char (point-min)) |
858 (while (looking-at message-unix-mail-delimiter) | |
859 (forward-line 1)) | |
860 (let ((mail-header-separator "")) | |
861 (setq beg (point) | |
862 end (or (message-goto-body) | |
863 ;; There may be just a header. | |
864 (point-max)))) | |
865 ;; Delete the headers from the displayed articles. | |
866 (set-buffer gnus-article-copy) | |
867 (let ((mail-header-separator "")) | |
868 (delete-region (goto-char (point-min)) | |
869 (or (message-goto-body) (point-max)))) | |
870 ;; Insert the original article headers. | |
871 (insert-buffer-substring gnus-original-article-buffer beg end) | |
872 ;; Decode charsets. | |
873 (let ((gnus-article-decode-hook | |
874 (delq 'article-decode-charset | |
875 (copy-sequence gnus-article-decode-hook))) | |
876 (rfc2047-quote-decoded-words-containing-tspecials t)) | |
877 (run-hooks 'gnus-article-decode-hook))))) | |
481 gnus-article-copy))) | 878 gnus-article-copy))) |
482 | 879 |
483 (defun gnus-post-news (post &optional group header article-buffer yank subject | 880 (defun gnus-post-news (post &optional group header article-buffer yank subject |
484 force-news) | 881 force-news) |
485 (when article-buffer | 882 (when article-buffer |
486 (gnus-copy-article-buffer)) | 883 (gnus-copy-article-buffer)) |
487 (let ((gnus-article-reply article-buffer) | 884 (let ((gnus-article-reply (and article-buffer (gnus-summary-article-number))) |
885 (gnus-article-yanked-articles yank) | |
488 (add-to-list gnus-add-to-list)) | 886 (add-to-list gnus-add-to-list)) |
489 (gnus-setup-message (cond (yank 'reply-yank) | 887 (gnus-setup-message (cond (yank 'reply-yank) |
490 (article-buffer 'reply) | 888 (article-buffer 'reply) |
491 (t 'message)) | 889 (t 'message)) |
492 (let* ((group (or group gnus-newsgroup-name)) | 890 (let* ((group (or group gnus-newsgroup-name)) |
493 (charset (gnus-group-name-charset nil group)) | 891 (charset (gnus-group-name-charset nil group)) |
494 (pgroup group) | 892 (pgroup group) |
495 to-address to-group mailing-list to-list | 893 to-address to-group mailing-list to-list |
496 newsgroup-p) | 894 newsgroup-p) |
497 (when group | 895 (when group |
498 (setq to-address (gnus-group-find-parameter group 'to-address) | 896 (setq to-address (gnus-parameter-to-address group) |
499 to-group (gnus-group-find-parameter group 'to-group) | 897 to-group (gnus-group-find-parameter group 'to-group) |
500 to-list (gnus-group-find-parameter group 'to-list) | 898 to-list (gnus-parameter-to-list group) |
501 newsgroup-p (gnus-group-find-parameter group 'newsgroup) | 899 newsgroup-p (gnus-group-find-parameter group 'newsgroup) |
502 mailing-list (when gnus-mailing-list-groups | 900 mailing-list (when gnus-mailing-list-groups |
503 (string-match gnus-mailing-list-groups group)) | 901 (string-match gnus-mailing-list-groups group)) |
504 group (gnus-group-name-decode (gnus-group-real-name group) | 902 group (gnus-group-name-decode (gnus-group-real-name group) |
505 charset))) | 903 charset))) |
507 (gnus-news-group-p to-group)) | 905 (gnus-news-group-p to-group)) |
508 newsgroup-p | 906 newsgroup-p |
509 force-news | 907 force-news |
510 (and (gnus-news-group-p | 908 (and (gnus-news-group-p |
511 (or pgroup gnus-newsgroup-name) | 909 (or pgroup gnus-newsgroup-name) |
512 (if header (mail-header-number header) | 910 (or header gnus-current-article)) |
513 gnus-current-article)) | |
514 (not mailing-list) | 911 (not mailing-list) |
515 (not to-list) | 912 (not to-list) |
516 (not to-address))) | 913 (not to-address))) |
517 ;; This is news. | 914 ;; This is news. |
518 (if post | 915 (if post |
519 (message-news (or to-group group)) | 916 (message-news |
917 (or to-group | |
918 (and (not (gnus-virtual-group-p pgroup)) group))) | |
520 (set-buffer gnus-article-copy) | 919 (set-buffer gnus-article-copy) |
521 (gnus-msg-treat-broken-reply-to) | 920 (gnus-msg-treat-broken-reply-to) |
522 (message-followup (if (or newsgroup-p force-news) nil to-group))) | 921 (message-followup (if (or newsgroup-p force-news) |
922 (if (save-restriction | |
923 (article-narrow-to-head) | |
924 (message-fetch-field "newsgroups")) | |
925 nil | |
926 "") | |
927 to-group))) | |
523 ;; The is mail. | 928 ;; The is mail. |
524 (if post | 929 (if post |
525 (progn | 930 (progn |
526 (message-mail (or to-address to-list)) | 931 (message-mail (or to-address to-list)) |
527 ;; Arrange for mail groups that have no `to-address' to | 932 ;; Arrange for mail groups that have no `to-address' to |
535 (gnus-msg-treat-broken-reply-to) | 940 (gnus-msg-treat-broken-reply-to) |
536 (message-wide-reply to-address))) | 941 (message-wide-reply to-address))) |
537 (when yank | 942 (when yank |
538 (gnus-inews-yank-articles yank)))))) | 943 (gnus-inews-yank-articles yank)))))) |
539 | 944 |
540 (defun gnus-msg-treat-broken-reply-to () | 945 (defun gnus-msg-treat-broken-reply-to (&optional force) |
541 "Remove the Reply-to header if broken-reply-to." | 946 "Remove the Reply-to header if broken-reply-to." |
542 (when (gnus-group-find-parameter | 947 (when (or force |
543 gnus-newsgroup-name 'broken-reply-to) | 948 (gnus-group-find-parameter |
949 gnus-newsgroup-name 'broken-reply-to)) | |
544 (save-restriction | 950 (save-restriction |
545 (message-narrow-to-head) | 951 (message-narrow-to-head) |
546 (message-remove-header "reply-to")))) | 952 (message-remove-header "reply-to")))) |
547 | 953 |
548 (defun gnus-post-method (arg group &optional silent) | 954 (defun gnus-post-method (arg group &optional silent) |
549 "Return the posting method based on GROUP and ARG. | 955 "Return the posting method based on GROUP and ARG. |
550 If SILENT, don't prompt the user." | 956 If SILENT, don't prompt the user." |
551 (let ((group-method (gnus-find-method-for-group group))) | 957 (let ((gnus-post-method (or (gnus-parameter-post-method group) |
958 gnus-post-method)) | |
959 (group-method (gnus-find-method-for-group group))) | |
552 (cond | 960 (cond |
553 ;; If the group-method is nil (which shouldn't happen) we use | 961 ;; If the group-method is nil (which shouldn't happen) we use |
554 ;; the default method. | 962 ;; the default method. |
555 ((null group-method) | 963 ((null group-method) |
556 (or (and (null (eq gnus-post-method 'active)) gnus-post-method) | 964 (or (and (listp gnus-post-method) ;If not current/native/nil |
557 gnus-select-method message-post-method)) | 965 (not (listp (car gnus-post-method))) ; and not a list of methods |
966 gnus-post-method) ;then use it. | |
967 gnus-select-method | |
968 message-post-method)) | |
558 ;; We want the inverse of the default | 969 ;; We want the inverse of the default |
559 ((and arg (not (eq arg 0))) | 970 ((and arg (not (eq arg 0))) |
560 (if (eq gnus-post-method 'active) | 971 (if (eq gnus-post-method 'current) |
561 gnus-select-method | 972 gnus-select-method |
562 group-method)) | 973 group-method)) |
563 ;; We query the user for a post method. | 974 ;; We query the user for a post method. |
564 ((or arg | 975 ((or arg |
565 (and gnus-post-method | 976 (and (listp gnus-post-method) |
566 (not (eq gnus-post-method 'current)) | |
567 (listp (car gnus-post-method)))) | 977 (listp (car gnus-post-method)))) |
568 (let* ((methods | 978 (let* ((methods |
569 ;; Collect all methods we know about. | 979 ;; Collect all methods we know about. |
570 (append | 980 (append |
571 (when (and gnus-post-method | 981 (when (listp gnus-post-method) |
572 (not (eq gnus-post-method 'current))) | |
573 (if (listp (car gnus-post-method)) | 982 (if (listp (car gnus-post-method)) |
574 gnus-post-method | 983 gnus-post-method |
575 (list gnus-post-method))) | 984 (list gnus-post-method))) |
576 gnus-secondary-select-methods | 985 gnus-secondary-select-methods |
577 (mapcar 'cdr gnus-server-alist) | 986 (mapcar 'cdr gnus-server-alist) |
588 (push method post-methods))) | 997 (push method post-methods))) |
589 ;; Create a name-method alist. | 998 ;; Create a name-method alist. |
590 (setq method-alist | 999 (setq method-alist |
591 (mapcar | 1000 (mapcar |
592 (lambda (m) | 1001 (lambda (m) |
593 (list (concat (cadr m) " (" (symbol-name (car m)) ")") m)) | 1002 (if (equal (cadr m) "") |
1003 (list (symbol-name (car m)) m) | |
1004 (list (concat (cadr m) " (" (symbol-name (car m)) ")") m))) | |
594 post-methods)) | 1005 post-methods)) |
595 ;; Query the user. | 1006 ;; Query the user. |
596 (cadr | 1007 (cadr |
597 (assoc | 1008 (assoc |
598 (setq gnus-last-posting-server | 1009 (setq gnus-last-posting-server |
604 "Posting method: " method-alist nil t | 1015 "Posting method: " method-alist nil t |
605 (cons (or gnus-last-posting-server "") 0)))) | 1016 (cons (or gnus-last-posting-server "") 0)))) |
606 method-alist)))) | 1017 method-alist)))) |
607 ;; Override normal method. | 1018 ;; Override normal method. |
608 ((and (eq gnus-post-method 'current) | 1019 ((and (eq gnus-post-method 'current) |
609 (not (eq (car group-method) 'nndraft)) | 1020 (not (memq (car group-method) gnus-discouraged-post-methods)) |
610 (gnus-get-function group-method 'request-post t) | 1021 (gnus-get-function group-method 'request-post t)) |
611 (not arg)) | 1022 (assert (not arg)) |
612 group-method) | 1023 group-method) |
613 ((and gnus-post-method | 1024 ;; Use gnus-post-method. |
614 (not (eq gnus-post-method 'current))) | 1025 ((listp gnus-post-method) ;A method... |
1026 (assert (not (listp (car gnus-post-method)))) ;... not a list of methods. | |
615 gnus-post-method) | 1027 gnus-post-method) |
616 ;; Use the normal select method. | 1028 ;; Use the normal select method (nil or native). |
617 (t gnus-select-method)))) | 1029 (t gnus-select-method)))) |
618 | 1030 |
619 | 1031 |
620 | 1032 |
621 ;; Dummies to avoid byte-compile warning. | |
622 (eval-when-compile | |
623 (defvar nnspool-rejected-article-hook) | |
624 (defvar xemacs-codename)) | |
625 | |
626 (defun gnus-extended-version () | 1033 (defun gnus-extended-version () |
627 "Stringified Gnus version and Emacs version." | 1034 "Stringified Gnus version and Emacs version. |
1035 See the variable `gnus-user-agent'." | |
628 (interactive) | 1036 (interactive) |
629 (concat | 1037 (if (stringp gnus-user-agent) |
630 "Gnus/" (prin1-to-string (gnus-continuum-version gnus-version) t) | 1038 gnus-user-agent |
631 " (" gnus-version ")" | 1039 ;; `gnus-user-agent' is a list: |
632 " " | 1040 (let* ((float-output-format nil) |
633 (cond | 1041 (gnus-v |
634 ((string-match "^\\(\\([.0-9]+\\)*\\)\\.[0-9]+$" emacs-version) | 1042 (when (memq 'gnus gnus-user-agent) |
635 (concat "Emacs/" (match-string 1 emacs-version))) | 1043 (concat "Gnus/" |
636 ((string-match "\\([A-Z]*[Mm][Aa][Cc][Ss]\\)[^(]*\\(\\((beta.*)\\|'\\)\\)?" | 1044 (prin1-to-string (gnus-continuum-version gnus-version) t) |
637 emacs-version) | 1045 " (" gnus-version ")"))) |
638 (concat (match-string 1 emacs-version) | 1046 (emacs-v (gnus-emacs-version))) |
639 (format "/%d.%d" emacs-major-version emacs-minor-version) | 1047 (concat gnus-v (when (and gnus-v emacs-v) " ") |
640 (if (match-beginning 3) | 1048 emacs-v)))) |
641 (match-string 3 emacs-version) | |
642 "") | |
643 (if (boundp 'xemacs-codename) | |
644 (concat " (" xemacs-codename ")") | |
645 ""))) | |
646 (t emacs-version)))) | |
647 | 1049 |
648 | 1050 |
649 ;;; | 1051 ;;; |
650 ;;; Gnus Mail Functions | 1052 ;;; Gnus Mail Functions |
651 ;;; | 1053 ;;; |
652 | 1054 |
653 ;;; Mail reply commands of Gnus summary mode | 1055 ;;; Mail reply commands of Gnus summary mode |
654 | 1056 |
655 (defun gnus-summary-reply (&optional yank wide) | 1057 (defun gnus-summary-reply (&optional yank wide very-wide) |
656 "Start composing a reply mail to the current message. | 1058 "Start composing a mail reply to the current message. |
657 If prefix argument YANK is non-nil, the original article is yanked | 1059 If prefix argument YANK is non-nil, the original article is yanked |
658 automatically." | 1060 automatically. |
1061 If WIDE, make a wide reply. | |
1062 If VERY-WIDE, make a very wide reply." | |
659 (interactive | 1063 (interactive |
660 (list (and current-prefix-arg | 1064 (list (and current-prefix-arg |
661 (gnus-summary-work-articles 1)))) | 1065 (gnus-summary-work-articles 1)))) |
662 ;; Stripping headers should be specified with mail-yank-ignored-headers. | 1066 ;; Allow user to require confirmation before replying by mail to the |
663 (when yank | 1067 ;; author of a news article (or mail message). |
664 (gnus-summary-goto-subject (car yank))) | 1068 (when (or |
665 (let ((gnus-article-reply t)) | 1069 (not (or (gnus-news-group-p gnus-newsgroup-name) |
666 (gnus-setup-message (if yank 'reply-yank 'reply) | 1070 gnus-confirm-treat-mail-like-news)) |
667 (gnus-summary-select-article) | 1071 (not (cond ((stringp gnus-confirm-mail-reply-to-news) |
668 (set-buffer (gnus-copy-article-buffer)) | 1072 (string-match gnus-confirm-mail-reply-to-news |
669 (gnus-msg-treat-broken-reply-to) | 1073 gnus-newsgroup-name)) |
670 (save-restriction | 1074 ((functionp gnus-confirm-mail-reply-to-news) |
671 (message-narrow-to-head) | 1075 (funcall gnus-confirm-mail-reply-to-news gnus-newsgroup-name)) |
672 (goto-char (point-max))) | 1076 (t gnus-confirm-mail-reply-to-news))) |
673 (mml-quote-region (point) (point-max)) | 1077 (y-or-n-p "Really reply by mail to article author? ")) |
674 (message-reply nil wide) | 1078 (let* ((article |
1079 (if (listp (car yank)) | |
1080 (caar yank) | |
1081 (car yank))) | |
1082 (gnus-article-reply (or article (gnus-summary-article-number))) | |
1083 (gnus-article-yanked-articles yank) | |
1084 (headers "")) | |
1085 ;; Stripping headers should be specified with mail-yank-ignored-headers. | |
675 (when yank | 1086 (when yank |
676 (gnus-inews-yank-articles yank))))) | 1087 (gnus-summary-goto-subject article)) |
1088 (gnus-setup-message (if yank 'reply-yank 'reply) | |
1089 (if (not very-wide) | |
1090 (gnus-summary-select-article) | |
1091 (dolist (article very-wide) | |
1092 (gnus-summary-select-article nil nil nil article) | |
1093 (save-excursion | |
1094 (set-buffer (gnus-copy-article-buffer)) | |
1095 (gnus-msg-treat-broken-reply-to) | |
1096 (save-restriction | |
1097 (message-narrow-to-head) | |
1098 (setq headers (concat headers (buffer-string))))))) | |
1099 (set-buffer (gnus-copy-article-buffer)) | |
1100 (gnus-msg-treat-broken-reply-to gnus-msg-force-broken-reply-to) | |
1101 (save-restriction | |
1102 (message-narrow-to-head) | |
1103 (when very-wide | |
1104 (erase-buffer) | |
1105 (insert headers)) | |
1106 (goto-char (point-max))) | |
1107 (mml-quote-region (point) (point-max)) | |
1108 (message-reply nil wide) | |
1109 (when yank | |
1110 (gnus-inews-yank-articles yank)) | |
1111 (gnus-summary-handle-replysign))))) | |
1112 | |
1113 (defun gnus-summary-handle-replysign () | |
1114 "Check the various replysign variables and take action accordingly." | |
1115 (when (or gnus-message-replysign gnus-message-replyencrypt) | |
1116 (let (signed encrypted) | |
1117 (save-excursion | |
1118 (set-buffer gnus-article-buffer) | |
1119 (setq signed (memq 'signed gnus-article-wash-types)) | |
1120 (setq encrypted (memq 'encrypted gnus-article-wash-types))) | |
1121 (cond ((and gnus-message-replyencrypt encrypted) | |
1122 (mml-secure-message mml-default-encrypt-method | |
1123 (if gnus-message-replysignencrypted | |
1124 'signencrypt | |
1125 'encrypt))) | |
1126 ((and gnus-message-replysign signed) | |
1127 (mml-secure-message mml-default-sign-method 'sign)))))) | |
677 | 1128 |
678 (defun gnus-summary-reply-with-original (n &optional wide) | 1129 (defun gnus-summary-reply-with-original (n &optional wide) |
679 "Start composing a reply mail to the current message. | 1130 "Start composing a reply mail to the current message. |
680 The original article will be yanked." | 1131 The original article will be yanked." |
681 (interactive "P") | 1132 (interactive "P") |
682 (gnus-summary-reply (gnus-summary-work-articles n) wide)) | 1133 (gnus-summary-reply (gnus-summary-work-articles n) wide)) |
1134 | |
1135 (defun gnus-summary-reply-broken-reply-to (&optional yank wide very-wide) | |
1136 "Like `gnus-summary-reply' except removing reply-to field. | |
1137 If prefix argument YANK is non-nil, the original article is yanked | |
1138 automatically. | |
1139 If WIDE, make a wide reply. | |
1140 If VERY-WIDE, make a very wide reply." | |
1141 (interactive | |
1142 (list (and current-prefix-arg | |
1143 (gnus-summary-work-articles 1)))) | |
1144 (let ((gnus-msg-force-broken-reply-to t)) | |
1145 (gnus-summary-reply yank wide very-wide))) | |
1146 | |
1147 (defun gnus-summary-reply-broken-reply-to-with-original (n &optional wide) | |
1148 "Like `gnus-summary-reply-with-original' except removing reply-to field. | |
1149 The original article will be yanked." | |
1150 (interactive "P") | |
1151 (gnus-summary-reply-broken-reply-to (gnus-summary-work-articles n) wide)) | |
683 | 1152 |
684 (defun gnus-summary-wide-reply (&optional yank) | 1153 (defun gnus-summary-wide-reply (&optional yank) |
685 "Start composing a wide reply mail to the current message. | 1154 "Start composing a wide reply mail to the current message. |
686 If prefix argument YANK is non-nil, the original article is yanked | 1155 If prefix argument YANK is non-nil, the original article is yanked |
687 automatically." | 1156 automatically." |
690 (gnus-summary-work-articles 1)))) | 1159 (gnus-summary-work-articles 1)))) |
691 (gnus-summary-reply yank t)) | 1160 (gnus-summary-reply yank t)) |
692 | 1161 |
693 (defun gnus-summary-wide-reply-with-original (n) | 1162 (defun gnus-summary-wide-reply-with-original (n) |
694 "Start composing a wide reply mail to the current message. | 1163 "Start composing a wide reply mail to the current message. |
1164 The original article will be yanked. | |
1165 Uses the process/prefix convention." | |
1166 (interactive "P") | |
1167 (gnus-summary-reply-with-original n t)) | |
1168 | |
1169 (defun gnus-summary-very-wide-reply (&optional yank) | |
1170 "Start composing a very wide reply mail to the current message. | |
1171 If prefix argument YANK is non-nil, the original article is yanked | |
1172 automatically." | |
1173 (interactive | |
1174 (list (and current-prefix-arg | |
1175 (gnus-summary-work-articles 1)))) | |
1176 (gnus-summary-reply yank t (gnus-summary-work-articles yank))) | |
1177 | |
1178 (defun gnus-summary-very-wide-reply-with-original (n) | |
1179 "Start composing a very wide reply mail to the current message. | |
695 The original article will be yanked." | 1180 The original article will be yanked." |
696 (interactive "P") | 1181 (interactive "P") |
697 (gnus-summary-reply-with-original n t)) | 1182 (gnus-summary-reply |
1183 (gnus-summary-work-articles n) t (gnus-summary-work-articles n))) | |
698 | 1184 |
699 (defun gnus-summary-mail-forward (&optional arg post) | 1185 (defun gnus-summary-mail-forward (&optional arg post) |
700 "Forward the current message to another user. | 1186 "Forward the current message(s) to another user. |
701 If ARG is nil, see `message-forward-as-mime' and `message-forward-show-mml'; | 1187 If process marks exist, forward all marked messages; |
1188 if ARG is nil, see `message-forward-as-mime' and `message-forward-show-mml'; | |
702 if ARG is 1, decode the message and forward directly inline; | 1189 if ARG is 1, decode the message and forward directly inline; |
703 if ARG is 2, forward message as an rfc822 MIME section; | 1190 if ARG is 2, forward message as an rfc822 MIME section; |
704 if ARG is 3, decode message and forward as an rfc822 MIME section; | 1191 if ARG is 3, decode message and forward as an rfc822 MIME section; |
705 if ARG is 4, forward message directly inline; | 1192 if ARG is 4, forward message directly inline; |
706 otherwise, use flipped `message-forward-as-mime'. | 1193 otherwise, use flipped `message-forward-as-mime'. |
707 If POST, post instead of mail." | 1194 If POST, post instead of mail. |
1195 For the `inline' alternatives, also see the variable | |
1196 `message-forward-ignored-headers'." | |
708 (interactive "P") | 1197 (interactive "P") |
709 (let ((message-forward-as-mime message-forward-as-mime) | 1198 (if (cdr (gnus-summary-work-articles nil)) |
710 (message-forward-show-mml message-forward-show-mml)) | 1199 ;; Process marks are given. |
711 (cond | 1200 (gnus-uu-digest-mail-forward arg post) |
712 ((null arg)) | 1201 ;; No process marks. |
713 ((eq arg 1) (setq message-forward-as-mime nil | 1202 (let ((message-forward-as-mime message-forward-as-mime) |
714 message-forward-show-mml t)) | 1203 (message-forward-show-mml message-forward-show-mml)) |
715 ((eq arg 2) (setq message-forward-as-mime t | 1204 (cond |
716 message-forward-show-mml nil)) | 1205 ((null arg)) |
717 ((eq arg 3) (setq message-forward-as-mime t | 1206 ((eq arg 1) |
718 message-forward-show-mml t)) | 1207 (setq message-forward-as-mime nil |
719 ((eq arg 4) (setq message-forward-as-mime nil | 1208 message-forward-show-mml t)) |
720 message-forward-show-mml nil)) | 1209 ((eq arg 2) |
721 (t (setq message-forward-as-mime (not message-forward-as-mime)))) | 1210 (setq message-forward-as-mime t |
722 (gnus-setup-message 'forward | 1211 message-forward-show-mml nil)) |
723 (gnus-summary-select-article) | 1212 ((eq arg 3) |
724 (let ((mail-parse-charset gnus-newsgroup-charset) | 1213 (setq message-forward-as-mime t |
725 (mail-parse-ignored-charsets gnus-newsgroup-ignored-charsets)) | 1214 message-forward-show-mml t)) |
726 (set-buffer gnus-original-article-buffer) | 1215 ((eq arg 4) |
727 (message-forward post))))) | 1216 (setq message-forward-as-mime nil |
1217 message-forward-show-mml nil)) | |
1218 (t | |
1219 (setq message-forward-as-mime (not message-forward-as-mime)))) | |
1220 (let* ((gnus-article-reply (gnus-summary-article-number)) | |
1221 (gnus-article-yanked-articles (list gnus-article-reply))) | |
1222 (gnus-setup-message 'forward | |
1223 (gnus-summary-select-article) | |
1224 (let ((mail-parse-charset | |
1225 (or (and (gnus-buffer-live-p gnus-article-buffer) | |
1226 (with-current-buffer gnus-article-buffer | |
1227 gnus-article-charset)) | |
1228 gnus-newsgroup-charset)) | |
1229 (mail-parse-ignored-charsets | |
1230 gnus-newsgroup-ignored-charsets)) | |
1231 (set-buffer gnus-original-article-buffer) | |
1232 (message-forward post))))))) | |
728 | 1233 |
729 (defun gnus-summary-resend-message (address n) | 1234 (defun gnus-summary-resend-message (address n) |
730 "Resend the current article to ADDRESS." | 1235 "Resend the current article to ADDRESS." |
731 (interactive "sResend message(s) to: \nP") | 1236 (interactive |
1237 (list (message-read-from-minibuffer | |
1238 "Resend message(s) to: " | |
1239 (when (and gnus-summary-resend-default-address | |
1240 (gnus-buffer-live-p gnus-original-article-buffer)) | |
1241 ;; If some other article is currently selected, the | |
1242 ;; initial-contents is wrong. Whatever, it is just the | |
1243 ;; initial-contents. | |
1244 (with-current-buffer gnus-original-article-buffer | |
1245 (nnmail-fetch-field "to")))) | |
1246 current-prefix-arg)) | |
732 (let ((articles (gnus-summary-work-articles n)) | 1247 (let ((articles (gnus-summary-work-articles n)) |
733 article) | 1248 article) |
734 (while (setq article (pop articles)) | 1249 (while (setq article (pop articles)) |
735 (gnus-summary-select-article nil nil nil article) | 1250 (gnus-summary-select-article nil nil nil article) |
736 (save-excursion | 1251 (save-excursion |
737 (set-buffer gnus-original-article-buffer) | 1252 (set-buffer gnus-original-article-buffer) |
738 (message-resend address))))) | 1253 (message-resend address)) |
1254 (gnus-summary-mark-article-as-forwarded article)))) | |
1255 | |
1256 ;; From: Matthieu Moy <Matthieu.Moy@imag.fr> | |
1257 (defun gnus-summary-resend-message-edit () | |
1258 "Resend an article that has already been sent. | |
1259 A new buffer will be created to allow the user to modify body and | |
1260 contents of the message, and then, everything will happen as when | |
1261 composing a new message." | |
1262 (interactive) | |
1263 (let ((article (gnus-summary-article-number))) | |
1264 (gnus-setup-message 'reply-yank | |
1265 (gnus-summary-select-article t) | |
1266 (set-buffer gnus-original-article-buffer) | |
1267 (let ((cur (current-buffer)) | |
1268 (to (message-fetch-field "to"))) | |
1269 ;; Get a normal message buffer. | |
1270 (message-pop-to-buffer (message-buffer-name "Resend" to)) | |
1271 (insert-buffer-substring cur) | |
1272 (mime-to-mml) | |
1273 (message-narrow-to-head-1) | |
1274 ;; Gnus will generate a new one when sending. | |
1275 (message-remove-header "Message-ID") | |
1276 (message-remove-header message-ignored-resent-headers t) | |
1277 ;; Remove unwanted headers. | |
1278 (goto-char (point-max)) | |
1279 (insert mail-header-separator) | |
1280 (goto-char (point-min)) | |
1281 (when (re-search-forward "^To:\\|^Newsgroups:" nil 'move) | |
1282 (forward-char 1)) | |
1283 (widen))))) | |
739 | 1284 |
740 (defun gnus-summary-post-forward (&optional arg) | 1285 (defun gnus-summary-post-forward (&optional arg) |
741 "Forward the current article to a newsgroup. | 1286 "Forward the current article to a newsgroup. |
742 See `gnus-summary-mail-forward' for ARG." | 1287 See `gnus-summary-mail-forward' for ARG." |
743 (interactive "P") | 1288 (interactive "P") |
794 (replace-match " (crosspost notification)" t t) | 1339 (replace-match " (crosspost notification)" t t) |
795 (gnus-deactivate-mark) | 1340 (gnus-deactivate-mark) |
796 (when (gnus-y-or-n-p "Send this complaint? ") | 1341 (when (gnus-y-or-n-p "Send this complaint? ") |
797 (message-send-and-exit))))))) | 1342 (message-send-and-exit))))))) |
798 | 1343 |
799 (defun gnus-summary-mail-other-window () | |
800 "Compose mail in other window." | |
801 (interactive) | |
802 (gnus-setup-message 'message | |
803 (message-mail))) | |
804 | |
805 (defun gnus-mail-parse-comma-list () | 1344 (defun gnus-mail-parse-comma-list () |
806 (let (accumulated | 1345 (let (accumulated |
807 beg) | 1346 beg) |
808 (skip-chars-forward " ") | 1347 (skip-chars-forward " ") |
809 (while (not (eobp)) | 1348 (while (not (eobp)) |
834 (when (and to-address | 1373 (when (and to-address |
835 (gnus-alive-p)) | 1374 (gnus-alive-p)) |
836 ;; This mail group doesn't have a `to-list', so we add one | 1375 ;; This mail group doesn't have a `to-list', so we add one |
837 ;; here. Magic! | 1376 ;; here. Magic! |
838 (when (gnus-y-or-n-p | 1377 (when (gnus-y-or-n-p |
839 (format "Do you want to add this as `to-list': %s " to-address)) | 1378 (format "Do you want to add this as `to-list': %s? " to-address)) |
840 (gnus-group-add-parameter group (cons 'to-list to-address)))))) | 1379 (gnus-group-add-parameter group (cons 'to-list to-address)))))) |
841 | 1380 |
842 (defun gnus-put-message () | 1381 (defun gnus-put-message () |
843 "Put the current message in some group and return to Gnus." | 1382 "Put the current message in some group and return to Gnus." |
844 (interactive) | 1383 (interactive) |
845 (let ((reply gnus-article-reply) | 1384 (let ((reply gnus-article-reply) |
846 (winconf gnus-prev-winconf) | 1385 (winconf gnus-prev-winconf) |
847 (group gnus-newsgroup-name)) | 1386 (group gnus-newsgroup-name)) |
848 | 1387 (unless (and group |
849 (or (and group (not (gnus-group-read-only-p group))) | 1388 (not (gnus-group-read-only-p group))) |
850 (setq group (read-string "Put in group: " nil | 1389 (setq group (read-string "Put in group: " nil (gnus-writable-groups)))) |
851 (gnus-writable-groups)))) | 1390 |
852 (when (gnus-gethash group gnus-newsrc-hashtb) | 1391 (when (gnus-gethash group gnus-newsrc-hashtb) |
853 (error "No such group: %s" group)) | 1392 (error "No such group: %s" group)) |
854 | |
855 (save-excursion | 1393 (save-excursion |
856 (save-restriction | 1394 (save-restriction |
857 (widen) | 1395 (widen) |
858 (message-narrow-to-headers) | 1396 (message-narrow-to-headers) |
859 (let (gnus-deletable-headers) | 1397 (let ((gnus-deletable-headers nil)) |
860 (if (message-news-p) | 1398 (message-generate-headers |
861 (message-generate-headers message-required-news-headers) | 1399 (if (message-news-p) |
862 (message-generate-headers message-required-mail-headers))) | 1400 message-required-news-headers |
1401 message-required-mail-headers))) | |
863 (goto-char (point-max)) | 1402 (goto-char (point-max)) |
864 (insert "Gcc: " group "\n") | 1403 (if (string-match " " group) |
1404 (insert "Gcc: \"" group "\"\n") | |
1405 (insert "Gcc: " group "\n")) | |
865 (widen))) | 1406 (widen))) |
866 | |
867 (gnus-inews-do-gcc) | 1407 (gnus-inews-do-gcc) |
868 | 1408 (when (and (get-buffer gnus-group-buffer) |
869 (when (get-buffer gnus-group-buffer) | 1409 (gnus-buffer-exists-p (car-safe reply)) |
870 (when (gnus-buffer-exists-p (car-safe reply)) | 1410 (cdr reply)) |
871 (set-buffer (car reply)) | 1411 (set-buffer (car reply)) |
872 (and (cdr reply) | 1412 (gnus-summary-mark-article-as-replied (cdr reply))) |
873 (gnus-summary-mark-article-as-replied | 1413 (when winconf |
874 (cdr reply)))) | 1414 (set-window-configuration winconf)))) |
875 (when winconf | |
876 (set-window-configuration winconf))))) | |
877 | 1415 |
878 (defun gnus-article-mail (yank) | 1416 (defun gnus-article-mail (yank) |
879 "Send a reply to the address near point. | 1417 "Send a reply to the address near point. |
880 If YANK is non-nil, include the original article." | 1418 If YANK is non-nil, include the original article." |
881 (interactive "P") | 1419 (interactive "P") |
882 (let ((address | 1420 (let ((address |
883 (buffer-substring | 1421 (buffer-substring |
884 (save-excursion (re-search-backward "[ \t\n]" nil t) (1+ (point))) | 1422 (save-excursion (re-search-backward "[ \t\n]" nil t) (1+ (point))) |
885 (save-excursion (re-search-forward "[ \t\n]" nil t) (1- (point)))))) | 1423 (save-excursion (re-search-forward "[ \t\n]" nil t) (1- (point)))))) |
886 (when address | 1424 (when address |
887 (message-reply address) | 1425 (gnus-msg-mail address) |
888 (when yank | 1426 (when yank |
889 (gnus-inews-yank-articles (list (cdr gnus-article-current))))))) | 1427 (gnus-inews-yank-articles (list (cdr gnus-article-current))))))) |
890 | 1428 |
891 (defvar nntp-server-type) | 1429 (defvar nntp-server-type) |
892 (defun gnus-bug () | 1430 (defun gnus-bug () |
917 (insert nntp-server-type)) | 1455 (insert nntp-server-type)) |
918 (insert "\n\n\n\n\n") | 1456 (insert "\n\n\n\n\n") |
919 (let (text) | 1457 (let (text) |
920 (save-excursion | 1458 (save-excursion |
921 (set-buffer (gnus-get-buffer-create " *gnus environment info*")) | 1459 (set-buffer (gnus-get-buffer-create " *gnus environment info*")) |
1460 (erase-buffer) | |
922 (gnus-debug) | 1461 (gnus-debug) |
923 (setq text (buffer-string))) | 1462 (setq text (buffer-string))) |
924 (insert "<#part type=application/x-emacs-lisp disposition=inline description=\"User settings\">\n" text "\n<#/part>")) | 1463 (insert "<#part type=application/emacs-lisp disposition=inline description=\"User settings\">\n" text "\n<#/part>")) |
925 (goto-char (point-min)) | 1464 (goto-char (point-min)) |
926 (search-forward "Subject: " nil t) | 1465 (search-forward "Subject: " nil t) |
927 (message ""))) | 1466 (message ""))) |
928 | 1467 |
929 (defun gnus-bug-kill-buffer () | 1468 (defun gnus-bug-kill-buffer () |
934 "Yank the current article into a composed message." | 1473 "Yank the current article into a composed message." |
935 (interactive | 1474 (interactive |
936 (list (completing-read "Buffer: " (mapcar 'list (message-buffers)) nil t) | 1475 (list (completing-read "Buffer: " (mapcar 'list (message-buffers)) nil t) |
937 current-prefix-arg)) | 1476 current-prefix-arg)) |
938 (gnus-summary-iterate n | 1477 (gnus-summary-iterate n |
939 (let ((gnus-display-mime-function nil) | 1478 (let ((gnus-inhibit-treatment t)) |
940 (gnus-inhibit-treatment t)) | |
941 (gnus-summary-select-article)) | 1479 (gnus-summary-select-article)) |
942 (save-excursion | 1480 (save-excursion |
943 (set-buffer buffer) | 1481 (set-buffer buffer) |
944 (message-yank-buffer gnus-article-buffer)))) | 1482 (message-yank-buffer gnus-article-buffer)))) |
945 | 1483 |
946 (defun gnus-debug () | 1484 (defun gnus-debug () |
947 "Attempts to go through the Gnus source file and report what variables have been changed. | 1485 "Attempts to go through the Gnus source file and report what variables have been changed. |
948 The source file has to be in the Emacs load path." | 1486 The source file has to be in the Emacs load path." |
949 (interactive) | 1487 (interactive) |
950 (let ((files '("gnus.el" "gnus-sum.el" "gnus-group.el" | 1488 (let ((files gnus-debug-files) |
951 "gnus-art.el" "gnus-start.el" "gnus-async.el" | |
952 "gnus-msg.el" "gnus-score.el" "gnus-win.el" "gnus-topic.el" | |
953 "nnmail.el" "message.el")) | |
954 (point (point)) | 1489 (point (point)) |
955 file expr olist sym) | 1490 file expr olist sym) |
956 (gnus-message 4 "Please wait while we snoop your variables...") | 1491 (gnus-message 4 "Please wait while we snoop your variables...") |
957 (sit-for 0) | 1492 (sit-for 0) |
958 ;; Go through all the files looking for non-default values for variables. | 1493 ;; Go through all the files looking for non-default values for variables. |
971 (while (setq expr (ignore-errors (read (current-buffer)))) | 1506 (while (setq expr (ignore-errors (read (current-buffer)))) |
972 (ignore-errors | 1507 (ignore-errors |
973 (and (or (eq (car expr) 'defvar) | 1508 (and (or (eq (car expr) 'defvar) |
974 (eq (car expr) 'defcustom)) | 1509 (eq (car expr) 'defcustom)) |
975 (stringp (nth 3 expr)) | 1510 (stringp (nth 3 expr)) |
1511 (not (memq (nth 1 expr) gnus-debug-exclude-variables)) | |
976 (or (not (boundp (nth 1 expr))) | 1512 (or (not (boundp (nth 1 expr))) |
977 (not (equal (eval (nth 2 expr)) | 1513 (not (equal (eval (nth 2 expr)) |
978 (symbol-value (nth 1 expr))))) | 1514 (symbol-value (nth 1 expr))))) |
979 (push (nth 1 expr) olist))))))) | 1515 (push (nth 1 expr) olist))))))) |
980 (kill-buffer (current-buffer))) | 1516 (kill-buffer (current-buffer))) |
981 (when (setq olist (nreverse olist)) | 1517 (when (setq olist (nreverse olist)) |
982 (insert "------------------ Environment follows ------------------\n\n")) | 1518 (insert "------------------ Environment follows ------------------\n\n")) |
983 (while olist | 1519 (while olist |
984 (if (boundp (car olist)) | 1520 (if (boundp (car olist)) |
985 (condition-case () | 1521 (ignore-errors |
986 (pp `(setq ,(car olist) | 1522 (gnus-pp |
987 ,(if (or (consp (setq sym (symbol-value (car olist)))) | 1523 `(setq ,(car olist) |
988 (and (symbolp sym) | 1524 ,(if (or (consp (setq sym (symbol-value (car olist)))) |
989 (not (or (eq sym nil) | 1525 (and (symbolp sym) |
990 (eq sym t))))) | 1526 (not (or (eq sym nil) |
991 (list 'quote (symbol-value (car olist))) | 1527 (eq sym t))))) |
992 (symbol-value (car olist)))) | 1528 (list 'quote (symbol-value (car olist))) |
993 (current-buffer)) | 1529 (symbol-value (car olist)))))) |
994 (error | |
995 (format "(setq %s 'whatever)\n" (car olist)))) | |
996 (insert ";; (makeunbound '" (symbol-name (car olist)) ")\n")) | 1530 (insert ";; (makeunbound '" (symbol-name (car olist)) ")\n")) |
997 (setq olist (cdr olist))) | 1531 (setq olist (cdr olist))) |
998 (insert "\n\n") | 1532 (insert "\n\n") |
999 ;; Remove any control chars - they seem to cause trouble for some | 1533 ;; Remove any control chars - they seem to cause trouble for some |
1000 ;; mailers. (Byte-compiled output from the stuff above.) | 1534 ;; mailers. (Byte-compiled output from the stuff above.) |
1001 (goto-char point) | 1535 (goto-char point) |
1002 (while (re-search-forward "[\000-\010\013-\037\200-\237]" nil t) | 1536 (while (re-search-forward (mm-string-as-multibyte |
1537 "[\000-\010\013-\037\200-\237]") nil t) | |
1003 (replace-match (format "\\%03o" (string-to-char (match-string 0))) | 1538 (replace-match (format "\\%03o" (string-to-char (match-string 0))) |
1004 t t)))) | 1539 t t)))) |
1005 | 1540 |
1006 ;;; Treatment of rejected articles. | 1541 ;;; Treatment of rejected articles. |
1007 ;;; Bounced mail. | 1542 ;;; Bounced mail. |
1008 | 1543 |
1009 (defun gnus-summary-resend-bounced-mail (&optional fetch) | 1544 (defun gnus-summary-resend-bounced-mail (&optional fetch) |
1010 "Re-mail the current message. | 1545 "Re-mail the current message. |
1011 This only makes sense if the current message is a bounce message than | 1546 This only makes sense if the current message is a bounce message that |
1012 contains some mail you have written which has been bounced back to | 1547 contains some mail you have written which has been bounced back to |
1013 you. | 1548 you. |
1014 If FETCH, try to fetch the article that this is a reply to, if indeed | 1549 If FETCH, try to fetch the article that this is a reply to, if indeed |
1015 this is a reply." | 1550 this is a reply." |
1016 (interactive "P") | 1551 (interactive "P") |
1026 (gnus-summary-show-all-headers))))) | 1561 (gnus-summary-show-all-headers))))) |
1027 | 1562 |
1028 ;;; Gcc handling. | 1563 ;;; Gcc handling. |
1029 | 1564 |
1030 (defun gnus-inews-group-method (group) | 1565 (defun gnus-inews-group-method (group) |
1031 (cond ((and (null (gnus-get-info group)) | 1566 (cond |
1032 (eq (car gnus-message-archive-method) | 1567 ;; If the group doesn't exist, we assume |
1033 (car | 1568 ;; it's an archive group... |
1034 (gnus-server-to-method | 1569 ((and (null (gnus-get-info group)) |
1035 (gnus-group-method group))))) | 1570 (eq (car (gnus-server-to-method gnus-message-archive-method)) |
1036 ;; If the group doesn't exist, we assume | 1571 (car (gnus-server-to-method (gnus-group-method group))))) |
1037 ;; it's an archive group... | 1572 gnus-message-archive-method) |
1038 gnus-message-archive-method) | 1573 ;; Use the method. |
1039 ;; Use the method. | 1574 ((gnus-info-method (gnus-get-info group)) |
1040 ((gnus-info-method (gnus-get-info group)) | 1575 (gnus-info-method (gnus-get-info group))) |
1041 (gnus-info-method (gnus-get-info group))) | 1576 ;; Find the method. |
1042 ;; Find the method. | 1577 (t (gnus-server-to-method (gnus-group-method group))))) |
1043 (t (gnus-group-method group)))) | |
1044 | 1578 |
1045 ;; Do Gcc handling, which copied the message over to some group. | 1579 ;; Do Gcc handling, which copied the message over to some group. |
1046 (defun gnus-inews-do-gcc (&optional gcc) | 1580 (defun gnus-inews-do-gcc (&optional gcc) |
1047 (interactive) | 1581 (interactive) |
1048 (when (gnus-alive-p) | 1582 (save-excursion |
1049 (save-excursion | 1583 (save-restriction |
1050 (save-restriction | 1584 (message-narrow-to-headers) |
1051 (message-narrow-to-headers) | 1585 (let ((gcc (or gcc (mail-fetch-field "gcc" nil t))) |
1052 (let ((gcc (or gcc (mail-fetch-field "gcc" nil t))) | 1586 (cur (current-buffer)) |
1053 (cur (current-buffer)) | 1587 groups group method group-art |
1054 groups group method) | 1588 mml-externalize-attachments) |
1055 (when gcc | 1589 (when gcc |
1056 (message-remove-header "gcc") | 1590 (message-remove-header "gcc") |
1057 (widen) | 1591 (widen) |
1058 (setq groups (message-unquote-tokens | 1592 (setq groups (message-unquote-tokens |
1059 (message-tokenize-header gcc " ,"))) | 1593 (message-tokenize-header gcc " ,"))) |
1060 ;; Copy the article over to some group(s). | 1594 ;; Copy the article over to some group(s). |
1061 (while (setq group (pop groups)) | 1595 (while (setq group (pop groups)) |
1062 (gnus-check-server | 1596 (unless (gnus-check-server |
1063 (setq method (gnus-inews-group-method group))) | 1597 (setq method (gnus-inews-group-method group))) |
1064 (unless (gnus-request-group group t method) | 1598 (error "Can't open server %s" (if (stringp method) method |
1065 (gnus-request-create-group group method)) | 1599 (car method)))) |
1066 (save-excursion | 1600 (unless (gnus-request-group group nil method) |
1067 (nnheader-set-temp-buffer " *acc*") | 1601 (gnus-request-create-group group method)) |
1068 (insert-buffer-substring cur) | 1602 (setq mml-externalize-attachments |
1069 (message-encode-message-body) | 1603 (if (stringp gnus-gcc-externalize-attachments) |
1070 (save-restriction | 1604 (string-match gnus-gcc-externalize-attachments group) |
1071 (message-narrow-to-headers) | 1605 gnus-gcc-externalize-attachments)) |
1072 (let ((mail-parse-charset message-default-charset) | 1606 (save-excursion |
1073 (rfc2047-header-encoding-alist | 1607 (nnheader-set-temp-buffer " *acc*") |
1074 (cons '("Newsgroups" . default) | 1608 (insert-buffer-substring cur) |
1075 rfc2047-header-encoding-alist))) | 1609 (message-encode-message-body) |
1076 (mail-encode-encoded-word-buffer))) | 1610 (save-restriction |
1077 (goto-char (point-min)) | 1611 (message-narrow-to-headers) |
1078 (when (re-search-forward | 1612 (let* ((mail-parse-charset message-default-charset) |
1079 (concat "^" (regexp-quote mail-header-separator) "$") | 1613 (newsgroups-field (save-restriction |
1080 nil t) | 1614 (message-narrow-to-headers-or-head) |
1081 (replace-match "" t t )) | 1615 (message-fetch-field "Newsgroups"))) |
1082 (unless (gnus-request-accept-article group method t t) | 1616 (followup-field (save-restriction |
1083 (gnus-message 1 "Couldn't store article in group %s: %s" | 1617 (message-narrow-to-headers-or-head) |
1084 group (gnus-status-message method)) | 1618 (message-fetch-field "Followup-To"))) |
1085 (sit-for 2)) | 1619 ;; BUG: We really need to get the charset for |
1086 (kill-buffer (current-buffer)))))))))) | 1620 ;; each name in the Newsgroups and Followup-To |
1621 ;; lines to allow crossposting between group | |
1622 ;; namess with incompatible character sets. | |
1623 ;; -- Per Abrahamsen <abraham@dina.kvl.dk> 2001-10-08. | |
1624 (group-field-charset | |
1625 (gnus-group-name-charset | |
1626 method (or newsgroups-field ""))) | |
1627 (followup-field-charset | |
1628 (gnus-group-name-charset | |
1629 method (or followup-field ""))) | |
1630 (rfc2047-header-encoding-alist | |
1631 (append | |
1632 (when group-field-charset | |
1633 (list (cons "Newsgroups" group-field-charset))) | |
1634 (when followup-field-charset | |
1635 (list (cons "Followup-To" followup-field-charset))) | |
1636 rfc2047-header-encoding-alist))) | |
1637 (mail-encode-encoded-word-buffer))) | |
1638 (goto-char (point-min)) | |
1639 (when (re-search-forward | |
1640 (concat "^" (regexp-quote mail-header-separator) "$") | |
1641 nil t) | |
1642 (replace-match "" t t )) | |
1643 (unless (setq group-art | |
1644 (gnus-request-accept-article group method t t)) | |
1645 (gnus-message 1 "Couldn't store article in group %s: %s" | |
1646 group (gnus-status-message method)) | |
1647 (sit-for 2)) | |
1648 (when (and group-art | |
1649 ;; FIXME: Should gcc-mark-as-read work when | |
1650 ;; Gnus is not running? | |
1651 (gnus-alive-p) | |
1652 (or gnus-gcc-mark-as-read | |
1653 (and | |
1654 (boundp 'gnus-inews-mark-gcc-as-read) | |
1655 (symbol-value 'gnus-inews-mark-gcc-as-read)))) | |
1656 (gnus-group-mark-article-read group (cdr group-art))) | |
1657 (kill-buffer (current-buffer))))))))) | |
1087 | 1658 |
1088 (defun gnus-inews-insert-gcc () | 1659 (defun gnus-inews-insert-gcc () |
1089 "Insert Gcc headers based on `gnus-outgoing-message-group'." | 1660 "Insert Gcc headers based on `gnus-outgoing-message-group'." |
1090 (save-excursion | 1661 (save-excursion |
1091 (save-restriction | 1662 (save-restriction |
1092 (message-narrow-to-headers) | 1663 (message-narrow-to-headers) |
1093 (let* ((group gnus-outgoing-message-group) | 1664 (let* ((group gnus-outgoing-message-group) |
1094 (gcc (cond | 1665 (gcc (cond |
1095 ((gnus-functionp group) | 1666 ((functionp group) |
1096 (funcall group)) | 1667 (funcall group)) |
1097 ((or (stringp group) (list group)) | 1668 ((or (stringp group) (listp group)) |
1098 group)))) | 1669 group)))) |
1099 (when gcc | 1670 (when gcc |
1100 (insert "Gcc: " | 1671 (insert "Gcc: " |
1101 (if (stringp gcc) gcc | 1672 (if (stringp gcc) |
1102 (mapconcat 'identity gcc " ")) | 1673 (if (string-match " " gcc) |
1674 (concat "\"" gcc "\"") | |
1675 gcc) | |
1676 (mapconcat (lambda (group) | |
1677 (if (string-match " " group) | |
1678 (concat "\"" group "\"") | |
1679 group)) | |
1680 gcc " ")) | |
1103 "\n")))))) | 1681 "\n")))))) |
1104 | 1682 |
1105 (defun gnus-inews-insert-archive-gcc (&optional group) | 1683 (defun gnus-inews-insert-archive-gcc (&optional group) |
1106 "Insert the Gcc to say where the article is to be archived." | 1684 "Insert the Gcc to say where the article is to be archived." |
1107 (let* ((var gnus-message-archive-group) | 1685 (let* ((var gnus-message-archive-group) |
1124 ;; We don't want this. | 1702 ;; We don't want this. |
1125 nil) | 1703 nil) |
1126 ((and (listp var) (stringp (car var))) | 1704 ((and (listp var) (stringp (car var))) |
1127 ;; A list of groups. | 1705 ;; A list of groups. |
1128 var) | 1706 var) |
1129 ((gnus-functionp var) | 1707 ((functionp var) |
1130 ;; A function. | 1708 ;; A function. |
1131 (funcall var group)) | 1709 (funcall var group)) |
1132 (t | 1710 (t |
1133 ;; An alist of regexps/functions/forms. | 1711 ;; An alist of regexps/functions/forms. |
1134 (while (and var | 1712 (while (and var |
1137 (cond | 1715 (cond |
1138 ((stringp (caar var)) | 1716 ((stringp (caar var)) |
1139 ;; Regexp. | 1717 ;; Regexp. |
1140 (when (string-match (caar var) group) | 1718 (when (string-match (caar var) group) |
1141 (cdar var))) | 1719 (cdar var))) |
1142 ((gnus-functionp (car var)) | 1720 ((functionp (car var)) |
1143 ;; Function. | 1721 ;; Function. |
1144 (funcall (car var) group)) | 1722 (funcall (car var) group)) |
1145 (t | 1723 (t |
1146 (eval (car var))))))) | 1724 (eval (car var))))))) |
1147 (setq var (cdr var))) | 1725 (setq var (cdr var))) |
1158 (if gcc-self-val | 1736 (if gcc-self-val |
1159 ;; Use the `gcc-self' param value instead. | 1737 ;; Use the `gcc-self' param value instead. |
1160 (progn | 1738 (progn |
1161 (insert | 1739 (insert |
1162 (if (stringp gcc-self-val) | 1740 (if (stringp gcc-self-val) |
1163 gcc-self-val | 1741 (if (string-match " " gcc-self-val) |
1164 group)) | 1742 (concat "\"" gcc-self-val "\"") |
1743 gcc-self-val) | |
1744 ;; In nndoc groups, we use the parent group name | |
1745 ;; instead of the current group. | |
1746 (let ((group (or (gnus-group-find-parameter | |
1747 gnus-newsgroup-name 'parent-group) | |
1748 group))) | |
1749 (if (string-match " " group) | |
1750 (concat "\"" group "\"") | |
1751 group)))) | |
1165 (if (not (eq gcc-self-val 'none)) | 1752 (if (not (eq gcc-self-val 'none)) |
1166 (insert "\n") | 1753 (insert "\n") |
1167 (progn | 1754 (gnus-delete-line))) |
1168 (beginning-of-line) | |
1169 (kill-line)))) | |
1170 ;; Use the list of groups. | 1755 ;; Use the list of groups. |
1171 (while (setq name (pop groups)) | 1756 (while (setq name (pop groups)) |
1172 (insert (if (string-match ":" name) | 1757 (let ((str (if (string-match ":" name) |
1173 name | 1758 name |
1174 (gnus-group-prefixed-name | 1759 (gnus-group-prefixed-name |
1175 name gnus-message-archive-method))) | 1760 name gnus-message-archive-method)))) |
1761 (insert (if (string-match " " str) | |
1762 (concat "\"" str "\"") | |
1763 str))) | |
1176 (when groups | 1764 (when groups |
1177 (insert " "))) | 1765 (insert " "))) |
1178 (insert "\n"))))))) | 1766 (insert "\n"))))))) |
1179 | 1767 |
1768 (defun gnus-mailing-list-followup-to () | |
1769 "Look at the headers in the current buffer and return a Mail-Followup-To address." | |
1770 (let ((x-been-there (gnus-fetch-original-field "x-beenthere")) | |
1771 (list-post (gnus-fetch-original-field "list-post"))) | |
1772 (when (and list-post | |
1773 (string-match "mailto:\\([^>]+\\)" list-post)) | |
1774 (setq list-post (match-string 1 list-post))) | |
1775 (or list-post | |
1776 x-been-there))) | |
1777 | |
1180 ;;; Posting styles. | 1778 ;;; Posting styles. |
1181 | 1779 |
1182 (defun gnus-configure-posting-styles () | 1780 (defun gnus-configure-posting-styles (&optional group-name) |
1183 "Configure posting styles according to `gnus-posting-styles'." | 1781 "Configure posting styles according to `gnus-posting-styles'." |
1184 (unless gnus-inhibit-posting-styles | 1782 (unless gnus-inhibit-posting-styles |
1185 (let ((group (or gnus-newsgroup-name "")) | 1783 (let ((group (or group-name gnus-newsgroup-name "")) |
1186 (styles gnus-posting-styles) | 1784 (styles gnus-posting-styles) |
1187 style match variable attribute value v results | 1785 style match attribute value v results |
1188 filep name address element) | 1786 filep name address element) |
1189 ;; If the group has a posting-style parameter, add it at the end with a | 1787 ;; If the group has a posting-style parameter, add it at the end with a |
1190 ;; regexp matching everything, to be sure it takes precedence over all | 1788 ;; regexp matching everything, to be sure it takes precedence over all |
1191 ;; the others. | 1789 ;; the others. |
1192 (when gnus-newsgroup-name | 1790 (when gnus-newsgroup-name |
1200 (when (cond | 1798 (when (cond |
1201 ((stringp match) | 1799 ((stringp match) |
1202 ;; Regexp string match on the group name. | 1800 ;; Regexp string match on the group name. |
1203 (string-match match group)) | 1801 (string-match match group)) |
1204 ((eq match 'header) | 1802 ((eq match 'header) |
1205 (let ((header (message-fetch-field (pop style)))) | 1803 ;; Obsolete format of header match. |
1206 (and header | 1804 (and (gnus-buffer-live-p gnus-article-copy) |
1207 (string-match (pop style) header)))) | 1805 (with-current-buffer gnus-article-copy |
1806 (save-restriction | |
1807 (nnheader-narrow-to-headers) | |
1808 (let ((header (message-fetch-field (pop style)))) | |
1809 (and header | |
1810 (string-match (pop style) header))))))) | |
1208 ((or (symbolp match) | 1811 ((or (symbolp match) |
1209 (gnus-functionp match)) | 1812 (functionp match)) |
1210 (cond | 1813 (cond |
1211 ((gnus-functionp match) | 1814 ((functionp match) |
1212 ;; Function to be called. | 1815 ;; Function to be called. |
1213 (funcall match)) | 1816 (funcall match)) |
1214 ((boundp match) | 1817 ((boundp match) |
1215 ;; Variable to be checked. | 1818 ;; Variable to be checked. |
1216 (symbol-value match)))) | 1819 (symbol-value match)))) |
1217 ((listp match) | 1820 ((listp match) |
1218 ;; This is a form to be evaled. | 1821 (cond |
1219 (eval match))) | 1822 ((eq (car match) 'header) |
1823 ;; New format of header match. | |
1824 (and (gnus-buffer-live-p gnus-article-copy) | |
1825 (with-current-buffer gnus-article-copy | |
1826 (save-restriction | |
1827 (nnheader-narrow-to-headers) | |
1828 (let ((header (message-fetch-field (nth 1 match)))) | |
1829 (and header | |
1830 (string-match (nth 2 match) header))))))) | |
1831 (t | |
1832 ;; This is a form to be evaled. | |
1833 (eval match))))) | |
1220 ;; We have a match, so we set the variables. | 1834 ;; We have a match, so we set the variables. |
1221 (dolist (attribute style) | 1835 (dolist (attribute style) |
1222 (setq element (pop attribute) | 1836 (setq element (pop attribute) |
1223 variable nil | |
1224 filep nil) | 1837 filep nil) |
1225 (setq value | 1838 (setq value |
1226 (cond | 1839 (cond |
1227 ((eq (car attribute) :file) | 1840 ((eq (car attribute) :file) |
1228 (setq filep t) | 1841 (setq filep t) |
1235 (setq v | 1848 (setq v |
1236 (cond | 1849 (cond |
1237 ((stringp value) | 1850 ((stringp value) |
1238 value) | 1851 value) |
1239 ((or (symbolp value) | 1852 ((or (symbolp value) |
1240 (gnus-functionp value)) | 1853 (functionp value)) |
1241 (cond ((gnus-functionp value) | 1854 (cond ((functionp value) |
1242 (funcall value)) | 1855 (funcall value)) |
1243 ((boundp value) | 1856 ((boundp value) |
1244 (symbol-value value)))) | 1857 (symbol-value value)))) |
1245 ((listp value) | 1858 ((listp value) |
1246 (eval value)))) | 1859 (eval value)))) |
1247 ;; Translate obsolescent value. | 1860 ;; Translate obsolescent value. |
1248 (when (eq element 'signature-file) | 1861 (cond |
1862 ((eq element 'signature-file) | |
1249 (setq element 'signature | 1863 (setq element 'signature |
1250 filep t)) | 1864 filep t)) |
1865 ((eq element 'x-face-file) | |
1866 (setq element 'x-face | |
1867 filep t))) | |
1251 ;; Get the contents of file elems. | 1868 ;; Get the contents of file elems. |
1252 (when (and filep v) | 1869 (when (and filep v) |
1253 (setq v (with-temp-buffer | 1870 (setq v (with-temp-buffer |
1254 (insert-file-contents v) | 1871 (insert-file-contents v) |
1255 (buffer-string)))) | 1872 (buffer-substring |
1873 (point-min) | |
1874 (progn | |
1875 (goto-char (point-max)) | |
1876 (if (zerop (skip-chars-backward "\n")) | |
1877 (point) | |
1878 (1+ (point)))))))) | |
1256 (setq results (delq (assoc element results) results)) | 1879 (setq results (delq (assoc element results) results)) |
1257 (push (cons element v) results)))) | 1880 (push (cons element v) results)))) |
1258 ;; Now we have all the styles, so we insert them. | 1881 ;; Now we have all the styles, so we insert them. |
1259 (setq name (assq 'name results) | 1882 (setq name (assq 'name results) |
1260 address (assq 'address results)) | 1883 address (assq 'address results)) |
1261 (setq results (delq name (delq address results))) | 1884 (setq results (delq name (delq address results))) |
1262 (make-local-variable 'message-setup-hook) | 1885 (gnus-make-local-hook 'message-setup-hook) |
1886 (setq results (sort results (lambda (x y) | |
1887 (string-lessp (car x) (car y))))) | |
1263 (dolist (result results) | 1888 (dolist (result results) |
1264 (add-hook 'message-setup-hook | 1889 (add-hook 'message-setup-hook |
1265 (cond | 1890 (cond |
1266 ((eq 'eval (car result)) | 1891 ((eq 'eval (car result)) |
1267 'ignore) | 1892 'ignore) |
1289 (save-excursion | 1914 (save-excursion |
1290 (message-remove-header ,header) | 1915 (message-remove-header ,header) |
1291 (let ((value ,(cdr result))) | 1916 (let ((value ,(cdr result))) |
1292 (when value | 1917 (when value |
1293 (message-goto-eoh) | 1918 (message-goto-eoh) |
1294 (insert ,header ": " value "\n")))))))))) | 1919 (insert ,header ": " value) |
1920 (unless (bolp) | |
1921 (insert "\n"))))))))) | |
1922 nil 'local)) | |
1295 (when (or name address) | 1923 (when (or name address) |
1296 (add-hook 'message-setup-hook | 1924 (add-hook 'message-setup-hook |
1297 `(lambda () | 1925 `(lambda () |
1298 (set (make-local-variable 'user-mail-address) | 1926 (set (make-local-variable 'user-mail-address) |
1299 ,(or (cdr address) user-mail-address)) | 1927 ,(or (cdr address) user-mail-address)) |
1300 (let ((user-full-name ,(or (cdr name) (user-full-name))) | 1928 (let ((user-full-name ,(or (cdr name) (user-full-name))) |
1301 (user-mail-address | 1929 (user-mail-address |
1302 ,(or (cdr address) user-mail-address))) | 1930 ,(or (cdr address) user-mail-address))) |
1303 (save-excursion | 1931 (save-excursion |
1304 (message-remove-header "From") | 1932 (message-remove-header "From") |
1305 (message-goto-eoh) | 1933 (message-goto-eoh) |
1306 (insert "From: " (message-make-from) "\n"))))))))) | 1934 (insert "From: " (message-make-from) "\n")))) |
1935 nil 'local))))) | |
1307 | 1936 |
1308 ;;; Allow redefinition of functions. | 1937 ;;; Allow redefinition of functions. |
1309 | 1938 |
1310 (gnus-ems-redefine) | 1939 (gnus-ems-redefine) |
1311 | 1940 |
1312 (provide 'gnus-msg) | 1941 (provide 'gnus-msg) |
1313 | 1942 |
1943 ;;; arch-tag: 9f22b2f5-1c0a-49de-916e-4c88e984852b | |
1314 ;;; gnus-msg.el ends here | 1944 ;;; gnus-msg.el ends here |