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

;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
Glenn Morris's avatar
Glenn Morris committed
4
;;   2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
5

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

;; This file is part of GNU Emacs.

11
;; GNU Emacs is free software: you can redistribute it and/or modify
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
12
;; it under the terms of the GNU General Public License as published by
13 14
;; 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
15 16 17

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

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

;;; 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:

32 33
(eval-and-compile
  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
34
(eval-when-compile
Dan Nicolaescu's avatar
Dan Nicolaescu committed
35
  (require 'cl))
36

37
(require 'hashcash)
38
(require 'canlock)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
39
(require 'mailheader)
40
(require 'gmm-utils)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
41
(require 'nnheader)
42 43 44
;; This is apparently necessary even though things are autoloaded.
;; Because we dynamically bind mail-abbrev-mode-regexp, we'd better
;; require mailabbrev here.
45
(if (featurep 'xemacs)
46 47
    (require 'mail-abbrevs)
  (require 'mailabbrev))
48 49
(require 'mail-parse)
(require 'mml)
50
(require 'rfc822)
51 52
(require 'ecomplete)

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

Dan Nicolaescu's avatar
Dan Nicolaescu committed
55 56 57
(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
58 59 60 61 62 63 64 65 66 67 68 69

(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
70
  "Various Message Variables."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
71 72 73 74
  :link '(custom-manual "(message)Various Message Variables")
  :group 'message)

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

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

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

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

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

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

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

(defgroup message-mail nil
109
  "Composing Mail Messages."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
  :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
130
  :type '(choice function (const nil)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
131 132 133 134 135 136 137 138 139 140

(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)

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

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
147
(defcustom message-courtesy-message
148
  "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
149 150 151 152 153
  "*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
154
  :type '(radio string (const nil)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
155

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

162 163 164
(defcustom message-from-style mail-from-style
;; Default to the value of `mail-from-style', available in all Emacsen
;; that Gnus supports.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
165 166
  "*Specifies how \"From\" headers look.

Dave Love's avatar
Dave Love committed
167
If nil, they contain just the return address like:
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
168 169 170 171 172 173 174 175
	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."
176
  :version "23.2"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
177 178 179 180 181 182
  :type '(choice (const :tag "simple" nil)
		 (const parens)
		 (const angles)
		 (const default))
  :group 'message-headers)

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

(defcustom message-syntax-checks
  (if message-insert-canlock '((sender . disabled)) nil)
191
  ;; Guess this one shouldn't be easy to customize...
192
  "*Controls what syntax checks should not be performed on outgoing posts.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
193 194 195 196 197
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
198 199
Checks include `approved', `bogus-recipient', `continuation-headers',
`control-chars', `empty', `existing-newsgroups', `from', `illegible-text',
Miles Bader's avatar
Miles Bader committed
200 201
`invisible-text', `long-header-lines', `long-lines', `message-id',
`multiple-headers', `new-text', `newsgroups', `quoting-style',
Miles Bader's avatar
Miles Bader committed
202
`repeated-newsgroups', `reply-to', `sender', `sendsys', `shoot',
Miles Bader's avatar
Miles Bader committed
203 204
`shorten-followup-to', `signature', `size', `subject', `subject-cmsg'
and `valid-newsgroups'."
205
  :group 'message-news
Dave Love's avatar
Dave Love committed
206
  :type '(repeat sexp))			; Fixme: improve this
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
207

208 209 210 211 212
(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'."
213
  :version "22.1"
214 215 216 217 218
  :group 'message-news
  :group 'message-headers
  :link '(custom-manual "(message)Message Headers")
  :type '(repeat sexp))

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

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

(defcustom message-required-mail-headers
242
  '(From Subject Date (optional . In-Reply-To) Message-ID
243
	 (optional . User-Agent))
244
  "*Headers to be generated or prompted for when mailing a message.
245 246
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
247 248
  :group 'message-mail
  :group 'message-headers
249
  :link '(custom-manual "(message)Message Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
250 251 252 253 254
  :type '(repeat sexp))

(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
255
  :link '(custom-manual "(message)Message Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
256 257 258
  :type 'sexp)

(defcustom message-ignored-news-headers
259
  "^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|^X-Draft-From:\\|^X-Gnus-Agent-Meta-Information:"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
260 261 262
  "*Regexp of headers to be removed unconditionally before posting."
  :group 'message-news
  :group 'message-headers
263
  :link '(custom-manual "(message)Message Headers")
264 265 266 267 268 269
  :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
270

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

Miles Bader's avatar
Miles Bader committed
279
(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:"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
280 281 282 283
  "*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
284
  :link '(custom-manual "(message)Superseding")
285 286 287 288 289 290
  :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
291

292 293
(defcustom message-subject-re-regexp
  "^[ \t]*\\([Rr][Ee]\\(\\[[0-9]*\\]\\)*:[ \t]*\\)*[ \t]*"
294 295
  "*Regexp matching \"Re: \" in the subject line."
  :group 'message-various
296
  :link '(custom-manual "(message)Message Headers")
297 298
  :type 'regexp)

299 300 301 302 303 304 305 306 307 308
;;; Start of variables adopted from `message-utils.el'.

(defcustom message-subject-trailing-was-query 'ask
  "*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."
309
  :version "22.1"
310 311
  :type '(choice (const :tag "never" nil)
		 (const :tag "always strip" t)
312
		 (const ask))
313 314 315 316 317 318 319 320 321 322 323 324 325
  :link '(custom-manual "(message)Message Headers")
  :group 'message-various)

(defcustom message-subject-trailing-was-ask-regexp
  "[ \t]*\\([[(]+[Ww][Aa][Ss][ \t]*.*[\])]+\\)"
  "*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."
326
  :version "22.1"
327 328 329 330 331 332 333 334 335 336 337 338
  :group 'message-various
  :link '(custom-manual "(message)Message Headers")
  :type 'regexp)

(defcustom message-subject-trailing-was-regexp
  "[ \t]*\\((*[Ww][Aa][Ss]:[ \t]*.*)\\)"
  "*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."
339
  :version "22.1"
340 341 342 343 344 345 346
  :group 'message-various
  :link '(custom-manual "(message)Message Headers")
  :type 'regexp)

;;; marking inserted text

(defcustom message-mark-insert-begin
347
  "--8<---------------cut here---------------start------------->8---\n"
348
  "How to mark the beginning of some inserted text."
349
  :version "22.1"
350 351 352 353 354
  :type 'string
  :link '(custom-manual "(message)Insertion Variables")
  :group 'message-various)

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

362
(defcustom message-archive-header "X-No-Archive: Yes\n"
363 364
  "Header to insert when you don't want your article to be archived.
Archives \(such as groups.google.com\) respect this header."
365
  :version "22.1"
366 367 368 369 370 371 372 373
  :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."
374
  :version "22.1"
375
  :type '(radio string (const nil))
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
  :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."
392
  :version "22.1"
393 394 395
  :type 'boolean
  :group 'message-various)

396
(defcustom message-cross-post-note "Crosspost & Followup-To: "
397
  "Note to insert before signature to notify of cross-post and follow-up."
398
  :version "22.1"
399 400 401
  :type 'string
  :group 'message-various)

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

408
(defcustom message-cross-post-note-function 'message-cross-post-insert-note
409 410 411 412
  "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'."
413
  :version "22.1"
414 415 416 417 418
  :type 'function
  :group 'message-various)

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

Miles Bader's avatar
Miles Bader committed
419 420 421 422 423 424 425 426 427 428
(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
429
  :version "22.3" ;; Gnus 5.10.12 (changed default)
430
  :link '(custom-manual "(message)Various Message Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
431 432
  :group 'message-various)

433
(defcustom message-elide-ellipsis "\n[...]\n\n"
434 435
  "*The string which is inserted for elided text."
  :type 'string
436
  :link '(custom-manual "(message)Various Commands")
437
  :group 'message-various)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
438

439 440 441
(defcustom message-interactive mail-interactive
;; Default to the value of `mail-interactive', available in all Emacsen
;; that Gnus supports.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
442 443
  "Non-nil means when sending a message wait for and display errors.
nil means let mailer mail back a message to report errors."
444
  :version "23.2"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
445 446
  :group 'message-sending
  :group 'message-mail
447
  :link '(custom-manual "(message)Sending Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
448 449
  :type 'boolean)

Miles Bader's avatar
Miles Bader committed
450
(defcustom message-confirm-send nil
Miles Bader's avatar
Miles Bader committed
451
  "When non-nil, ask for confirmation when sending a message."
Miles Bader's avatar
Miles Bader committed
452 453
  :group 'message-sending
  :group 'message-mail
Miles Bader's avatar
Miles Bader committed
454
  :version "23.1" ;; No Gnus
Miles Bader's avatar
Miles Bader committed
455 456 457
  :link '(custom-manual "(message)Sending Variables")
  :type 'boolean)

458
(defcustom message-generate-new-buffers 'unique
Miles Bader's avatar
Miles Bader committed
459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480
  "*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."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
481
  :group 'message-buffers
482
  :link '(custom-manual "(message)Message Buffers")
Miles Bader's avatar
Miles Bader committed
483 484 485 486 487 488
  :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
489 490 491 492

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

496 497 498
(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'."
499
  :version "23.1" ;; No Gnus
500 501 502
  :group 'message-buffers
  :type 'boolean)

Dan Nicolaescu's avatar
Dan Nicolaescu committed
503
(defvar gnus-local-organization)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
504 505 506 507 508 509 510 511 512 513 514 515
(defcustom message-user-organization
  (or (and (boundp 'gnus-local-organization)
	   (stringp gnus-local-organization)
	   gnus-local-organization)
      (getenv "ORGANIZATION")
      t)
  "*String to be used as an Organization header.
If t, use `message-user-organization-file'."
  :group 'message-headers
  :type '(choice string
		 (const :tag "consult file" t)))

516 517 518 519 520 521 522 523
(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
524 525
  "*Local news organization file."
  :type 'file
526
  :link '(custom-manual "(message)News Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
527 528
  :group 'message-headers)

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

The provided functions are:

537 538 539 540 541
* `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
542
      to it."
543
  :group 'message-forwarding
544
  :link '(custom-manual "(message)Forwarding")
545
  :type '(radio (function-item message-forward-subject-author-subject)
Dave Love's avatar
Dave Love committed
546
		(function-item message-forward-subject-fwd)
547
		(function-item message-forward-subject-name-subject)
Dave Love's avatar
Dave Love committed
548
		(repeat :tag "List of functions" function)))
549 550

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

558 559 560 561 562 563 564 565
(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."
566
  :version "21.1"
567
  :group 'message-forwarding
568 569 570
  :type '(choice (const :tag "use MML" t)
		 (const :tag "don't use MML " nil)
		 (const :tag "use MML when appropriate" best)))
571 572

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

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

584 585 586 587 588 589 590
(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).
  "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:\\|^>?From \\|^Delivered-To:"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
591 592
  "*All headers that match this regexp will be deleted when resending a message."
  :group 'message-interface
593
  :link '(custom-manual "(message)Resending")
594 595 596 597 598 599
  :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
600

601 602
(defcustom message-forward-ignored-headers "^Content-Transfer-Encoding:\\|^X-Gnus"
  "*All headers that match this regexp will be deleted when forwarding a message."
603
  :version "21.1"
604
  :group 'message-forwarding
605 606 607 608 609
  :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)))
610 611
		 regexp))

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
612 613 614
(defcustom message-ignored-cited-headers "."
  "*Delete these headers from the messages you yank."
  :group 'message-insertion
615 616 617 618
  :link '(custom-manual "(message)Insertion Variables")
  :type 'regexp)

(defcustom message-cite-prefix-regexp
619 620 621 622
  ;; Default to the value of `mail-citation-prefix-regexp' if available.
  ;; Note: as for Emacs 21, XEmacs 21.4 and 21.5, it is unavailable
  ;; unless sendmail.el is loaded.
  (cond ((boundp 'mail-citation-prefix-regexp)
623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639
	 mail-citation-prefix-regexp)
	((string-match "[[:digit:]]" "1")
	 ;; Support POSIX?  XEmacs 21.5.27 doesn't.
	 "\\([ \t]*[_.[:word:]]+>+\\|[ \t]*[]>|}]\\)+")
	(t
	 ;; ?-, ?_ or ?. MUST NOT be in syntax entry w.
	 (let (non-word-constituents)
	   (with-syntax-table text-mode-syntax-table
	     (setq non-word-constituents
		   (concat
		    (if (string-match "\\w" "_")  "" "_")
		    (if (string-match "\\w" ".")  "" "."))))
	   (if (equal non-word-constituents "")
	       "\\([ \t]*\\(\\w\\)+>+\\|[ \t]*[]>|}]\\)+"
	     (concat "\\([ \t]*\\(\\w\\|["
		     non-word-constituents
		     "]\\)+>+\\|[ \t]*[]>|}]\\)+")))))
640
  "*Regexp matching the longest possible citation prefix on a line."
641
  :version "23.2"
642 643
  :group 'message-insertion
  :link '(custom-manual "(message)Insertion Variables")
644 645 646 647 648 649 650
  :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
651

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

658 659
(defvar smtpmail-default-smtp-server)

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

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
677
;; Useful to set in site-init.el
678
(defcustom message-send-mail-function (message-send-mail-function)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
679 680 681 682
  "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'.

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

See also `send-mail-function'."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
691 692 693
  :type '(radio (function-item message-send-mail-with-sendmail)
		(function-item message-send-mail-with-mh)
		(function-item message-send-mail-with-qmail)
694
		(function-item message-smtpmail-send-it)
695
		(function-item smtpmail-send-it)
Dave Love's avatar
Dave Love committed
696
		(function-item feedmail-send-it)
697 698 699
		(function-item message-send-mail-with-mailclient
			       :tag "Use Mailclient package")
 		(function :tag "Other"))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
700
  :group 'message-sending
701
  :version "23.1" ;; No Gnus
702
  :initialize 'custom-initialize-default
703
  :link '(custom-manual "(message)Mail Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
704 705 706 707 708 709 710 711
  :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
712
  :link '(custom-manual "(message)News Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
713 714 715
  :type 'function)

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

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

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

739 740 741 742 743 744
(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
745 746 747 748 749 750 751
(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
752
  :link '(custom-manual "(message)Followup")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
753
  :type '(choice (const :tag "ignore" nil)
754
		 (const :tag "use & query" t)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
755 756 757
		 (const use)
		 (const ask)))

758 759 760 761 762
(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."
763
  :version "22.1"
764 765 766 767 768 769 770 771 772 773 774 775 776
  :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'."
777
  :version "22.1"
778 779 780 781 782 783 784 785
  :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."
786
  :version "22.1"
787 788
  :group 'message-interface
  :link '(custom-manual "(message)Mailing Lists")
789
  :type '(radio file (const nil)))
790 791 792 793 794 795

(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'."
796
  :version "22.1"
797 798 799 800 801 802 803 804 805
  :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'."
806
  :version "22.1"
807 808 809 810 811 812 813 814 815
  :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."
816
  :version "22.1"
817 818 819 820 821 822
  :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
823
(defcustom message-sendmail-f-is-evil nil
Dave Love's avatar
Dave Love committed
824
  "*Non-nil means don't add \"-f username\" to the sendmail command line.
825
Doing so would be even more evil than leaving it out."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
826
  :group 'message-sending
827
  :link '(custom-manual "(message)Mail Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
828 829
  :type 'boolean)

830
(defcustom message-sendmail-envelope-from
831 832 833 834
  ;; Default to the value of `mail-envelope-from' if available.
  ;; Note: as for Emacsen that Gnus supports, except for SXEmacs, it is
  ;; unavailable unless sendmail.el is loaded.
  (if (boundp 'mail-envelope-from) mail-envelope-from)
835 836 837
  "*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."
838
  :version "23.2"
839 840 841 842 843 844
  :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)

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

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

(defcustom message-qmail-inject-args nil
  "Arguments passed to qmail-inject programs.
862 863
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
864 865 866 867 868

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
869 870 871
  :link '(custom-manual "(message)Mail Variables")
  :type '(choice (function)
		 (repeat string)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
872

Dan Nicolaescu's avatar
Dan Nicolaescu committed
873 874
(defvar gnus-post-method)
(defvar gnus-select-method)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
875 876
(defcustom message-post-method
  (cond ((and (boundp 'gnus-post-method)
877
	      (listp gnus-post-method)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
878 879 880 881 882
	      gnus-post-method)
	 gnus-post-method)
	((boundp 'gnus-select-method)
	 gnus-select-method)
	(t '(nnspool "")))
883 884 885
  "*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
886 887 888 889 890 891
  :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)

892 893 894 895 896 897
;; FIXME: This should be a temporary workaround until someone implements a
;; proper solution.  If a crash happens while replying, the auto-save file
;; will *not* have a `References:' header if `message-generate-headers-first'
;; is nil.  See: http://article.gmane.org/gmane.emacs.gnus.general/51138
(defcustom message-generate-headers-first '(references)
  "Which headers should be generated before starting to compose a message.
898
If t, generate all required headers.  This can also be a list of headers to
899 900 901 902 903 904
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
905
  :group 'message-headers
906 907
  :link '(custom-manual "(message)Message Headers")
  :type '(choice (const :tag "None" nil)
908 909 910 911 912 913 914 915 916 917 918 919
		 (const :tag "References" '(references))
		 (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
920

921 922 923 924 925 926
(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
927

928 929 930
(defcustom message-cancel-hook nil
  "Hook run when cancelling articles."
  :group 'message-various
931
  :link '(custom-manual "(message)Various Message Variables")
932 933
  :type 'hook)

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
934 935 936 937 938
(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
939
  :link '(custom-manual "(message)Various Message Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
940 941 942 943 944 945 946 947 948 949 950 951 952
  :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
953
  "Hook called narrowed to the headers when setting up a message buffer."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
954
  :group 'message-various
955
  :link '(custom-manual "(message)Various Message Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
956 957
  :type 'hook)

958 959 960 961
(defcustom message-minibuffer-local-map
  (let ((map (make-sparse-keymap 'message-minibuffer-local-map)))
    (set-keymap-parent map minibuffer-local-map)
    map)
962
  "Keymap for `message-read-from-minibuffer'."
963 964
  :version "22.1"
  :group 'message-various)
965

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

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

973 974 975 976
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'."