Function: ispell-message
ispell-message is an autoloaded, interactive and byte-compiled
function defined in ispell.el.gz.
Signature
(ispell-message)
Documentation
Check the spelling of a mail message or news post.
Don't check spelling of message headers except the Subject field. Don't check included messages.
To abort spell checking of a message region and send the message anyway,
use the \x command. (Any subsequent regions will be checked.)
The \X command aborts sending the message so that you can edit the buffer.
To spell-check whenever a message is sent, include the appropriate lines
in your init file:
(add-hook 'message-send-hook #'ispell-message) ;; GNUS 5
(add-hook 'news-inews-hook #'ispell-message) ;; GNUS 4
(add-hook 'mail-send-hook #'ispell-message)
(add-hook 'mh-before-send-letter-hook #'ispell-message)
You can bind this to a key in GNUS or mail by adding to
news-reply-mode-hook or mail-mode-hook the following lambda expression:
(lambda () (local-set-key "\\C-ci" 'ispell-message))
Probably introduced at or before Emacs version 19.23.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/textmodes/ispell.el.gz
;;;###autoload
(defun ispell-message ()
"Check the spelling of a mail message or news post.
Don't check spelling of message headers except the Subject field.
Don't check included messages.
To abort spell checking of a message region and send the message anyway,
use the \\`x' command. (Any subsequent regions will be checked.)
The \\`X' command aborts sending the message so that you can edit the buffer.
To spell-check whenever a message is sent, include the appropriate lines
in your init file:
(add-hook \\='message-send-hook #\\='ispell-message) ;; GNUS 5
(add-hook \\='news-inews-hook #\\='ispell-message) ;; GNUS 4
(add-hook \\='mail-send-hook #\\='ispell-message)
(add-hook \\='mh-before-send-letter-hook #\\='ispell-message)
You can bind this to a key in GNUS or mail by adding to
`news-reply-mode-hook' or `mail-mode-hook' the following lambda expression:
(lambda () (local-set-key \"\\C-ci\" \\='ispell-message))"
(interactive)
(save-excursion
(goto-char (point-min))
(let* (boundary mimep
(ispell-skip-region-alist-save ispell-skip-region-alist)
;; Nil when message came from outside (eg calling Emacs as editor)
;; Non-nil marker of end of headers.
(internal-messagep
(re-search-forward
(concat "^" (regexp-quote mail-header-separator) "$") nil t))
(end-of-headers ; Start of body.
(copy-marker
(or internal-messagep
(re-search-forward "^$" nil t)
(point-min))))
(limit (copy-marker ; End of region we will spell check.
(cond
((not ispell-message-text-end) (point-max))
((char-or-string-p ispell-message-text-end)
(if (re-search-forward ispell-message-text-end nil t)
(match-beginning 0)
(point-max)))
(t (min (point-max) (funcall ispell-message-text-end))))))
(default-prefix ; Vanilla cite prefix (just used for cite-regexp)
(if mail-yank-prefix
(ispell-non-empty-string mail-yank-prefix)
" \\|\t"))
(cite-regexp ;Prefix of quoted text
(cond
((functionp 'sc-cite-regexp) ; supercite >= 3.0
(with-no-warnings
(concat "\\(" (sc-cite-regexp) "\\)" "\\|"
(ispell-non-empty-string sc-reference-tag-string))))
((equal major-mode 'message-mode) ; GNUS >= 5
(concat "In article <" "\\|"
"[^,;&+=\n]+ <[^,;&+=]+> writes:" "\\|"
(with-no-warnings message-cite-prefix-regexp)
"\\|"
default-prefix))
((equal major-mode 'mh-letter-mode) ; mh mail message
(concat "[^,;&+=\n]+ writes:" "\\|"
(with-no-warnings
(ispell-non-empty-string mh-ins-buf-prefix))))
((not internal-messagep) ; Assume nn sent us this message.
(concat "In [a-zA-Z.]+ you write:" "\\|"
"In <[^,;&+=]+> [^,;&+=]+ writes:" "\\|"
" *> *"))
((boundp 'vm-included-text-prefix) ; VM mail message
(concat "[^,;&+=\n]+ writes:" "\\|"
(ispell-non-empty-string vm-included-text-prefix)))
(t default-prefix)))
(ispell-skip-region-alist
(cons (list (ispell--make-filename-or-URL-re))
(cons (list (concat "^\\(" cite-regexp "\\)")
(function forward-line))
ispell-skip-region-alist)))
(old-case-fold-search case-fold-search)
(dictionary-alist ispell-message-dictionary-alist)
(ispell-checking-message t))
;; Select dictionary for message
(or (local-variable-p 'ispell-local-dictionary (current-buffer))
(while dictionary-alist
(goto-char (point-min))
(if (re-search-forward (car (car dictionary-alist))
end-of-headers t)
(setq ispell-local-dictionary (cdr (car dictionary-alist))
dictionary-alist nil)
(setq dictionary-alist (cdr dictionary-alist)))))
(unwind-protect
(progn
;; Spell check any original Subject:
(goto-char (point-min))
(setq case-fold-search t
mimep (re-search-forward "MIME-Version:" end-of-headers t))
(goto-char (point-min))
(if (re-search-forward "^Subject: *" end-of-headers t)
(progn
(goto-char (match-end 0))
;; Don't spell-check Subject if it comes from a
;; received message: "Re:" indicates this is a reply
;; to someone else's message, "[...]" indicates this
;; is a subject of a forwarded message.
(if (and (not (looking-at ".*\\<Re\\>"))
(not (looking-at "\\[")))
(progn
(setq case-fold-search old-case-fold-search)
(ispell-region (point)
(progn ;Tab-initiated continuation lns.
(end-of-line)
(while (looking-at "\n[ \t]")
(end-of-line 2))
(point)))))))
(if mimep
(progn
(goto-char (point-min))
(setq boundary (ispell-mime-multipartp end-of-headers))))
;; Adjust message limit to MIME message if necessary.
(and boundary
(re-search-forward (concat boundary "--") nil t)
(re-search-backward boundary nil t)
(< (point) (marker-position limit))
(set-marker limit (point)))
(goto-char (point-min))
;; Select type or skip checking if this is a non-multipart message
;; Point moved to end of buffer if region is encoded.
(when (and mimep (not boundary))
(goto-char (point-min))
(re-search-forward "Content-[^ \t]*:" end-of-headers t)
(forward-line -1) ; following fn starts one line above
(ispell-mime-skip-part nil)
;; if message-text-end region, limit may be less than point.
(if (> (point) limit)
(set-marker limit (point))))
(goto-char (max end-of-headers (point)))
(forward-line 1)
(setq case-fold-search old-case-fold-search)
;; Define MIME regions to skip.
(if boundary
(setq ispell-checking-message
(list (list boundary 'ispell-mime-skip-part boundary))))
(ispell-region (point) limit))
(set-marker end-of-headers nil)
(set-marker limit nil)
(setq ispell-skip-region-alist ispell-skip-region-alist-save
ispell-skip-html nil
case-fold-search old-case-fold-search)))))