From: Karl Heuer Date: Sun, 9 May 1999 06:34:35 +0000 (+0000) Subject: (ispell-local-dictionary-alist): New variable for X-Git-Tag: emacs-20.4~248 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=6fdf40f3a100b572583c3816c3074cea455aee12;p=emacs.git (ispell-local-dictionary-alist): New variable for customizing local dictionaries not accessable by everyone. (ispell-dictionary-alist): Loads `ispell-local-dictionary-alist'. (ispell-required-version): Changed format `(major minor revision)' to support general pattern matching. (ispell-tex-skip-alists): AMS Tex block comment and `\author' skip region commented out due to incorrect skip potential in std latex. (ispell-word): Removed `when' macro. Fixed bug of not restoring cursor point on small words for calls from `ispell-minor-mode'. (check-ispell-version): Tests and accepts versions major.minor and above, with adjustments for interactions in 3.1.0-3.1.11. (ispell-get-line): No longer skips ispell process special characters. (ispell-comments-and-strings): Removed `when' macro call. (ispell-minor-check): Requires ispell-word to restore cursor point. (ispell-buffer-local-parsing): Supports checking comments only. --- diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el index b14f4e39d98..1b22c23e65c 100644 --- a/lisp/textmodes/ispell.el +++ b/lisp/textmodes/ispell.el @@ -1,10 +1,10 @@ ;;; 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 -;; 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 @@ -33,22 +33,24 @@ ;; 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. @@ -112,16 +114,41 @@ ;; `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: @@ -147,8 +174,7 @@ ;;; ********************************************************************** -;;; ******* 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. @@ -370,6 +396,31 @@ for language-specific arguments." :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 @@ -378,7 +429,7 @@ for language-specific arguments." 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) @@ -471,7 +522,7 @@ for language-specific arguments." ;;;###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) @@ -484,7 +535,8 @@ for language-specific arguments." ;;;###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. @@ -552,14 +604,12 @@ LANGUAGE.aff file \(e.g., english.aff\)." (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 @@ -696,7 +746,7 @@ and added as a submenu of the \"Edit\" menu.") ;;; 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.") @@ -810,7 +860,7 @@ The last occurring definition in the buffer will be used.") ("\\(/\\|\\(\\(\\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.: @@ -828,14 +878,14 @@ Valid forms include: ;;;###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) @@ -950,7 +1000,8 @@ or \\[ispell-region] to update the Ispell process." 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))) @@ -1003,9 +1054,9 @@ or \\[ispell-region] to update the Ispell process." (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) @@ -1086,7 +1137,7 @@ If so, ask if it needs to be saved." (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)) @@ -1321,7 +1372,7 @@ Global `ispell-quit' set to start location to continue spell session." (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! @@ -1675,7 +1726,7 @@ scrolling the current window. Leave the new window selected." (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)) @@ -1778,18 +1829,25 @@ scrolling the current window. Leave the new window selected." (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)) @@ -1870,7 +1928,7 @@ scrolling the current window. Leave the new window selected." (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))) @@ -2178,8 +2236,8 @@ otherwise, the current line is skipped." (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) @@ -2327,14 +2385,14 @@ otherwise, the current line is skipped." (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 @@ -2493,15 +2551,11 @@ Don't read buffer-local settings or word lists." (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)))) ;;; ********************************************************************** @@ -2519,7 +2573,7 @@ Don't read buffer-local settings or word lists." "^%!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\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*" @@ -2676,9 +2730,12 @@ Includes Latex/Nroff modes and extended character mode." ;; (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)) @@ -2705,7 +2762,8 @@ Includes Latex/Nroff modes and extended character mode." ;; 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")) @@ -2822,7 +2880,7 @@ Both should not be used to define a buffer-local dictionary." (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) @@ -2834,7 +2892,7 @@ Both should not be used to define a buffer-local dictionary." ;;; 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: @@ -2852,15 +2910,13 @@ Both should not be used to define a buffer-local dictionary." ;;; 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