;;; ispell.el --- Interface to International Ispell Version 3.1
-;; Copyright (C) 1994, 1995, 1997, 1998 Free Software Foundation, Inc.
+;; Copyright (C) 1994, 1995, 1997, 1998, 1999 Free Software Foundation, Inc.
;; Authors : Ken Stevens <k.stevens@ieee.org>
-;; Stevens Mod Date: Mon Nov 30 20:32:48 PST 1998
-;; Stevens Revision: 3.1
+;; Stevens Mod Date: Fri May 7 14:25:14 PDT 1999
+;; Stevens Revision: 3.2
;; Status : Release with 3.1.12+ ispell.
;; Bug Reports : ispell-el-bugs@itcorp.com
;; Web Site : http://kdstevens.com/~stevens/ispell-page.html
;; INSTRUCTIONS
-;; This code contains a section of user-settable variables that you should
-;; inspect prior to installation. Look past the end of the history list.
-;; Set them up for your locale and the preferences of the majority of the
-;; users. Otherwise the users may need to set a number of variables
+;; This code contains a section of user-settable variables that you
+;; should inspect prior to installation. Look past the end of the history
+;; list. Set them up for your locale and the preferences of the majority
+;; of the users. Otherwise the users may need to set a number of variables
;; themselves.
-;; You particularly may want to change the default dictionary for your
+;; You particularly may want to change the default dictionary for your
;; country and language.
+;; Most dictionary changes should be made in this file so all users can
+;; enjoy them. Local or modified dictionaries are supported in your .emacs
+;; file. Modify the variable `ispell-local-dictionary-alist' to include
+;; these dictionaries, and they will be installed when ispell.el is loaded.
;; Depending on the mail system you use, you may want to include these:
-
;; (add-hook 'news-inews-hook 'ispell-message)
;; (add-hook 'mail-send-hook 'ispell-message)
;; (add-hook 'mh-before-send-letter-hook 'ispell-message)
-
-;; Ispell has a TeX parser and a nroff parser (the default).
+;; Ispell has a TeX parser and a nroff parser (the default).
;; The parsing is controlled by the variable ispell-parser. Currently
;; it is just a "toggle" between TeX and nroff, but if more parsers are
;; added it will be updated. See the variable description for more info.
;; `ispell-message' contains some custom skipping code for e-mail messages.
;; BUGS:
-;; Accepting definitions in latex mode can mess up math mode skipping...
+;; Accepting word definitions in latex mode can mess up math mode skipping.
;; On some versions of emacs, growing the minibuffer fails.
-;; Autoloading ispell can result in problems if you need to use a local or
-;; modified dictionary. Place the following in your .emacs file to
-;; override the autoload definitions:
-;; (setq ispell-dictionary-alist (cons '(dictionary ...)
-;; ispell-dictionary-alist))
-;; (setq ispell-menu-map nil)
-;; (setq ispell-dictionary-alist-override t)
-;; (load-library "ispell")
+;; see `ispell-help-in-bufferp'.
+
+;; HISTORY
+
+;; Modifications made in latest versions:
+
+;; Revision 3.2 1999/5/7 14:25:14 kss
+;; Accept ispell versions 3.X.Y where X>=1
+;; fine tuned latex region skipping. Fixed bug in ispell-word that did not
+;; point in right place on words < 2 chars. Simplified ispell-minor-mode.
+;; Fixed bug in TeX parsing when math commands are in the comments.
+;; Removed calls to `when' macro.
+
+;; Revision 3.1 1998/12/1 13:21:52 kss
+;; Improved and fixed customize support.
+;; Improved and fixed comments in variables and messages.
+;; A coding system is now required for all languages.
+;; casechars improved for castellano, castellano8, and norsk dictionaries.
+;; Dictionary norsk7-tex removed. Dictionary polish added.
+;; Dictionaries redefined at load-time to support dictionary changes.
+;; Menu redefined at load time to support dictionary changes.
+;; ispell-check-version added as an alias for `check-ispell-version'.
+;; Spelling suggestions returned in order generated by ispell.
+;; Small bug fixed in matching ispell error messages.
+;; Robustness added to ensure `case-fold-search' doesn't get redefined.
+;; Fixed bug that didn't respect case of word in `ispell-complete-word'.
+;; Multibyte character coding support added for process interactions.
+;; Ensure ispell process has terminated before starting new process.
+;; This can otherwise confuse process filters and hang ispell.
+;; Improved skipping support for sgml.
+;; Fixed bug using ^M rather than \r in `ispell-minor-check'.
+;; Improved message reference matching in `ispell-message'.
+;; Fixed bug in returning to nroff mode from tex mode.
;;; Code:
;;; **********************************************************************
-;;; ******* THIS FILE IS WRITTEN FOR ISPELL VERSION 3.1
-;;; Code:
+;;; ******* THIS FILE IS WRITTEN FOR ISPELL VERSION 3.1+
(defcustom ispell-highlight-p 'block
"*Highlight spelling errors when non-nil.
:type '(repeat string)
:group 'ispell)
+
+;; Define definitions here only for personal dictionaries.
+(defcustom ispell-local-dictionary-alist nil
+ "*Contains local or customized dictionary definitions.
+See `ispell-dictionary-alist'."
+ :type '(repeat (list (choice :tag "Dictionary"
+ (string :tag "Dictionary name")
+ (const :tag "default" nil))
+ (regexp :tag "Case characters")
+ (regexp :tag "Non case characters")
+ (regexp :tag "Other characters")
+ (boolean :tag "Many other characters")
+ (repeat :tag "Ispell command line args"
+ (string :tag "Arg"))
+ (choice :tag "Extended character mode"
+ (const "~tex") (const "~plaintex")
+ (const "~nroff") (const "~list")
+ (const "~latin1") (const "~latin3")
+ (const :tag "default" nil))
+ (choice :tag "Character set"
+ (const iso-8859-1)
+ (const iso-8859-2))))
+ :group 'ispell)
+
+
;;; split dictionary so line length is smaller in loaddefs.el
;;; First part of dictionary, shortened for loaddefs.el
ispell-dictionary-alist-1
'((nil ; default (English.aff)
"[A-Za-z]" "[^A-Za-z]" "[']" nil ("-B") nil iso-8859-1)
- ("american" ; yankee English
+ ("american" ; Yankee English
"[A-Za-z]" "[^A-Za-z]" "[']" nil ("-B") nil iso-8859-1)
("british" ; British version
"[A-Za-z]" "[^A-Za-z]" "[']" nil ("-B" "-d" "british") nil iso-8859-1)
;;;###autoload
(setq
ispell-dictionary-alist-6
- '(("russian" ; russian.aff (KOI8-R charset)
+ '(("russian" ; Russian.aff (KOI8-R charset)
"[\341\342\367\347\344\345\263\366\372\351\352\353\354\355\356\357\360\362\363\364\365\346\350\343\376\373\375\370\371\377\374\340\361\301\302\327\307\304\305\243\326\332\311\312\313\314\315\316\317\320\322\323\324\325\306\310\303\336\333\335\330\331\337\334\300\321]"
"[^\341\342\367\347\344\345\263\366\372\351\352\353\354\355\356\357\360\362\363\364\365\346\350\343\376\373\375\370\371\377\374\340\361\301\302\327\307\304\305\243\326\332\311\312\313\314\315\316\317\320\322\323\324\325\306\310\303\336\333\335\330\331\337\334\300\321]"
"[']" t ("-C" "-d" "russian") "~latin1" iso-8859-1)
;;;###autoload
(defcustom ispell-dictionary-alist
- (append ispell-dictionary-alist-1 ispell-dictionary-alist-2
+ (append ispell-local-dictionary-alist ; dictionary customizations
+ ispell-dictionary-alist-1 ispell-dictionary-alist-2
ispell-dictionary-alist-3 ispell-dictionary-alist-4
ispell-dictionary-alist-5 ispell-dictionary-alist-6)
"An alist of dictionaries and their associated parameters.
(const iso-8859-2))))
:group 'ispell)
-(defvar ispell-dictionary-alist-override nil)
-
;;; update the dictionaries at load time
-(unless ispell-dictionary-alist-override
- (setq ispell-dictionary-alist
- (append ispell-dictionary-alist-1 ispell-dictionary-alist-2
- ispell-dictionary-alist-3 ispell-dictionary-alist-4
- ispell-dictionary-alist-5 ispell-dictionary-alist-6)))
+(setq ispell-dictionary-alist
+ (append ispell-local-dictionary-alist ; dictionary customizations
+ ispell-dictionary-alist-1 ispell-dictionary-alist-2
+ ispell-dictionary-alist-3 ispell-dictionary-alist-4
+ ispell-dictionary-alist-5 ispell-dictionary-alist-6))
;;; The preparation of the menu bar menu must be autoloaded
;;; because otherwise this file gets autoloaded every time Emacs starts
;;; The version must be 3.1 or greater for this version of ispell.el
;;; There is an incompatibility between version 3.1.12 and lower versions.
-(defconst ispell-required-version '("3.1." 12)
+(defconst ispell-required-version '(3 1 12)
"Ispell versions with which this version of ispell.el is known to work.")
(defvar ispell-offset -1
"Offset that maps protocol differences between ispell 3.1 versions.")
("\\(/\\|\\(\\(\\w\\|-\\)+[.:@]\\)\\)\\(\\w\\|-\\)*\\([.:/@]+\\(\\w\\|-\\|~\\)+\\)+")
;; This is a pretty complex regexp. It can be simplified to the following:
;; "\\(\\w\\|-\\)*\\([.:/@]+\\(\\w\\|-\\|~\\)+\\)+"
- ;; but some valid text will be skipped, e.g. "his/herr". This could be
+ ;; but some valid text will be skipped, e.g. "his/her". This could be
;; fixed up (at the expense of a moderately more complex regexp)
;; by not allowing "/" to be the character which triggers the
;; identification of the computer name, e.g.:
;;;###autoload
(defvar ispell-tex-skip-alists
- '((("%\\[" . "%\\]")
+ '((;;("%\\[" . "%\\]") ; AMStex block comment...
;; All the standard LaTeX keywords from L. Lamport's guide:
;; \cite, \hspace, \hspace*, \hyphenation, \include, \includeonly, \input,
;; \label, \nocite, \rule (in ispell - rest included here)
("\\\\addcontentsline" ispell-tex-arg-end 2)
("\\\\add\\(tocontents\\|vspace\\)" ispell-tex-arg-end)
("\\\\\\([aA]lph\\|arabic\\)" ispell-tex-arg-end)
- ("\\\\author" ispell-tex-arg-end)
+ ;;("\\\\author" ispell-tex-arg-end)
("\\\\bibliographystyle" ispell-tex-arg-end)
("\\\\makebox" ispell-tex-arg-end 0)
;;("\\\\epsfig" ispell-tex-arg-end)
word (car word))
;; now check spelling of word if it has 3 or more characters.
- (when (> (length word) 2)
+ (cond
+ ((> (length word) 2)
(or quietly
(message "Checking spelling of %s..."
(funcall ispell-format-word word)))
(ispell-region start end)))))
(if (get-buffer ispell-choices-buffer)
(kill-buffer ispell-choices-buffer))))
- (goto-char cursor-location) ; return to original location
(ispell-pdict-save ispell-silently-savep)
- (if ispell-quit (setq ispell-quit nil))))))
+ (if ispell-quit (setq ispell-quit nil))))
+ (goto-char cursor-location)))) ; return to original location
(defun ispell-get-word (following &optional extra-otherchars)
(if (or ispell-pdict-modified-p force-save)
(if (or no-query (y-or-n-p "Personal dictionary modified. Save? "))
(progn
- (process-send-string ispell-process "#\n")
+ (process-send-string ispell-process "#\n") ; save dictionary
(message "Personal dictionary saved."))))
;; unassert variable, even if not saved to avoid questioning.
(setq ispell-pdict-modified-p nil))
(ispell-highlight-spelling-error start end nil
'block))
t) ; reselect from new choices
- ((= char ?u)
+ ((= char ?u) ; insert lowercase into dictionary
(process-send-string ispell-process
(concat "*" (downcase word) "\n"))
(setq ispell-pdict-modified-p '(t)) ; dictionary modified!
(save-excursion
(let ((oldot (save-excursion (forward-line -1) (point)))
(top (save-excursion (move-to-window-line height) (point))))
- ;; If line above old point (line starting at olddot) would be
+ ;; If line above old point (line starting at oldot) would be
;; hidden by new window, scroll it to just below new win
;; otherwise set top line of other win so it doesn't scroll.
(if (< oldot top) (setq top oldot))
(setq case-fold-search t
status (re-search-forward
(concat "\\<\\("
- (regexp-quote (car ispell-required-version))
- "\\)\\([0-9]*\\)\\>")
+ (format "%d" (car ispell-required-version))
+ "\\)\\.\\([0-9]*\\)\\.\\([0-9]*\\)\\>")
nil t)
case-fold-search case-fold-search-val)
- (if (not status)
- (error "%s version 3 release %s%s or greater is required"
+ (if (or (not status) ; major version mismatch
+ (< (car (read-from-string (buffer-substring-no-properties
+ (match-beginning 2) (match-end 2))))
+ (car (cdr ispell-required-version)))) ; minor version mismatch
+ (error "%s version 3 release %d.%d.%d or greater is required"
ispell-program-name (car ispell-required-version)
- (car (cdr ispell-required-version)))
+ (car (cdr ispell-required-version))
+ (car (cdr (cdr ispell-required-version))))
;; check that it is the correct version.
- (if (< (car (read-from-string (buffer-substring-no-properties
- (match-beginning 2) (match-end 2))))
- (car (cdr ispell-required-version)))
+ (if (and (= (car (read-from-string (buffer-substring-no-properties
+ (match-beginning 2)(match-end 2))))
+ (car (cdr ispell-required-version)))
+ (< (car (read-from-string (buffer-substring-no-properties
+ (match-beginning 3)(match-end 3))))
+ (car (cdr (cdr ispell-required-version)))))
(setq ispell-offset 0)))
(kill-buffer (current-buffer)))
result))
(error "%s" (mapconcat 'identity ispell-filter "\n"))))
(setq ispell-filter nil) ; Discard version ID line
(let ((extended-char-mode (ispell-get-extended-character-mode)))
- (if extended-char-mode
+ (if extended-char-mode ; ~ extended character mode
(process-send-string ispell-process
(concat extended-char-mode "\n"))))
(process-kill-without-query ispell-process)))
(cond ; LOOK AT THIS LINE AND SKIP OR PROCESS
((eolp) ; END OF LINE, just go to next line.
(forward-line))
- ((looking-at "[---#@*+!%~^]") ; SKIP SPECIAL ISPELL CHARACTERS
- (forward-char 1))
+ ;;((looking-at "[---#@*+!%~^]") ; SKIP SPECIAL ISPELL CHARACTERS
+ ;; (forward-char 1)) ; not needed as quoted below.
((or (re-search-forward ispell-casechars end t) ; TEXT EXISTS
(re-search-forward "[][()${}]" end t)) ; or MATH COMMANDS
(setq string (concat "^" (buffer-substring-no-properties start end)
(setq done t)
(setq state (parse-partial-sexp (point) (point-max)
nil nil state 'syntax-table))
- (when (or (nth 3 state) (nth 4 state))
- (let ((start (point)))
- (setq state (parse-partial-sexp start (point-max)
- nil nil state 'syntax-table))
- (when (or (nth 3 state) (nth 4 state))
- (error "Unterminated string or comment"))
- (save-excursion
- (setq done (not (ispell-region start (point))))))))))
+ (if (or (nth 3 state) (nth 4 state))
+ (let ((start (point)))
+ (setq state (parse-partial-sexp start (point-max)
+ nil nil state 'syntax-table))
+ (if (or (nth 3 state) (nth 4 state))
+ (error "Unterminated string or comment"))
+ (save-excursion
+ (setq done (not (ispell-region start (point))))))))))
;;;###autoload
(let ((ispell-minor-mode nil)
(ispell-check-only t)
(last-char (char-after (1- (point)))))
- (if (or (eq last-char ?\ ) (eq last-char ?\n)
- (and ispell-skip-sgml (eq last-char ?>))
- (and ispell-skip-sgml (eq last-char ?\;)))
- nil
- (save-window-excursion
- (save-restriction
- (narrow-to-region (save-excursion (forward-line -1) (point)) (point))
- (ispell-word nil t))))
- (command-execute (key-binding (this-command-keys)))))
+ (command-execute (key-binding (this-command-keys)))
+ (if (not (or (eq last-char ?\ ) (eq last-char ?\n)
+ (and ispell-skip-sgml (eq last-char ?>))
+ (and ispell-skip-sgml (eq last-char ?\;))))
+ (ispell-word nil t))))
;;; **********************************************************************
"^%!PS-Adobe-[123].0"
;; Matches uuencoded text
"^begin [0-9][0-9][0-9] .*\nM.*\nM.*\nM"
- ;; Matches shell files (esp. auto-decoding)
+ ;; Matches shell files (especially auto-decoding)
"^#! /bin/[ck]?sh"
;; Matches context difference listing
"\\(\\(^cd .*\n\\)?diff -c .*\\)?\n\\*\\*\\* .*\n--- .*\n\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*"
;; (ispell-init-process) must already be called.
(process-send-string ispell-process "!\n") ; Put process in terse mode.
;; We assume all major modes with "tex-mode" in them should use latex parsing
- (if (or (and (eq ispell-parser 'use-mode-name)
- (string-match "[Tt][Ee][Xx]-mode" (symbol-name major-mode)))
- (eq ispell-parser 'tex))
+ ;; When exclusively checking comments, set to raw text mode (nroff).
+ (if (and (not (eq 'exclusive ispell-check-comments))
+ (or (and (eq ispell-parser 'use-mode-name)
+ (string-match "[Tt][Ee][Xx]-mode"
+ (symbol-name major-mode)))
+ (eq ispell-parser 'tex)))
(progn
(process-send-string ispell-process "+\n") ; set ispell mode to tex
(if (not (eq ispell-parser 'tex))
;; space separated definitions.
(setq string (downcase (buffer-substring-no-properties
(match-beginning 1) (match-end 1))))
- (cond ((string-match "latex-mode" string)
+ (cond ((and (string-match "latex-mode" string)
+ (not (eq 'exclusive ispell-check-comments)))
(process-send-string ispell-process "+\n~tex\n"))
((string-match "nroff-mode" string)
(process-send-string ispell-process "-\n~nroff\n"))
(insert (concat " " word))))))))
-(defconst ispell-version "ispell.el 3.1 -- Mon Nov 30 20:32:48 PST 1998")
+(defconst ispell-version "ispell.el 3.2 -- Fri May 7 14:25:14 PDT 1999")
(provide 'ispell)
;;; eval: expression
;;; local-variable: value
-;;; The following sets the buffer local dictionary to 'american' English
+;;; The following sets the buffer local dictionary to `american' English
;;; and spell checks only comments.
;;; Local Variables:
;;; Change IspellPersDict to IspellPersDict: to enable the following line.
;;; Local IspellPersDict ~/.ispell_lisp
;;; The following were automatically generated by ispell using the 'A' command:
-; LocalWords: Moellmann copyleft Dansk russian KOI charset minipage hspace mh
-; LocalWords: unsplitable includeonly nocite epsfig displaymath eqnarray init
-; LocalWords: settable autoload inews frag pdict alist Wildcards iconify arg
-; LocalWords: tex alists minibuffer Autoloading setq changelog kss stevens reg
-; LocalWords: Castellano framepop sgml modeline Wedler Dirk Froembgen fn Gerd
-; LocalWords: pgp NZST Vignaux autoloaded loaddefs aff Francais Nederlands SPC
-; LocalWords: popup nonmenu regexp herr num pers dict unhighlight ccept uit NB
-; LocalWords: buf grep sync prev inc hilight olddot AIX ersion msg read's op
-; LocalWords: bufs pt multibyte cmd Quinlan uuencoded esp unidiff eg sc
-; LocalWords: VM lns HTML eval american IspellPersDict
+; LocalWords: settable alist inews mh frag pdict Wildcards iconify arg tex kss
+; LocalWords: alists minibuffer bufferp autoload loaddefs aff Dansk KOI SPC op
+; LocalWords: Francais Nederlands charset autoloaded popup nonmenu regexp num
+; LocalWords: AMStex hspace includeonly nocite epsfig displaymath eqnarray reg
+; LocalWords: minipage modeline pers dict unhighlight buf grep sync prev inc
+; LocalWords: fn hilight oldot NB AIX msg init read's bufs pt cmd Quinlan eg
+; LocalWords: uuencoded unidiff sc nn VM SGML eval IspellPersDict unsplitable
+; LocalWords: lns
;;; ispell.el ends here