message.el 295 KB
Newer Older
1
;;; message.el --- composing mail and news messages
2

3
;; Copyright (C) 1996-2014 Free Software Foundation, Inc.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
4

5
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
6 7 8 9
;; Keywords: mail, news

;; This file is part of GNU Emacs.

10
;; GNU Emacs is free software: you can redistribute it and/or modify
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
11
;; it under the terms of the GNU General Public License as published by
12 13
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
14 15 16

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
18 19 20
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
21
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
22 23 24 25 26 27 28 29 30

;;; Commentary:

;; This mode provides mail-sending facilities from within Emacs.  It
;; consists mainly of large chunks of code from the sendmail.el,
;; gnus-msg.el and rnewspost.el files.

;;; Code:

31
(eval-when-compile
Dan Nicolaescu's avatar
Dan Nicolaescu committed
32
  (require 'cl))
33

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
34
(require 'mailheader)
35
(require 'gmm-utils)
36 37 38 39
(require 'mail-utils)
;; Only for the trivial macros mail-header-from, mail-header-date
;; mail-header-references, mail-header-subject, mail-header-id
(eval-when-compile (require 'nnheader))
40 41 42
;; This is apparently necessary even though things are autoloaded.
;; Because we dynamically bind mail-abbrev-mode-regexp, we'd better
;; require mailabbrev here.
43
(if (featurep 'xemacs)
44 45
    (require 'mail-abbrevs)
  (require 'mailabbrev))
46 47
(require 'mail-parse)
(require 'mml)
48
(require 'rfc822)
49
(require 'format-spec)
Gnus developers's avatar
Gnus developers committed
50
(require 'dired)
51

52 53
(autoload 'mailclient-send-it "mailclient") ;; Emacs 22 or contrib/

Dan Nicolaescu's avatar
Dan Nicolaescu committed
54 55 56
(defvar gnus-message-group-art)
(defvar gnus-list-identifiers) ; gnus-sum is required where necessary
(defvar rmail-enable-mime-composing)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
57 58 59 60 61 62 63 64 65 66 67 68

(defgroup message '((user-mail-address custom-variable)
		    (user-full-name custom-variable))
  "Mail and news message composing."
  :link '(custom-manual "(message)Top")
  :group 'mail
  :group 'news)

(put 'user-mail-address 'custom-type 'string)
(put 'user-full-name 'custom-type 'string)

(defgroup message-various nil
69
  "Various Message Variables."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
70 71 72 73
  :link '(custom-manual "(message)Various Message Variables")
  :group 'message)

(defgroup message-buffers nil
74
  "Message Buffers."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
75 76 77 78
  :link '(custom-manual "(message)Message Buffers")
  :group 'message)

(defgroup message-sending nil
79
  "Message Sending."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
80 81 82 83
  :link '(custom-manual "(message)Sending Variables")
  :group 'message)

(defgroup message-interface nil
84
  "Message Interface."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
85 86 87 88
  :link '(custom-manual "(message)Interface")
  :group 'message)

(defgroup message-forwarding nil
89
  "Message Forwarding."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
90 91 92 93
  :link '(custom-manual "(message)Forwarding")
  :group 'message-interface)

(defgroup message-insertion nil
94
  "Message Insertion."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
95 96 97 98
  :link '(custom-manual "(message)Insertion")
  :group 'message)

(defgroup message-headers nil
99
  "Message Headers."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
100 101 102 103
  :link '(custom-manual "(message)Message Headers")
  :group 'message)

(defgroup message-news nil
104
  "Composing News Messages."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
105 106 107
  :group 'message)

(defgroup message-mail nil
108
  "Composing Mail Messages."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
  :group 'message)

(defgroup message-faces nil
  "Faces used for message composing."
  :group 'message
  :group 'faces)

(defcustom message-directory "~/Mail/"
  "*Directory from which all other mail file variables are derived."
  :group 'message-various
  :type 'directory)

(defcustom message-max-buffers 10
  "*How many buffers to keep before starting to kill them off."
  :group 'message-buffers
  :type 'integer)

(defcustom message-send-rename-function nil
  "Function called to rename the buffer after sending it."
  :group 'message-buffers
Dave Love's avatar
Dave Love committed
129
  :type '(choice function (const nil)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
130 131 132 133 134 135 136 137 138 139

(defcustom message-fcc-handler-function 'message-output
  "*A function called to save outgoing articles.
This function will be called with the name of the file to store the
article in.  The default function is `message-output' which saves in Unix
mailbox format."
  :type '(radio (function-item message-output)
		(function :tag "Other"))
  :group 'message-sending)

140 141
(defcustom message-fcc-externalize-attachments nil
  "If non-nil, attachments are included as external parts in Fcc copies."
142
  :version "22.1"
143 144 145
  :type 'boolean
  :group 'message-sending)

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
146
(defcustom message-courtesy-message
147
  "The following message is a courtesy copy of an article\nthat has been posted to %s as well.\n\n"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
148 149 150 151 152
  "*This is inserted at the start of a mailed copy of a posted message.
If the string contains the format spec \"%s\", the Newsgroups
the article has been posted to will be inserted there.
If this variable is nil, no such courtesy message will be added."
  :group 'message-sending
153
  :type '(radio string (const nil)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
154

155 156
(defcustom message-ignored-bounced-headers
  "^\\(Received\\|Return-Path\\|Delivered-To\\):"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
157 158 159 160
  "*Regexp that matches headers to be removed in resent bounced mail."
  :group 'message-interface
  :type 'regexp)

161
(defcustom message-from-style mail-from-style
162
  "Specifies how \"From\" headers look.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
163

Dave Love's avatar
Dave Love committed
164
If nil, they contain just the return address like:
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
165 166 167 168 169 170 171 172
	king@grassland.com
If `parens', they look like:
	king@grassland.com (Elvis Parsley)
If `angles', they look like:
	Elvis Parsley <king@grassland.com>

Otherwise, most addresses look like `angles', but they look like
`parens' if `angles' would need quoting and `parens' would not."
173
  :version "23.2"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
174 175 176 177 178 179
  :type '(choice (const :tag "simple" nil)
		 (const parens)
		 (const angles)
		 (const default))
  :group 'message-headers)

180 181
(defcustom message-insert-canlock t
  "Whether to insert a Cancel-Lock header in news postings."
182
  :version "22.1"
183 184 185 186 187
  :group 'message-headers
  :type 'boolean)

(defcustom message-syntax-checks
  (if message-insert-canlock '((sender . disabled)) nil)
188
  ;; Guess this one shouldn't be easy to customize...
189
  "*Controls what syntax checks should not be performed on outgoing posts.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
190 191 192 193 194
To disable checking of long signatures, for instance, add
 `(signature . disabled)' to this list.

Don't touch this variable unless you really know what you're doing.

Miles Bader's avatar
Miles Bader committed
195 196
Checks include `approved', `bogus-recipient', `continuation-headers',
`control-chars', `empty', `existing-newsgroups', `from', `illegible-text',
Miles Bader's avatar
Miles Bader committed
197 198
`invisible-text', `long-header-lines', `long-lines', `message-id',
`multiple-headers', `new-text', `newsgroups', `quoting-style',
Miles Bader's avatar
Miles Bader committed
199
`repeated-newsgroups', `reply-to', `sender', `sendsys', `shoot',
Miles Bader's avatar
Miles Bader committed
200 201
`shorten-followup-to', `signature', `size', `subject', `subject-cmsg'
and `valid-newsgroups'."
202
  :group 'message-news
Dave Love's avatar
Dave Love committed
203
  :type '(repeat sexp))			; Fixme: improve this
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
204

205 206 207 208 209
(defcustom message-required-headers '((optional . References)
				      From)
  "*Headers to be generated or prompted for when sending a message.
Also see `message-required-news-headers' and
`message-required-mail-headers'."
210
  :version "22.1"
211 212 213 214 215
  :group 'message-news
  :group 'message-headers
  :link '(custom-manual "(message)Message Headers")
  :type '(repeat sexp))

216
(defcustom message-draft-headers '(References From Date)
217
  "*Headers to be generated when saving a draft message."
218
  :version "22.1"
219 220 221 222 223
  :group 'message-news
  :group 'message-headers
  :link '(custom-manual "(message)Message Headers")
  :type '(repeat sexp))

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
224 225
(defcustom message-required-news-headers
  '(From Newsgroups Subject Date Message-ID
226
	 (optional . Organization)
227
	 (optional . User-Agent))
228
  "*Headers to be generated or prompted for when posting an article.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
229 230
RFC977 and RFC1036 require From, Date, Newsgroups, Subject,
Message-ID.  Organization, Lines, In-Reply-To, Expires, and
Miles Bader's avatar
Miles Bader committed
231
User-Agent are optional.  If you don't want message to insert some
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
232 233 234
header, remove it from this list."
  :group 'message-news
  :group 'message-headers
235
  :link '(custom-manual "(message)Message Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
236 237 238
  :type '(repeat sexp))

(defcustom message-required-mail-headers
239
  '(From Subject Date (optional . In-Reply-To) Message-ID
240
	 (optional . User-Agent))
241
  "*Headers to be generated or prompted for when mailing a message.
242 243
It is recommended that From, Date, To, Subject and Message-ID be
included.  Organization and User-Agent are optional."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
244 245
  :group 'message-mail
  :group 'message-headers
246
  :link '(custom-manual "(message)Message Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
247 248
  :type '(repeat sexp))

249 250 251
(defcustom message-prune-recipient-rules nil
  "Rules for how to prune the list of recipients when doing wide replies.
This is a list of regexps and regexp matches."
252
  :version "24.1"
253 254 255 256 257
  :group 'message-mail
  :group 'message-headers
  :link '(custom-manual "(message)Wide Reply")
  :type '(repeat regexp))

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
258 259 260
(defcustom message-deletable-headers '(Message-ID Date Lines)
  "Headers to be deleted if they already exist and were generated by message previously."
  :group 'message-headers
261
  :link '(custom-manual "(message)Message Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
262 263 264
  :type 'sexp)

(defcustom message-ignored-news-headers
265
  "^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|^X-Draft-From:\\|^X-Gnus-Agent-Meta-Information:\\|^X-Message-SMTP-Method:\\|^X-Gnus-Delayed:"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
266 267 268
  "*Regexp of headers to be removed unconditionally before posting."
  :group 'message-news
  :group 'message-headers
269
  :link '(custom-manual "(message)Message Headers")
270 271 272 273 274 275
  :type '(repeat :value-to-internal (lambda (widget value)
				      (custom-split-regexp-maybe value))
		 :match (lambda (widget value)
			  (or (stringp value)
			      (widget-editable-list-match widget value)))
		 regexp))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
276

277
(defcustom message-ignored-mail-headers
278
  "^\\([GF]cc\\|Resent-Fcc\\|Xref\\|X-Draft-From\\|X-Gnus-Agent-Meta-Information\\):"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
279 280 281
  "*Regexp of headers to be removed unconditionally before mailing."
  :group 'message-mail
  :group 'message-headers
282
  :link '(custom-manual "(message)Mail Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
283 284
  :type 'regexp)

285
(defcustom message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-ID:\\|^X-Complaints-To:\\|Return-Path:\\|^Supersedes:\\|^NNTP-Posting-Date:\\|^X-Trace:\\|^X-Complaints-To:\\|^Cancel-Lock:\\|^Cancel-Key:\\|^X-Hashcash:\\|^X-Payment:\\|^Approved:\\|^Injection-Date:\\|^Injection-Info:"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
286 287 288 289
  "*Header lines matching this regexp will be deleted before posting.
It's best to delete old Path and Date headers before posting to avoid
any confusion."
  :group 'message-interface
290
  :link '(custom-manual "(message)Superseding")
291 292 293 294 295 296
  :type '(repeat :value-to-internal (lambda (widget value)
				      (custom-split-regexp-maybe value))
		 :match (lambda (widget value)
			  (or (stringp value)
			      (widget-editable-list-match widget value)))
		 regexp))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
297

298 299
(defcustom message-subject-re-regexp
  "^[ \t]*\\([Rr][Ee]\\(\\[[0-9]*\\]\\)*:[ \t]*\\)*[ \t]*"
300 301
  "*Regexp matching \"Re: \" in the subject line."
  :group 'message-various
302
  :link '(custom-manual "(message)Message Headers")
303 304
  :type 'regexp)

305 306
;;; Start of variables adopted from `message-utils.el'.

307
(defcustom message-subject-trailing-was-query t
308 309 310 311 312 313 314
  "*What to do with trailing \"(was: <old subject>)\" in subject lines.
If nil, leave the subject unchanged.  If it is the symbol `ask', query
the user what do do.  In this case, the subject is matched against
`message-subject-trailing-was-ask-regexp'.  If
`message-subject-trailing-was-query' is t, always strip the trailing
old subject.  In this case, `message-subject-trailing-was-regexp' is
used."
315
  :version "24.1"
316 317
  :type '(choice (const :tag "never" nil)
		 (const :tag "always strip" t)
318
		 (const ask))
319 320 321 322
  :link '(custom-manual "(message)Message Headers")
  :group 'message-various)

(defcustom message-subject-trailing-was-ask-regexp
323
  "[ \t]*\\([[(]+[Ww][Aa][Ss]:?[ \t]*.*[])]+\\)"
324 325 326 327 328 329 330 331
  "*Regexp matching \"(was: <old subject>)\" in the subject line.

The function `message-strip-subject-trailing-was' uses this regexp if
`message-subject-trailing-was-query' is set to the symbol `ask'.  If
the variable is t instead of `ask', use
`message-subject-trailing-was-regexp' instead.

It is okay to create some false positives here, as the user is asked."
332
  :version "22.1"
333 334 335 336 337
  :group 'message-various
  :link '(custom-manual "(message)Message Headers")
  :type 'regexp)

(defcustom message-subject-trailing-was-regexp
338
  "[ \t]*\\((*[Ww][Aa][Ss]:[ \t]*.*)\\)"
339 340 341 342 343 344
  "*Regexp matching \"(was: <old subject>)\" in the subject line.

If `message-subject-trailing-was-query' is set to t, the subject is
matched against `message-subject-trailing-was-regexp' in
`message-strip-subject-trailing-was'.  You should use a regexp creating very
few false positives here."
345
  :version "22.1"
346 347 348 349 350 351 352
  :group 'message-various
  :link '(custom-manual "(message)Message Headers")
  :type 'regexp)

;;; marking inserted text

(defcustom message-mark-insert-begin
353
  "--8<---------------cut here---------------start------------->8---\n"
354
  "How to mark the beginning of some inserted text."
355
  :version "22.1"
356 357 358 359 360
  :type 'string
  :link '(custom-manual "(message)Insertion Variables")
  :group 'message-various)

(defcustom message-mark-insert-end
361
  "--8<---------------cut here---------------end--------------->8---\n"
362
  "How to mark the end of some inserted text."
363
  :version "22.1"
364 365 366 367
  :type 'string
  :link '(custom-manual "(message)Insertion Variables")
  :group 'message-various)

368
(defcustom message-archive-header "X-No-Archive: Yes\n"
369 370
  "Header to insert when you don't want your article to be archived.
Archives \(such as groups.google.com\) respect this header."
371
  :version "22.1"
372 373 374 375 376 377 378 379
  :type 'string
  :link '(custom-manual "(message)Header Commands")
  :group 'message-various)

(defcustom message-archive-note
  "X-No-Archive: Yes - save http://groups.google.com/"
  "Note to insert why you wouldn't want this posting archived.
If nil, don't insert any text in the body."
380
  :version "22.1"
381
  :type '(radio string (const nil))
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397
  :link '(custom-manual "(message)Header Commands")
  :group 'message-various)

;;; Crossposts and Followups
;; inspired by JoH-followup-to by Jochem Huhman <joh  at gmx.de>
;; new suggestions by R. Weikusat <rw at another.de>

(defvar message-cross-post-old-target nil
  "Old target for cross-posts or follow-ups.")
(make-variable-buffer-local 'message-cross-post-old-target)

(defcustom message-cross-post-default t
  "When non-nil `message-cross-post-followup-to' will perform a crosspost.
If nil, `message-cross-post-followup-to' will only do a followup.  Note that
you can explicitly override this setting by calling
`message-cross-post-followup-to' with a prefix."
398
  :version "22.1"
399 400 401
  :type 'boolean
  :group 'message-various)

402
(defcustom message-cross-post-note "Crosspost & Followup-To: "
403
  "Note to insert before signature to notify of cross-post and follow-up."
404
  :version "22.1"
405 406 407
  :type 'string
  :group 'message-various)

408
(defcustom message-followup-to-note "Followup-To: "
409
  "Note to insert before signature to notify of follow-up only."
410
  :version "22.1"
411 412 413
  :type 'string
  :group 'message-various)

414
(defcustom message-cross-post-note-function 'message-cross-post-insert-note
415 416 417 418
  "Function to use to insert note about Crosspost or Followup-To.
The function will be called with four arguments.  The function should not only
insert a note, but also ensure old notes are deleted.  See the documentation
for `message-cross-post-insert-note'."
419
  :version "22.1"
420 421 422 423 424
  :type 'function
  :group 'message-various)

;;; End of variables adopted from `message-utils.el'.

Miles Bader's avatar
Miles Bader committed
425 426 427 428 429 430 431 432 433 434
(defcustom message-signature-separator "^-- $"
  "Regexp matching the signature separator.
This variable is used to strip off the signature from quoted text
when `message-cite-function' is
`message-cite-original-without-signature'.  Most useful values
are \"^-- $\" (strict) and \"^-- *$\" (loose; allow missing
whitespace)."
  :type '(choice (const :tag "strict" "^-- $")
		 (const :tag "loose" "^-- *$")
		 regexp)
Miles Bader's avatar
Miles Bader committed
435
  :version "22.3" ;; Gnus 5.10.12 (changed default)
436
  :link '(custom-manual "(message)Various Message Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
437 438
  :group 'message-various)

439
(defcustom message-elide-ellipsis "\n[...]\n\n"
440 441 442 443
  "*The string which is inserted for elided text.
This is a format-spec string, and you can use %l to say how many
lines were removed, and %c to say how many characters were
removed."
444
  :type 'string
445
  :link '(custom-manual "(message)Various Commands")
446
  :group 'message-various)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
447

448
(defcustom message-interactive mail-interactive
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
449
  "Non-nil means when sending a message wait for and display errors.
Juanma Barranquero's avatar
Juanma Barranquero committed
450
A value of nil means let mailer mail back a message to report errors."
451
  :version "23.2"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
452 453
  :group 'message-sending
  :group 'message-mail
454
  :link '(custom-manual "(message)Sending Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
455 456
  :type 'boolean)

Miles Bader's avatar
Miles Bader committed
457
(defcustom message-confirm-send nil
Miles Bader's avatar
Miles Bader committed
458
  "When non-nil, ask for confirmation when sending a message."
Miles Bader's avatar
Miles Bader committed
459 460
  :group 'message-sending
  :group 'message-mail
Miles Bader's avatar
Miles Bader committed
461
  :version "23.1" ;; No Gnus
Miles Bader's avatar
Miles Bader committed
462 463 464
  :link '(custom-manual "(message)Sending Variables")
  :type 'boolean)

465
(defcustom message-generate-new-buffers 'unsent
Miles Bader's avatar
Miles Bader committed
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487
  "*Say whether to create a new message buffer to compose a message.
Valid values include:

nil
  Generate the buffer name in the Message way (e.g., *mail*, *news*,
  *mail to whom*, *news on group*, etc.) and continue editing in the
  existing buffer of that name.  If there is no such buffer, it will
  be newly created.

`unique' or t
  Create the new buffer with the name generated in the Message way.

`unsent'
  Similar to `unique' but the buffer name begins with \"*unsent \".

`standard'
  Similar to nil but the buffer name is simpler like *mail message*.

function
  If this is a function, call that function with three parameters:
  The type, the To address and the group name (any of these may be nil).
  The function should return the new buffer name."
488
  :version "24.1"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
489
  :group 'message-buffers
490
  :link '(custom-manual "(message)Message Buffers")
Miles Bader's avatar
Miles Bader committed
491 492 493 494 495 496
  :type '(choice (const nil)
		 (sexp :tag "unique" :format "unique\n" :value unique
		       :match (lambda (widget value) (memq value '(unique t))))
		 (const unsent)
		 (const standard)
		 (function :format "\n    %{%t%}: %v")))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
497 498 499 500

(defcustom message-kill-buffer-on-exit nil
  "*Non-nil means that the message buffer will be killed after sending a message."
  :group 'message-buffers
501
  :link '(custom-manual "(message)Message Buffers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
502 503
  :type 'boolean)

504 505 506
(defcustom message-kill-buffer-query t
  "*Non-nil means that killing a modified message buffer has to be confirmed.
This is used by `message-kill-buffer'."
507
  :version "23.1" ;; No Gnus
508 509 510
  :group 'message-buffers
  :type 'boolean)

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
511
(defcustom message-user-organization
512 513
  (or (getenv "ORGANIZATION") t)
  "String to be used as an Organization header.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
514 515 516 517 518
If t, use `message-user-organization-file'."
  :group 'message-headers
  :type '(choice string
		 (const :tag "consult file" t)))

519 520 521 522 523 524 525 526
(defcustom message-user-organization-file
  (let (orgfile)
    (dolist (f (list "/etc/organization"
		     "/etc/news/organization"
		     "/usr/lib/news/organization"))
      (when (file-readable-p f)
	(setq orgfile f)))
    orgfile)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
527
  "*Local news organization file."
528
  :type '(choice (const nil) file)
529
  :link '(custom-manual "(message)News Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
530 531
  :group 'message-headers)

532
(defcustom message-make-forward-subject-function
533
  #'message-forward-subject-name-subject
Dave Love's avatar
Dave Love committed
534
  "*List of functions called to generate subject headers for forwarded messages.
535 536 537 538 539
The subject generated by the previous function is passed into each
successive function.

The provided functions are:

540 541 542 543 544
* `message-forward-subject-author-subject' Source of article (author or
      newsgroup), in brackets followed by the subject
* `message-forward-subject-name-subject' Source of article (name of author
      or newsgroup), in brackets followed by the subject
* `message-forward-subject-fwd' Subject of article with 'Fwd:' prepended
545
      to it."
546
  :group 'message-forwarding
547
  :link '(custom-manual "(message)Forwarding")
548
  :type '(radio (function-item message-forward-subject-author-subject)
Dave Love's avatar
Dave Love committed
549
		(function-item message-forward-subject-fwd)
550
		(function-item message-forward-subject-name-subject)
Dave Love's avatar
Dave Love committed
551
		(repeat :tag "List of functions" function)))
552 553

(defcustom message-forward-as-mime t
554 555
  "*Non-nil means forward messages as an inline/rfc822 MIME section.
Otherwise, directly inline the old message in the forwarded message."
556
  :version "21.1"
557
  :group 'message-forwarding
558
  :link '(custom-manual "(message)Forwarding")
559 560
  :type 'boolean)

561 562 563 564 565 566 567 568
(defcustom message-forward-show-mml 'best
  "*Non-nil means show forwarded messages as MML (decoded from MIME).
Otherwise, forwarded messages are unchanged.
Can also be the symbol `best' to indicate that MML should be
used, except when it is a bad idea to use MML.  One example where
it is a bad idea is when forwarding a signed or encrypted
message, because converting MIME to MML would invalidate the
digital signature."
569
  :version "21.1"
570
  :group 'message-forwarding
571 572 573
  :type '(choice (const :tag "use MML" t)
		 (const :tag "don't use MML " nil)
		 (const :tag "use MML when appropriate" best)))
574 575

(defcustom message-forward-before-signature t
576
  "*Non-nil means put forwarded message before signature, else after."
577 578
  :group 'message-forwarding
  :type 'boolean)
579 580

(defcustom message-wash-forwarded-subjects nil
581 582
  "*Non-nil means try to remove as much cruft as possible from the subject.
Done before generating the new subject of a forward."
583
  :group 'message-forwarding
584
  :link '(custom-manual "(message)Forwarding")
585 586
  :type 'boolean)

587 588 589 590 591 592
(defcustom message-ignored-resent-headers
  ;; `Delivered-To' needs to be removed because some mailers use it to
  ;; detect loops, so if you resend a message to an address that ultimately
  ;; comes back to you (e.g. a mailing-list to which you subscribe, in which
  ;; case you may be removed from the list on the grounds that mail to you
  ;; bounced with a "mailing loop" error).
593 594
  "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:\\|^>?From \\|^Delivered-To:\
\\|^X-Content-Length:\\|^X-UIDL:"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
595
  "*All headers that match this regexp will be deleted when resending a message."
596
  :version "24.4"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
597
  :group 'message-interface
598
  :link '(custom-manual "(message)Resending")
599 600 601 602 603 604
  :type '(repeat :value-to-internal (lambda (widget value)
				      (custom-split-regexp-maybe value))
		 :match (lambda (widget value)
			  (or (stringp value)
			      (widget-editable-list-match widget value)))
		 regexp))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
605

606
(defcustom message-forward-ignored-headers "^Content-Transfer-Encoding:\\|^X-Gnus"
Gnus developers's avatar
Gnus developers committed
607 608
  "*All headers that match this regexp will be deleted when forwarding a message.
This may also be a list of regexps."
609
  :version "21.1"
610
  :group 'message-forwarding
611 612 613 614 615
  :type '(repeat :value-to-internal (lambda (widget value)
				      (custom-split-regexp-maybe value))
		 :match (lambda (widget value)
			  (or (stringp value)
			      (widget-editable-list-match widget value)))
616 617
		 regexp))

Gnus developers's avatar
Gnus developers committed
618 619 620 621
(defcustom message-forward-included-headers nil
  "If non-nil, delete non-matching headers when forwarding a message.
Only headers that match this regexp will be included.  This
variable should be a regexp or a list of regexps."
Stefan Monnier's avatar
Stefan Monnier committed
622
  :version "25.1"
Gnus developers's avatar
Gnus developers committed
623 624 625 626 627 628 629 630
  :group 'message-forwarding
  :type '(repeat :value-to-internal (lambda (widget value)
				      (custom-split-regexp-maybe value))
		 :match (lambda (widget value)
			  (or (stringp value)
			      (widget-editable-list-match widget value)))
		 regexp))

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
631 632 633
(defcustom message-ignored-cited-headers "."
  "*Delete these headers from the messages you yank."
  :group 'message-insertion
634 635 636
  :link '(custom-manual "(message)Insertion Variables")
  :type 'regexp)

637
(defcustom message-cite-prefix-regexp mail-citation-prefix-regexp
638
  "*Regexp matching the longest possible citation prefix on a line."
639
  :version "24.1"
640 641
  :group 'message-insertion
  :link '(custom-manual "(message)Insertion Variables")
642 643 644 645 646 647 648
  :type 'regexp
  :set (lambda (symbol value)
	 (prog1
	     (custom-set-default symbol value)
	   (if (boundp 'gnus-message-cite-prefix-regexp)
	       (setq gnus-message-cite-prefix-regexp
		     (concat "^\\(?:" value "\\)"))))))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
649

650
(defcustom message-cancel-message "I am canceling my own article.\n"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
651 652
  "Message to be inserted in the cancel message."
  :group 'message-interface
653
  :link '(custom-manual "(message)Canceling News")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
654 655
  :type 'string)

656 657
(defun message-send-mail-function ()
  "Return suitable value for the variable `message-send-mail-function'."
658 659 660
  (cond ((and (require 'sendmail)
	      (boundp 'sendmail-program)
	      sendmail-program
661
	      (executable-find sendmail-program))
662
	 'message-send-mail-with-sendmail)
663
	((and (locate-library "smtpmail")
664
	      (boundp 'smtpmail-default-smtp-server)
665 666 667
	      smtpmail-default-smtp-server)
	 'message-smtpmail-send-it)
	((locate-library "mailclient")
668 669
	 'message-send-mail-with-mailclient)
	(t
670
	 (error "Don't know how to send mail.  Please customize `message-send-mail-function'"))))
671

672
(defun message-default-send-mail-function ()
Glenn Morris's avatar
Glenn Morris committed
673 674
  (cond ((eq send-mail-function 'smtpmail-send-it) 'message-smtpmail-send-it)
	((eq send-mail-function 'feedmail-send-it) 'feedmail-send-it)
675
	((eq send-mail-function 'sendmail-query-once) 'sendmail-query-once)
Glenn Morris's avatar
Glenn Morris committed
676 677
	((eq send-mail-function 'mailclient-send-it)
	 'message-send-mail-with-mailclient)
678 679 680 681
	(t (message-send-mail-function))))

;; Useful to set in site-init.el
(defcustom message-send-mail-function (message-default-send-mail-function)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
682 683 684 685
  "Function to call to send the current buffer as mail.
The headers should be delimited by a line whose contents match the
variable `mail-header-separator'.

686
Valid values include `message-send-mail-with-sendmail'
Dave Love's avatar
Dave Love committed
687
`message-send-mail-with-mh', `message-send-mail-with-qmail',
688 689
`message-smtpmail-send-it', `smtpmail-send-it',
`feedmail-send-it' and `message-send-mail-with-mailclient'.  The
Miles Bader's avatar
Miles Bader committed
690 691
default is system dependent and determined by the function
`message-send-mail-function'.
Dave Love's avatar
Dave Love committed
692 693

See also `send-mail-function'."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
694 695 696
  :type '(radio (function-item message-send-mail-with-sendmail)
		(function-item message-send-mail-with-mh)
		(function-item message-send-mail-with-qmail)
697
		(function-item message-smtpmail-send-it)
698
		(function-item smtpmail-send-it)
Dave Love's avatar
Dave Love committed
699
		(function-item feedmail-send-it)
700 701 702
		(function-item message-send-mail-with-mailclient
			       :tag "Use Mailclient package")
 		(function :tag "Other"))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
703
  :group 'message-sending
Glenn Morris's avatar
Glenn Morris committed
704
  :version "23.2"
705
  :initialize 'custom-initialize-default
706
  :link '(custom-manual "(message)Mail Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
707 708 709 710 711 712 713 714
  :group 'message-mail)

(defcustom message-send-news-function 'message-send-news
  "Function to call to send the current buffer as news.
The headers should be delimited by a line whose contents match the
variable `mail-header-separator'."
  :group 'message-sending
  :group 'message-news
715
  :link '(custom-manual "(message)News Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
716 717 718
  :type 'function)

(defcustom message-reply-to-function nil
Dave Love's avatar
Dave Love committed
719
  "If non-nil, function that should return a list of headers.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
720 721 722
This function should pick out addresses from the To, Cc, and From headers
and respond with new To and Cc headers."
  :group 'message-interface
723
  :link '(custom-manual "(message)Reply")
Dave Love's avatar
Dave Love committed
724
  :type '(choice function (const nil)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
725 726

(defcustom message-wide-reply-to-function nil
Dave Love's avatar
Dave Love committed
727
  "If non-nil, function that should return a list of headers.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
728 729 730
This function should pick out addresses from the To, Cc, and From headers
and respond with new To and Cc headers."
  :group 'message-interface
731
  :link '(custom-manual "(message)Wide Reply")
Dave Love's avatar
Dave Love committed
732
  :type '(choice function (const nil)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
733 734

(defcustom message-followup-to-function nil
Dave Love's avatar
Dave Love committed
735
  "If non-nil, function that should return a list of headers.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
736 737 738
This function should pick out addresses from the To, Cc, and From headers
and respond with new To and Cc headers."
  :group 'message-interface
739
  :link '(custom-manual "(message)Followup")
Dave Love's avatar
Dave Love committed
740
  :type '(choice function (const nil)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
741

742 743 744 745 746 747
(defcustom message-extra-wide-headers nil
  "If non-nil, a list of additional address headers.
These are used when composing a wide reply."
  :group 'message-sending
  :type '(repeat string))

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
748 749 750 751 752 753 754
(defcustom message-use-followup-to 'ask
  "*Specifies what to do with Followup-To header.
If nil, always ignore the header.  If it is t, use its value, but
query before using the \"poster\" value.  If it is the symbol `ask',
always query the user whether to use the value.  If it is the symbol
`use', always use the value."
  :group 'message-interface
755
  :link '(custom-manual "(message)Followup")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
756
  :type '(choice (const :tag "ignore" nil)
757
		 (const :tag "use & query" t)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
758 759 760
		 (const use)
		 (const ask)))

761 762 763 764 765
(defcustom message-use-mail-followup-to 'use
  "*Specifies what to do with Mail-Followup-To header.
If nil, always ignore the header.  If it is the symbol `ask', always
query the user whether to use the value.  If it is the symbol `use',
always use the value."
766
  :version "22.1"
767 768 769 770 771 772 773 774 775 776 777 778 779
  :group 'message-interface
  :link '(custom-manual "(message)Mailing Lists")
  :type '(choice (const :tag "ignore" nil)
		 (const use)
		 (const ask)))

(defcustom message-subscribed-address-functions nil
  "*Specifies functions for determining list subscription.
If nil, do not attempt to determine list subscription with functions.
If non-nil, this variable contains a list of functions which return
regular expressions to match lists.  These functions can be used in
conjunction with `message-subscribed-regexps' and
`message-subscribed-addresses'."
780
  :version "22.1"
781 782 783 784 785 786 787 788
  :group 'message-interface
  :link '(custom-manual "(message)Mailing Lists")
  :type '(repeat sexp))

(defcustom message-subscribed-address-file nil
  "*A file containing addresses the user is subscribed to.
If nil, do not look at any files to determine list subscriptions.  If
non-nil, each line of this file should be a mailing list address."
789
  :version "22.1"
790 791
  :group 'message-interface
  :link '(custom-manual "(message)Mailing Lists")
792
  :type '(radio file (const nil)))
793 794 795 796 797 798

(defcustom message-subscribed-addresses nil
  "*Specifies a list of addresses the user is subscribed to.
If nil, do not use any predefined list subscriptions.  This list of
addresses can be used in conjunction with
`message-subscribed-address-functions' and `message-subscribed-regexps'."
799
  :version "22.1"
800 801 802 803 804 805 806 807 808
  :group 'message-interface
  :link '(custom-manual "(message)Mailing Lists")
  :type '(repeat string))

(defcustom message-subscribed-regexps nil
  "*Specifies a list of addresses the user is subscribed to.
If nil, do not use any predefined list subscriptions.  This list of
regular expressions can be used in conjunction with
`message-subscribed-address-functions' and `message-subscribed-addresses'."
809
  :version "22.1"
810 811 812 813 814 815 816 817 818
  :group 'message-interface
  :link '(custom-manual "(message)Mailing Lists")
  :type '(repeat regexp))

(defcustom message-allow-no-recipients 'ask
  "Specifies what to do when there are no recipients other than Gcc/Fcc.
If it is the symbol `always', the posting is allowed.  If it is the
symbol `never', the posting is not allowed.  If it is the symbol
`ask', you are prompted."
819
  :version "22.1"
820 821 822 823 824 825
  :group 'message-interface
  :link '(custom-manual "(message)Message Headers")
  :type '(choice (const always)
		 (const never)
		 (const ask)))

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
826
(defcustom message-sendmail-f-is-evil nil
Dave Love's avatar
Dave Love committed
827
  "*Non-nil means don't add \"-f username\" to the sendmail command line.
828
Doing so would be even more evil than leaving it out."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
829
  :group 'message-sending
830
  :link '(custom-manual "(message)Mail Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
831 832
  :type 'boolean)

833
(defcustom message-sendmail-envelope-from
834
  ;; `mail-envelope-from' is unavailable unless sendmail.el is loaded.
835
  (if (boundp 'mail-envelope-from) mail-envelope-from)
836 837 838
  "*Envelope-from when sending mail with sendmail.
If this is nil, use `user-mail-address'.  If it is the symbol
`header', use the From: header of the message."
839
  :version "23.2"
840 841 842 843 844 845
  :type '(choice (string :tag "From name")
		 (const :tag "Use From: header from message" header)
		 (const :tag "Use `user-mail-address'" nil))
  :link '(custom-manual "(message)Mail Variables")
  :group 'message-sending)

846 847 848
(defcustom message-sendmail-extra-arguments nil
  "Additional arguments to `sendmail-program'."
  ;; E.g. '("-a" "account") for msmtp
849
  :version "23.1" ;; No Gnus
850 851 852 853
  :type '(repeat string)
  ;; :link '(custom-manual "(message)Mail Variables")
  :group 'message-sending)

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
854 855 856 857
;; qmail-related stuff
(defcustom message-qmail-inject-program "/var/qmail/bin/qmail-inject"
  "Location of the qmail-inject program."
  :group 'message-sending
858
  :link '(custom-manual "(message)Mail Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
859 860 861 862
  :type 'file)

(defcustom message-qmail-inject-args nil
  "Arguments passed to qmail-inject programs.
Juanma Barranquero's avatar
Juanma Barranquero committed
863 864
This should be a list of strings, one string for each argument.
It may also be a function.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
865 866 867 868 869

For e.g., if you wish to set the envelope sender address so that bounces
go to the right place or to deal with listserv's usage of that address, you
might set this variable to '(\"-f\" \"you@some.where\")."
  :group 'message-sending
870 871 872
  :link '(custom-manual "(message)Mail Variables")
  :type '(choice (function)
		 (repeat string)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
873

Dan Nicolaescu's avatar
Dan Nicolaescu committed
874 875
(defvar gnus-post-method)
(defvar gnus-select-method)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
876 877
(defcustom message-post-method
  (cond ((and (boundp 'gnus-post-method)
878
	      (listp gnus-post-method)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
879 880 881 882 883
	      gnus-post-method)
	 gnus-post-method)
	((boundp 'gnus-select-method)
	 gnus-select-method)
	(t '(nnspool "")))
884 885 886
  "*Method used to post news.
Note that when posting from inside Gnus, for instance, this
variable isn't used."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
887 888 889 890 891 892
  :group 'message-news
  :group 'message-sending
  ;; This should be the `gnus-select-method' widget, but that might
  ;; create a dependence to `gnus.el'.
  :type 'sexp)

893
(defcustom message-generate-headers-first nil
894
  "Which headers should be generated before starting to compose a message.
895
If t, generate all required headers.  This can also be a list of headers to
896 897 898 899 900 901
generate.  The variables `message-required-news-headers' and
`message-required-mail-headers' specify which headers to generate.

Note that the variable `message-deletable-headers' specifies headers which
are to be deleted and then re-generated before sending, so this variable
will not have a visible effect for those headers."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
902
  :group 'message-headers
903 904
  :link '(custom-manual "(message)Message Headers")
  :type '(choice (const :tag "None" nil)
905 906 907 908 909 910 911 912 913 914 915
		 (const :tag "All" t)
		 (repeat (sexp :tag "Header"))))

(defcustom message-fill-column 72
  "Column beyond which automatic line-wrapping should happen.
Local value for message buffers.  If non-nil, also turn on
auto-fill in message buffers."
  :group 'message-various
  ;; :link '(custom-manual "(message)Message Headers")
  :type '(choice (const :tag "Don't turn on auto fill" nil)
		 (integer)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
916

917 918 919 920 921 922
(defcustom message-setup-hook nil
  "Normal hook, run each time a new outgoing message is initialized.
The function `message-setup' runs this hook."
  :group 'message-various
  :link '(custom-manual "(message)Various Message Variables")
  :type 'hook)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
923

924
(defcustom message-cancel-hook nil
Paul Eggert's avatar
Paul Eggert committed
925
  "Hook run when canceling articles."
926
  :group 'message-various
927
  :link '(custom-manual "(message)Various Message Variables")
928 929
  :type 'hook)

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
930 931 932 933 934
(defcustom message-signature-setup-hook nil
  "Normal hook, run each time a new outgoing message is initialized.
It is run after the headers have been inserted and before
the signature is inserted."
  :group 'message-various
935
  :link '(custom-manual "(message)Various Message Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
936 937 938 939 940 941 942 943 944 945 946 947 948
  :type 'hook)

(defcustom message-mode-hook nil
  "Hook run in message mode buffers."
  :group 'message-various
  :type 'hook)

(defcustom message-header-hook nil
  "Hook run in a message mode buffer narrowed to the headers."
  :group 'message-various
  :type 'hook)

(defcustom message-header-setup-hook nil
949
  "Hook called narrowed to the headers when setting up a message buffer."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
950
  :group 'message-various
951
  :link '(custom-manual "(message)Various Message Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
952 953
  :type 'hook)

954 955 956 957
(defcustom message-minibuffer-local-map
  (let ((map (make-sparse-keymap 'message-minibuffer-local-map)))
    (set-keymap-parent map minibuffer-local-map)
    map)
958
  "Keymap for `message-read-from-minibuffer'."
959 960
  ;; FIXME improve type.
  :type '(restricted-sexp :match-alternatives (symbolp keymapp))
961 962
  :version "22.1"
  :group 'message-various)
963

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
964
(defcustom message-citation-line-function 'message-insert-citation-line
965 966
  "*Function called to insert the \"Whomever writes:\" line.

967
Predefined functions include `message-insert-citation-line' and
Miles Bader's avatar
Miles Bader committed
968
`message-insert-formatted-citation-line' (see the variable
969 970
`message-citation-line-format').

971 972 973 974
Note that Gnus provides a feature where the reader can click on
`writes:' to hide the cited text.  If you change this line too much,
people who read your message will have to change their Gnus
configuration.  See the variable `gnus-cite-attribution-suffix'."
975 976
  :type '(choice
	  (function-item :tag "plain" message-insert-citation-line)
Miles Bader's avatar
Miles Bader committed
977
	  (function-item :tag "formatted" message-insert-formatted-citation-line)
978
	  (function :tag "Other"))
979
  :link '(custom-manual "(message)Insertion Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
980 981
  :group 'message-insertion)

982 983 984
(defcustom message-citation-line-format "On %a, %b %d %Y, %N wrote:\n"
  "Format of the \"Whomever writes:\" line.

985 986
The string is formatted using `format-spec'.  The following constructs
are replaced:
987 988 989 990 991 992 993

  %f   The full From, e.g. \"John Doe <john.doe@example.invalid>\".
  %n   The mail address, e.g. \"john.doe@example.invalid\".
  %N   The real name if present, e.g.: \"John Doe\", else fall
       back to the mail address.
  %F   The first name if present, e.g.: \"John\".
  %L   The last name if present, e.g.: \"Doe\".
994
  %Z, %z   The time zone in the numeric form, e.g.:\"+0000\".
995 996

All other format specifiers are passed to `format-time-string'
997 998 999 1000 1001
which is called using the date from the article your replying to, but
the date in the formatted string will be expressed in