X-Git-Url: http://cgit.sxemacs.org/?p=gnus;a=blobdiff_plain;f=lisp%2Fmessage.el;h=6c4d9309cad0421151c06a6fffe7749d410c7552;hp=b0cc714acc943d45b48b51fb08205c76e17b6278;hb=a2c927950fdddc21d7d245d01ed30463268f9234;hpb=a18e5b334e027cc1dbcf134ceee5de8985277ddf diff --git a/lisp/message.el b/lisp/message.el index b0cc714ac..6c4d9309c 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -40,13 +40,15 @@ (require 'mail-abbrevs) (require 'mailabbrev)) -;;;###autoload (defvar message-directory "~/Mail/" "*Directory from which all other mail file variables are derived.") (defvar message-max-buffers 10 "*How many buffers to keep before starting to kill them off.") +(defvar message-send-rename-function nil + "Function called to rename the buffer after sending it.") + ;;;###autoload (defvar message-fcc-handler-function 'rmail-output "*A function called to save outgoing articles. @@ -123,8 +125,7 @@ included. Organization, Lines and X-Mailer are optional.") "*Regexp of headers to be removed unconditionally before mailing.") ;;;###autoload -(defvar message-ignored-supersedes-headers - "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|Return-Path:" +(defvar message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|Return-Path:\\|^Supersedes:" "*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.") @@ -140,14 +141,16 @@ nil means let mailer mail back a message to report errors.") ;;;###autoload (defvar message-generate-new-buffers t - "*Non-nil means that a new message buffer will be created whenever `mail-setup' is called.") + "*Non-nil means that a new message buffer will be created whenever `mail-setup' is called. +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.") ;;;###autoload (defvar message-kill-buffer-on-exit nil "*Non-nil means that the message buffer will be killed after sending a message.") (defvar gnus-local-organization) -;;;###autoload (defvar message-user-organization (or (and (boundp 'gnus-local-organization) gnus-local-organization) @@ -160,9 +163,8 @@ If t, use `message-user-organization-file'.") (defvar message-user-organization-file "/usr/lib/news/organization" "*Local news organization file.") -;;;###autoload -(defvar message-autosave-directory - (concat (file-name-as-directory message-directory) "drafts/") +(defvar message-autosave-directory "~/" + ; (concat (file-name-as-directory message-directory) "drafts/") "*Directory where message autosaves buffers. If nil, message won't autosave.") @@ -253,6 +255,11 @@ always use the value.") "Normal hook, run each time a new outgoing message is initialized. The function `message-setup' runs this hook.") +(defvar 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.") + (defvar message-mode-hook nil "Hook run in message mode buffers.") @@ -369,6 +376,10 @@ actually occur.") table) "Syntax table used while in Message mode.") +(defvar message-mode-abbrev-table text-mode-abbrev-table + "Abbrev table used in Message mode buffers. +Defaults to `text-mode-abbrev-table'.") + (defvar message-font-lock-keywords (let* ((cite-prefix "A-Za-z") (cite-suffix (concat cite-prefix "0-9_.@-"))) (list '("^To:" . font-lock-function-name-face) @@ -455,8 +466,8 @@ The cdr of ech entry is a function for applying the face to a region.") (defvar message-header-format-alist `((Newsgroups) - (To . message-fill-header) - (Cc . message-fill-header) + (To . message-fill-address) + (Cc . message-fill-address) (Subject) (In-Reply-To) (Fcc) @@ -506,17 +517,27 @@ The cdr of ech entry is a function for applying the face to a region.") (defun message-tokenize-header (header &optional separator) "Split HEADER into a list of header elements. \",\" is used as the separator." - (let* ((beg 0) - (separator (or separator ",")) - (regexp - (format "[ \t]*\\([^%s]+\\)?\\([%s]+\\|\\'\\)" separator separator)) - elems) - (while (and (string-match regexp header beg) - (< beg (length header))) - (when (match-beginning 1) - (push (match-string 1 header) elems)) - (setq beg (match-end 0))) - (nreverse elems))) + (let ((regexp (format "[%s]+" (or separator ","))) + (beg 1) + (first t) + quoted elems) + (save-excursion + (message-set-work-buffer) + (insert header) + (goto-char (point-min)) + (while (not (eobp)) + (if first + (setq first nil) + (forward-char 1)) + (cond ((and (> (point) beg) + (or (eobp) + (and (looking-at regexp) + (not quoted)))) + (push (buffer-substring beg (point)) elems) + (setq beg (match-end 0))) + ((= (following-char) ?\") + (setq quoted (not quoted))))) + (nreverse elems)))) (defun message-fetch-field (header) "The same as `mail-fetch-field', only remove all newlines." @@ -773,7 +794,7 @@ C-c C-r message-ceasar-buffer-body (rot13 the message body)." (make-local-variable 'message-postpone-actions) (set-syntax-table message-mode-syntax-table) (use-local-map message-mode-map) - (setq local-abbrev-table text-mode-abbrev-table) + (setq local-abbrev-table message-mode-abbrev-table) (setq major-mode 'message-mode) (setq mode-name "Message") (setq buffer-offer-save t) @@ -793,9 +814,11 @@ C-c C-r message-ceasar-buffer-body (rot13 the message body)." (make-local-variable 'paragraph-start) (setq paragraph-start (concat (regexp-quote mail-header-separator) "$\\|[ \t]*[-_][-_][-_]+$\\|" + "-- $\\|" paragraph-start)) (setq paragraph-separate (concat (regexp-quote mail-header-separator) "$\\|[ \t]*[-_][-_][-_]+$\\|" + "-- $\\|" paragraph-separate)) (make-local-variable 'message-reply-headers) (setq message-reply-headers nil) @@ -806,8 +829,8 @@ C-c C-r message-ceasar-buffer-body (rot13 the message body)." (setq message-sent-message-via nil) (make-local-variable 'message-checksum) (setq message-checksum nil) - (when (fboundp 'mail-hist-define-keys) - (mail-hist-define-keys)) + ;;(when (fboundp 'mail-hist-define-keys) + ;; (mail-hist-define-keys)) (when (string-match "XEmacs\\|Lucid" emacs-version) (message-setup-toolbar)) (easy-menu-add message-mode-menu message-mode-map) @@ -883,6 +906,7 @@ C-c C-r message-ceasar-buffer-body (rot13 the message body)." (defun message-goto-body () "Move point to the beginning of the message body." (interactive) + (if (looking-at "[ \t]*\n") (expand-abbrev)) (goto-char (point-min)) (search-forward (concat "\n" mail-header-separator "\n") nil t)) @@ -898,7 +922,9 @@ C-c C-r message-ceasar-buffer-body (rot13 the message body)." (defun message-insert-to () "Insert a To header that points to the author of the article being replied to." (interactive) - (when (message-position-on-field "To") + (when (and (message-position-on-field "To") + (mail-fetch-field "to") + (not (string-match "\\` *\\'" (mail-fetch-field "to")))) (insert ", ")) (insert (or (message-fetch-reply-field "reply-to") (message-fetch-reply-field "from") ""))) @@ -906,7 +932,9 @@ C-c C-r message-ceasar-buffer-body (rot13 the message body)." (defun message-insert-newsgroups () "Insert the Newsgroups header from the article being replied to." (interactive) - (when (message-position-on-field "Newsgroups") + (when (and (message-position-on-field "Newsgroups") + (mail-fetch-field "newsgroups") + (not (string-match "\\` *\\'" (mail-fetch-field "newsgroups")))) (insert ",")) (insert (or (message-fetch-reply-field "newsgroups") ""))) @@ -916,9 +944,15 @@ C-c C-r message-ceasar-buffer-body (rot13 the message body)." (defun message-insert-signature (&optional force) "Insert a signature. See documentation for the `message-signature' variable." - (interactive (list t)) + (interactive (list 0)) (let* ((signature (cond ((and (null message-signature) + (eq force 0)) + (save-excursion + (goto-char (point-max)) + (not (re-search-backward + message-signature-separator nil t)))) + ((and (null message-signature) force) t) ((message-functionp message-signature) @@ -934,13 +968,11 @@ C-c C-r message-ceasar-buffer-body (rot13 the message body)." (file-exists-p message-signature-file)) signature)))) (when signature - ;; Remove blank lines at the end of the message. - (goto-char (point-max)) - (skip-chars-backward " \t\n") - (end-of-line) - (delete-region (point) (point-max)) ;; Insert the signature. - (insert "\n\n-- \n") + (goto-char (point-max)) + (unless (bolp) + (insert "\n")) + (insert "\n-- \n") (if (eq signature t) (insert-file-contents message-signature-file) (insert signature)) @@ -1020,7 +1052,11 @@ name, rather than giving an automatic name." (name (if enter-string (read-string "New buffer name: " name-default) name-default))) - (rename-buffer name t))))) + (rename-buffer name t) + (setq buffer-auto-save-file-name + (format "%s%s" + (file-name-as-directory message-autosave-directory) + (file-name-nondirectory buffer-auto-save-file-name))))))) (defun message-fill-yanked-message (&optional justifyp) "Fill the paragraphs of a message yanked into this one. @@ -1065,6 +1101,8 @@ Puts point before the text and mark after. Normally indents each nonblank line ARG spaces (default 3). However, if `message-yank-prefix' is non-nil, insert that prefix on each line. +This function uses `message-cite-function' to do the actual citing. + Just \\[universal-argument] as argument means don't indent, insert no prefix, and don't delete any headers." (interactive "P") @@ -1074,11 +1112,11 @@ prefix, and don't delete any headers." (delete-windows-on message-reply-buffer t) (insert-buffer message-reply-buffer) (funcall message-cite-function) - (exchange-point-and-mark) + (message-exchange-point-and-mark) (unless (bolp) (insert ?\n)) (unless modified - (setq message-checksum (message-checksum)))))) + (setq message-checksum (cons (message-checksum) (buffer-size))))))) (defun message-cite-original () (let ((start (point)) @@ -1209,6 +1247,8 @@ the user from the mailer." (y-or-n-p "No changes in the buffer; really send? "))) ;; Make it possible to undo the coming changes. (undo-boundary) + (let ((inhibit-read-only t)) + (put-text-property (point-min) (point-max) 'read-only nil)) (message-fix-before-sending) (run-hooks 'message-send-hook) (message "Sending...") @@ -1223,8 +1263,8 @@ the user from the mailer." "Already sent message via mail; resend? ")) (message-send-mail arg)))) (message-do-fcc) - (when (fboundp 'mail-hist-put-headers-into-history) - (mail-hist-put-headers-into-history)) + ;;(when (fboundp 'mail-hist-put-headers-into-history) + ;; (mail-hist-put-headers-into-history)) (run-hooks 'message-sent-hook) (message "Sending...done") ;; If buffer has no file, mark it as unmodified and delete autosave. @@ -1284,7 +1324,11 @@ the user from the mailer." (save-excursion (set-buffer tembuf) (erase-buffer) - (insert-buffer-substring mailbuf) + ;; Avoid copying text props. + (insert (format + "%s" (save-excursion + (set-buffer mailbuf) + (buffer-string)))) ;; Remove some headers. (save-restriction (message-narrow-to-headers) @@ -1381,6 +1425,11 @@ the user from the mailer." (funcall message-post-method arg) message-post-method)) (messbuf (current-buffer)) + (message-syntax-checks + (if arg + (cons '(existing-newsgroups . disabled) + message-syntax-checks) + message-syntax-checks)) result) (save-restriction (message-narrow-to-headers) @@ -1388,13 +1437,18 @@ the user from the mailer." (message-generate-headers message-required-news-headers) ;; Let the user do all of the above. (run-hooks 'message-header-hook)) + (message-cleanup-headers) (when (message-check-news-syntax) (unwind-protect (save-excursion (set-buffer tembuf) (buffer-disable-undo (current-buffer)) (erase-buffer) - (insert-buffer-substring messbuf) + ;; Avoid copying text props. + (insert (format + "%s" (save-excursion + (set-buffer messbuf) + (buffer-string)))) ;; Remove some headers. (save-restriction (message-narrow-to-headers) @@ -1490,7 +1544,15 @@ the user from the mailer." (goto-char (point-min)) (insert "Followup-To: " to "\n")) t)) - + ;; Check "Shoot me". + (or (message-check-element 'shoot) + (save-excursion + (if (re-search-forward + "Message-ID.*.i-have-a-misconfigured-system-so-shoot-me" + nil t) + (y-or-n-p + "You appear to have a misconfigured system. Really post? ") + t))) ;; Check for Approved. (or (message-check-element 'approved) (save-excursion @@ -1539,7 +1601,8 @@ the user from the mailer." (if (not hashtb) t (while groups - (unless (boundp (intern (car groups) hashtb)) + (when (and (not (boundp (intern (car groups) hashtb))) + (not (equal (car groups) "poster"))) (push (car groups) errors)) (pop groups)) (if (not errors) @@ -1559,9 +1622,10 @@ the user from the mailer." (while (and headers (not error)) (when (setq header (mail-fetch-field (car headers))) (if (or - (not (string-match - "\\`\\([-.a-zA-Z0-9]+\\)?\\(,[-.a-zA-Z0-9]+\\)*\\'" - header)) + (not + (string-match + "\\`\\([-+_&.a-zA-Z0-9]+\\)?\\(,[-.a-zA-Z0-9]+\\)*\\'" + header)) (memq nil (mapcar (lambda (g) @@ -1577,7 +1641,6 @@ the user from the mailer." (car headers) header))))) ;; Check the From header. (or - (message-check-element 'from) (save-excursion (let* ((case-fold-search t) (from (message-fetch-field "from"))) @@ -1622,8 +1685,8 @@ the user from the mailer." (concat "^" (regexp-quote mail-header-separator) "$")) (forward-line 1) (let ((b (point))) - (or (re-search-forward message-signature-separator nil t) - (goto-char (point-max))) + (goto-char (point-max)) + (re-search-backward message-signature-separator nil t) (beginning-of-line) (or (re-search-backward "[^ \n\t]" b t) (y-or-n-p "Empty article. Really post? "))))) @@ -1644,7 +1707,8 @@ the user from the mailer." ;; Check whether any new text has been added. (or (message-check-element 'new-text) (not message-checksum) - (not (eq (message-checksum) message-checksum)) + (not (and (eq (message-checksum) (car message-checksum)) + (eq (buffer-size) (cdr message-checksum)))) (y-or-n-p "It looks like no new text has been added. Really post? ")) ;; Check the length of the signature. @@ -1652,7 +1716,7 @@ the user from the mailer." (message-check-element 'signature) (progn (goto-char (point-max)) - (if (or (not (re-search-backward "^-- $" nil t)) + (if (or (not (re-search-backward message-signature-separator nil t)) (search-forward message-forward-end-separator nil t)) t (if (> (count-lines (point) (point-max)) 5) @@ -1678,7 +1742,8 @@ the user from the mailer." (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$")) (while (not (eobp)) - (setq sum (logxor sum (following-char))) + (when (not (looking-at "[ \t\n]")) + (setq sum (logxor (ash sum 1) (following-char)))) (forward-char 1))) sum)) @@ -1706,7 +1771,8 @@ the user from the mailer." (if (string-match "^[ \t]*|[ \t]*\\(.*\\)[ \t]*$" file) ;; Pipe the article to the program in question. (call-process-region (point-min) (point-max) shell-file-name - nil nil nil "-c" (match-string 1 file)) + nil nil nil shell-command-switch + (match-string 1 file)) ;; Save the article. (setq file (expand-file-name file)) (unless (file-exists-p (file-name-directory file)) @@ -1771,7 +1837,7 @@ the user from the mailer." (mail-header-subject message-reply-headers)) (message-strip-subject-re psubject)))) "_-_" "")) - "@" (message-make-fqdm) ">")) + "@" (message-make-fqdn) ">")) (defvar message-unique-id-char nil) @@ -1959,34 +2025,37 @@ give as trustworthy answer as possible." (when user-mail-address (nth 1 (mail-extract-address-components user-mail-address)))) -(defun message-make-fqdm () +(defun message-make-fqdn () "Return user's fully qualified domain name." - (let ((system-name (system-name))) + (let ((system-name (system-name)) + (user-mail (message-user-mail-address))) (cond ((string-match "[^.]\\.[^.]" system-name) ;; `system-name' returned the right result. system-name) - ;; We try `user-mail-address' as a backup. - ((string-match "@\\(.*\\)\\'" (message-user-mail-address)) - (match-string 1 user-mail-address)) ;; Try `mail-host-address'. ((and (boundp 'mail-host-address) - mail-host-address) + (stringp mail-host-address) + (string-match "\\." mail-host-address)) mail-host-address) + ;; We try `user-mail-address' as a backup. + ((and (string-match "\\." user-mail) + (string-match "@\\(.*\\)\\'" user-mail)) + (match-string 1 user-mail)) ;; Default to this bogus thing. (t (concat system-name ".i-have-a-misconfigured-system-so-shoot-me"))))) (defun message-make-host-name () "Return the name of the host." - (let ((fqdm (message-make-fqdm))) - (string-match "^[^.]+\\." fqdm) - (substring fqdm 0 (1- (match-end 0))))) + (let ((fqdn (message-make-fqdn))) + (string-match "^[^.]+\\." fqdn) + (substring fqdn 0 (1- (match-end 0))))) (defun message-make-domain () "Return the domain name." (or mail-host-address - (message-make-fqdm))) + (message-make-fqdn))) (defun message-generate-headers (headers) "Prepare article HEADERS. @@ -2126,6 +2195,36 @@ Headers already prepared in the buffer are not modified." ;;; Setting up a message buffer ;;; +(defun message-fill-address (header value) + (save-restriction + (narrow-to-region (point) (point)) + (insert (capitalize (symbol-name header)) + ": " + (if (consp value) (car value) value) + "\n") + (narrow-to-region (point-min) (1- (point-max))) + (let (quoted last) + (goto-char (point-min)) + (while (not (eobp)) + (skip-chars-forward "^,\"" (point-max)) + (if (or (= (following-char) ?,) + (eobp)) + (when (not quoted) + (if (and (> (current-column) 78) + last) + (progn + (save-excursion + (goto-char last) + (insert "\n\t")) + (setq last (1+ (point)))) + (setq last (1+ (point))))) + (setq quoted (not quoted))) + (unless (eobp) + (forward-char 1)))) + (goto-char (point-max)) + (widen) + (forward-line 1))) + (defun message-fill-header (header value) (let ((begin (point)) (fill-column 78) @@ -2168,17 +2267,25 @@ Headers already prepared in the buffer are not modified." (defun message-buffer-name (type &optional to group) "Return a new (unique) buffer name based on TYPE and TO." - (if message-generate-new-buffers - (generate-new-buffer-name - (concat "*" type - (if to - (concat " to " - (or (car (mail-extract-address-components to)) - to) "") - "") - (if group (concat " on " group) "") - "*")) - (format "*%s message*" type))) + (cond + ;; Check whether `message-generate-new-buffers' is a function, + ;; and if so, call it. + ((message-functionp message-generate-new-buffers) + (funcall message-generate-new-buffers type to group)) + ;; Generate a new buffer name The Message Way. + (message-generate-new-buffers + (generate-new-buffer-name + (concat "*" type + (if to + (concat " to " + (or (car (mail-extract-address-components to)) + to) "") + "") + (if (and group (not (string= group ""))) (concat " on " group) "") + "*"))) + ;; Use standard name. + (t + (format "*%s message*" type)))) (defun message-pop-to-buffer (name) "Pop to buffer NAME, and warn if it already exists and is modified." @@ -2200,23 +2307,31 @@ Headers already prepared in the buffer are not modified." ;; We might have sent this buffer already. Delete it from the ;; list of buffers. (setq message-buffer-list (delq (current-buffer) message-buffer-list)) - (when (and message-max-buffers - (>= (length message-buffer-list) message-max-buffers)) + (while (and message-max-buffers + (>= (length message-buffer-list) message-max-buffers)) ;; Kill the oldest buffer -- unless it has been changed. (let ((buffer (pop message-buffer-list))) (when (and (buffer-name buffer) (not (buffer-modified-p buffer))) (kill-buffer buffer)))) ;; Rename the buffer. - (when (string-match "\\`\\*" (buffer-name)) - (rename-buffer - (concat "*sent " (substring (buffer-name) (match-end 0))) t)) + (if message-send-rename-function + (funcall message-send-rename-function) + (when (string-match "\\`\\*" (buffer-name)) + (rename-buffer + (concat "*sent " (substring (buffer-name) (match-end 0))) t))) ;; Push the current buffer onto the list. (when message-max-buffers (setq message-buffer-list (nconc message-buffer-list (list (current-buffer)))))) +(defvar mc-modes-alist) (defun message-setup (headers &optional replybuffer actions) + (when (and (boundp 'mc-modes-alist) + (not (assq 'message-mode mc-modes-alist))) + (push '(message-mode (encrypt . mc-encrypt-message) + (sign . mc-sign-message)) + mc-modes-alist)) (when actions (setq message-send-actions actions)) (setq message-reply-buffer replybuffer) @@ -2231,14 +2346,14 @@ Headers already prepared in the buffer are not modified." (pop h)) alist) headers) - (forward-line -1) + (delete-region (point) (progn (forward-line -1) (point))) (when message-default-headers (insert message-default-headers)) (put-text-property (point) (progn (insert mail-header-separator "\n") - (point)) + (1- (point))) 'read-only nil) (forward-line -1) (when (message-news-p) @@ -2257,6 +2372,7 @@ Headers already prepared in the buffer are not modified." (delq 'Lines (delq 'Subject (copy-sequence message-required-mail-headers)))))) + (run-hooks 'message-signature-setup-hook) (message-insert-signature) (message-set-auto-save-file-name) (save-restriction @@ -2313,6 +2429,7 @@ Headers already prepared in the buffer are not modified." (let ((cur (current-buffer)) from subject date reply-to to cc references message-id follow-to + (inhibit-point-motion-hooks t) mct never-mct gnus-warning) (save-restriction (narrow-to-region @@ -2367,10 +2484,9 @@ Headers already prepared in the buffer are not modified." (message-set-work-buffer) (unless never-mct (insert (or reply-to from ""))) - (insert - (if (bolp) "" ", ") (or to "") - (if mct (concat (if (bolp) "" ", ") mct) "") - (if cc (concat (if (bolp) "" ", ") cc) "")) + (insert (if (bolp) "" ", ") (or to "")) + (insert (if mct (concat (if (bolp) "" ", ") mct) "")) + (insert (if cc (concat (if (bolp) "" ", ") cc) "")) ;; Remove addresses that match `rmail-dont-reply-to-names'. (insert (prog1 (rmail-dont-reply-to (buffer-string)) (erase-buffer))) @@ -2379,7 +2495,7 @@ Headers already prepared in the buffer are not modified." (mapcar (lambda (addr) (cons (mail-strip-quoted-names addr) addr)) - (nreverse (mail-parse-comma-list)))) + (message-tokenize-header (buffer-string)))) (let ((s ccalist)) (while s (setq ccalist (delq (assoc (car (pop s)) s) ccalist))))) @@ -2390,7 +2506,9 @@ Headers already prepared in the buffer are not modified." follow-to))))) (widen)) - (message-pop-to-buffer (message-buffer-name "reply" from)) + (message-pop-to-buffer (message-buffer-name + (if wide "wide reply" "reply") from + (if wide to-address nil))) (setq message-reply-headers (vector 0 subject from date message-id references 0 0 "")) @@ -2415,6 +2533,7 @@ Headers already prepared in the buffer are not modified." (let ((cur (current-buffer)) from subject date reply-to mct references message-id follow-to + (inhibit-point-motion-hooks t) followup-to distribution newsgroups gnus-warning) (save-restriction (narrow-to-region @@ -2710,7 +2829,7 @@ you." ;; We remove everything before the bounced mail. (delete-region (point-min) - (if (re-search-forward "[^ \t]*:" nil t) + (if (re-search-forward "^[^ \n\t]+:" nil t) (match-beginning 0) (point))) (save-restriction @@ -2808,6 +2927,8 @@ which specify the range to operate on." (if (eq (following-char) (char-after (- (point) 2))) (delete-char -2)))))) +(defalias 'message-exchange-point-and-mark 'exchange-point-and-mark) + ;; Support for toolbar (when (string-match "XEmacs\\|Lucid" emacs-version) (require 'messagexmas)) @@ -2863,7 +2984,7 @@ Do a `tab-to-tab-stop' if not in those headers." ;;; Help stuff. (defmacro message-y-or-n-p (question show &rest text) - "Ask QUESTION, displaying the rest of the arguments in a temporary buffer." + "Ask QUESTION, displaying the rest of the arguments in a temp. buffer if SHOW" `(message-talkative-question 'y-or-n-p ,question ,show ,@text)) (defun message-talkative-question (ask question show &rest text) @@ -2889,6 +3010,8 @@ The following arguments may contain lists of values." (list (list list)))) +(run-hooks 'message-load-hook) + (provide 'message) ;;; message.el ends here