1;;; spell.el --- spelling correction interface for Emacs 2 3;; Copyright (C) 1985, 2001, 2002, 2003, 2004, 2005, 4;; 2006, 2007 Free Software Foundation, Inc. 5 6;; Maintainer: FSF 7;; Keywords: wp, unix 8 9;; This file is part of GNU Emacs. 10 11;; GNU Emacs is free software; you can redistribute it and/or modify 12;; it under the terms of the GNU General Public License as published by 13;; the Free Software Foundation; either version 2, or (at your option) 14;; any later version. 15 16;; GNU Emacs is distributed in the hope that it will be useful, 17;; but WITHOUT ANY WARRANTY; without even the implied warranty of 18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19;; GNU General Public License for more details. 20 21;; You should have received a copy of the GNU General Public License 22;; along with GNU Emacs; see the file COPYING. If not, write to the 23;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 24;; Boston, MA 02110-1301, USA. 25 26;;; Commentary: 27 28;; This mode provides an Emacs interface to the UNIX spell(1) program. 29;; Entry points are `spell-buffer', `spell-word', `spell-region' and 30;; `spell-string'. 31 32;; See also ispell.el for an interface to the ispell program. 33 34;;; Code: 35 36(defgroup spell nil 37 "Interface to the UNIX spell(1) program." 38 :prefix "spell-" 39 :group 'applications) 40 41(defcustom spell-command "spell" 42 "*Command to run the spell program." 43 :type 'string 44 :group 'spell) 45 46(defcustom spell-filter nil 47 "*Filter function to process text before passing it to spell program. 48This function might remove text-processor commands. 49nil means don't alter the text before checking it." 50 :type '(choice (const nil) function) 51 :group 'spell) 52 53;;;###autoload 54(put 'spell-filter 'risky-local-variable t) 55 56;;;###autoload 57(defun spell-buffer () 58 "Check spelling of every word in the buffer. 59For each incorrect word, you are asked for the correct spelling 60and then put into a query-replace to fix some or all occurrences. 61If you do not want to change a word, just give the same word 62as its \"correct\" spelling; then the query replace is skipped." 63 (interactive) 64 (spell-region (point-min) (point-max) "buffer")) 65 66;;;###autoload 67(defun spell-word () 68 "Check spelling of word at or before point. 69If it is not correct, ask user for the correct spelling 70and `query-replace' the entire buffer to substitute it." 71 (interactive) 72 (let (beg end spell-filter) 73 (save-excursion 74 (if (not (looking-at "\\<")) 75 (forward-word -1)) 76 (setq beg (point)) 77 (forward-word 1) 78 (setq end (point))) 79 (spell-region beg end (buffer-substring beg end)))) 80 81;;;###autoload 82(defun spell-region (start end &optional description) 83 "Like `spell-buffer' but applies only to region. 84Used in a program, applies from START to END. 85DESCRIPTION is an optional string naming the unit being checked: 86for example, \"word\"." 87 (interactive "r") 88 (let ((filter spell-filter) 89 (buf (get-buffer-create " *temp*"))) 90 (save-excursion 91 (set-buffer buf) 92 (widen) 93 (erase-buffer)) 94 (message "Checking spelling of %s..." (or description "region")) 95 (if (and (null filter) (= ?\n (char-after (1- end)))) 96 (if (string= "spell" spell-command) 97 (call-process-region start end "spell" nil buf) 98 (call-process-region start end shell-file-name 99 nil buf nil "-c" spell-command)) 100 (let ((oldbuf (current-buffer))) 101 (save-excursion 102 (set-buffer buf) 103 (insert-buffer-substring oldbuf start end) 104 (or (bolp) (insert ?\n)) 105 (if filter (funcall filter)) 106 (if (string= "spell" spell-command) 107 (call-process-region (point-min) (point-max) "spell" t buf) 108 (call-process-region (point-min) (point-max) shell-file-name 109 t buf nil "-c" spell-command))))) 110 (message "Checking spelling of %s...%s" 111 (or description "region") 112 (if (save-excursion 113 (set-buffer buf) 114 (> (buffer-size) 0)) 115 "not correct" 116 "correct")) 117 (let (word newword 118 (case-fold-search t) 119 (case-replace t)) 120 (while (save-excursion 121 (set-buffer buf) 122 (> (buffer-size) 0)) 123 (save-excursion 124 (set-buffer buf) 125 (goto-char (point-min)) 126 (setq word (downcase 127 (buffer-substring (point) 128 (progn (end-of-line) (point))))) 129 (forward-char 1) 130 (delete-region (point-min) (point)) 131 (setq newword 132 (read-string (concat "`" word 133 "' not recognized; edit a replacement: ") 134 word)) 135 (flush-lines (concat "^" (regexp-quote word) "$"))) 136 (if (not (equal word newword)) 137 (progn 138 (goto-char (point-min)) 139 (query-replace-regexp (concat "\\b" (regexp-quote word) "\\b") 140 newword))))))) 141 142 143;;;###autoload 144(defun spell-string (string) 145 "Check spelling of string supplied as argument." 146 (interactive "sSpell string: ") 147 (let ((buf (get-buffer-create " *temp*"))) 148 (save-excursion 149 (set-buffer buf) 150 (widen) 151 (erase-buffer) 152 (insert string "\n") 153 (if (string= "spell" spell-command) 154 (call-process-region (point-min) (point-max) "spell" 155 t t) 156 (call-process-region (point-min) (point-max) shell-file-name 157 t t nil "-c" spell-command)) 158 (if (= 0 (buffer-size)) 159 (message "%s is correct" string) 160 (goto-char (point-min)) 161 (while (search-forward "\n" nil t) 162 (replace-match " ")) 163 (message "%sincorrect" (buffer-substring 1 (point-max))))))) 164 165(provide 'spell) 166 167;;; arch-tag: 7eabb848-9c76-431a-bcdb-0e0592d2db04 168;;; spell.el ends here 169