[net.emacs] gnuemacs spell modified to maintain local dictionary

morgan@fluke.UUCP (Bruce Eckel) (01/29/86)

	Well, it's not exactly pretty, but it *does* work.  I messed
around with the lisp code for the spell function in gnuemacs, trying
various different (fancier) ways to create a local dictionary, all the
while messing myself up by sorting a file onto itself, thus destroying
it (sort -u file > file).  By the time I figured this out, I had
simplified the function to a shell script.  But it works, and you can
see one way of writing your shell scripts into gnuemacs (yeah, you
could write the script and then call it from within the editor, but
that's another level of indirection for me, and I don't trust
computers all that much anyway ... )

	To have this file autoloaded when you invoke the spell
function, insert into your .emacs file the line:

(autoload  'spell-buffer "myspell.el")   ;;This spell is modified to
					 ;;allow a local dictionary
					 ;;called local-dictionary

And put the following function into a file called myspell.el (or
byte-compile it) somewhere in your EMACSLOADPATH.

	All I have really done is changed the invocation of spell to
"spell -d local-dictionary" in each case, and added the function at
the end.

__________________________________________________________________

;; Bruce Eckel's mung onto:
;; Spelling correction interface for Emacs.
;; Copyright (C) 1985 Richard M. Stallman.

;; This file is part of GNU Emacs.

;; GNU Emacs is distributed in the hope that it will be useful,
;; but without any warranty.  No author or distributor
;; accepts responsibility to anyone for the consequences of using it
;; or for whether it serves any particular purpose or works at all,
;; unless he says so in writing.

;; Everyone is granted permission to copy, modify and redistribute
;; GNU Emacs, but only under the conditions described in the
;; document "GNU Emacs copying permission notice".   An exact copy
;; of the document is supposed to have been given to you along with
;; GNU Emacs so that you can know how you may redistribute it all.
;; It should be in a file named COPYING.  Among other things, the
;; copyright notice and this notice must be preserved on all copies.


(defun spell-buffer ()
  "Check spelling of every word in the buffer.
For each incorrect word, you are asked for the correct spelling
and then put into a query-replace to fix some or all occurrences.
If you do not want to change a word, just give the same word
as its \"correct\" spelling; then the query replace is skipped.
Modified by BE to allow local dictionary called local-dictionary"
  (interactive)
  (spell-region (dot-min) (dot-max) "buffer"))

(defun spell-word ()
  "Check spelling of word at or after dot.
If it is not correct, ask user for the correct spelling
and query-replace the entire buffer to substitute it."
  (interactive)
  (let (beg end)
    (save-excursion
     (forward-word 1)
     (setq end (dot))
     (forward-word -1)
     (setq beg (dot)))
    (spell-region beg end (buffer-substring beg end))))

(defun spell-region (start end &optional description)
  "Like spell-buffer but applies only to region.
From program, applies from START to END."
  (interactive "r")
  (let ((buf (get-buffer-create " *temp*")))
    (save-excursion
     (set-buffer buf)
     (widen)
     (erase-buffer))
    (message "Checking spelling of %s..." (or description "region"))
    (if (= ?\n (char-after (1- end)))
	(call-process-region start end "spell"
			     nil buf nil "-d" "local-dictionary")
      (let ((oldbuf (current-buffer)))
	(save-excursion
	 (set-buffer buf)
	 (insert-buffer-substring oldbuf start end)
	 (insert ?\n)
	 (call-process-region (dot-min) (dot-max) "spell"
			      t buf nil "-d" "local-dictionary"))))
    (message "Checking spelling of %s...%s"
	     (or description "region")
	     (if (save-excursion
		  (set-buffer buf)
		  (> (buffer-size) 0))
		 "not correct"
	       "correct"))
    (let (word newword
	  (case-fold-search t)
	  (case-replace t))
      (while (save-excursion
	      (set-buffer buf)
	      (> (buffer-size) 0))
	(save-excursion
	 (set-buffer buf)
	 (goto-char (dot-min))
	 (setq word (buffer-substring (dot)
				      (progn (end-of-line) (dot))))
	 (forward-char 1)
	 (delete-region (dot-min) (dot))
	 (setq newword (read-input (concat "Replacement for " word ": ")
				   word))
	 (flush-lines (concat "^" (regexp-quote word) "$")))
	(if (not (equal word newword))
	    (progn
	     (goto-char (dot-min))
	     (query-replace-regexp (concat "\\b" (regexp-quote word) "\\b")
				   newword)))))))


(defun spell-string (string)
  "Check spelling of string supplied as argument."
  (interactive "sSpell string: ")
  (let ((buf (get-buffer-create " *temp*")))
    (save-excursion
     (set-buffer buf)
     (widen)
     (erase-buffer)
     (insert string "\n")
     (call-process-region (dot-min) (dot-max) "spell"
			  t t nil "-d" "local-dictionary")
     (if (= 0 (buffer-size))
	 (message "%s is correct" string)
       (goto-char (dot-min))
       (while (search-forward "\n" nil t)
	 (replace-match " "))
       (message "%sincorrect" (buffer-substring 1 (dot-max)))))))

(defun update-dictionary ()
  "update local dictionary using new words in this buffer.  Use only
after spelling the buffer.  A file called local-dictionary.ascii is created
by running this program.  Then a hashed list is created called
local-dictionary which is used by the spell programs.  If you are in a
directory without a local dictionary, run this command first within an
empty buffer.  BE"

  (interactive)
  (save-buffer)
  (shell-command (concat
		  "spell " buffer-file-name 
		  " >> local-dictionary.ascii ;"
		  " sort -u local-dictionary.ascii " 
		  " > temp-dict ;"
		  " mv temp-dict local-dictionary.ascii ; "
		  " cat local-dictionary.ascii"
		  " | spellin /usr/dict/hlista "
		  " > local-dictionary")
		 )
  (message "local dictionary updated")
)

	Bruce Eckel <morgan>
	ARPA: fluke!morgan@uw-beaver
	UUCP: {uw-beaver, sun, allegra, sb6, lbl-csam}!fluke!morgan
-- 
	Bruce Eckel <morgan>
	ARPA: fluke!morgan@uw-beaver
	UUCP: {uw-beaver, sun, allegra, sb6, lbl-csam}!fluke!morgan