changeset 43064:aad0b1eb2142

(flyspell-issue-message-flag): New user option. (flyspell-mode-on, flyspell-notify-misspell) (flyspell-small-region, flyspell-external-point-words) (flyspell-large-region): Use it (flyspell-before-incorrect-word-string) (flyspell-after-incorrect-word-string): New user options. (make-flyspell-overlay): Use them. (flyspell-version): New function. (flyspell-incorrect-face, flyspell-duplicate-face): Adapt face definitions to use :weight. (flyspell-insert-function): New user option. (flyspell-auto-correct-word, flyspell-correct-word) (flyspell-xemacs-correct): Use it. (flyspell-define-abbrev): New function. (flyspell-auto-correct-word, flyspell-correct-word) (flyspell-xemacs-correct): Use it. (make-flyspell-overlay): Use `evaporate' property. (flyspell-auto-correct-word, flyspell-correct-word): Remove overlay. (flyspell-emacs-popup): Use `session' instead of `accept'. (flyspell-auto-correct-previous-pos): New variable. (flyspell-auto-correct-previous-hook) (flyspell-auto-correct-previous-word): New functions.
author Pavel Janík <Pavel@Janik.cz>
date Sat, 02 Feb 2002 15:56:45 +0000
parents 9f236506400a
children 9feb40b2ad23
files lisp/textmodes/flyspell.el
diffstat 1 files changed, 149 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/textmodes/flyspell.el	Sat Feb 02 15:52:36 2002 +0000
+++ b/lisp/textmodes/flyspell.el	Sat Feb 02 15:56:45 2002 +0000
@@ -1,6 +1,6 @@
 ;;; flyspell.el --- on-the-fly spell checker
 
-;; Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
 
 ;; Author: Manuel Serrano <Manuel.Serrano@unice.fr>
 ;; Keywords: convenience
@@ -145,6 +145,11 @@
   :group 'flyspell
   :type 'boolean)
 
+(defcustom flyspell-issue-message-flag t
+  "*Non-nil means that Flyspell emits messages when checking words."
+  :group 'flyspell
+  :type 'boolean)
+
 (defcustom flyspell-incorrect-hook nil
   "*List of functions to be called when incorrect words are encountered.
 Each function is given three arguments: the beginning and the end
@@ -222,6 +227,22 @@
   :version "21.1"
   :type 'number)
 
+(defcustom flyspell-insert-function (function insert)
+  "*The function to be used when a word has to be inserted by flyspell
+upon correction."
+  :group 'flyspell
+  :type 'function)
+
+(defcustom flyspell-before-incorrect-word-string nil
+  "String used to indicate an incorrect word starting."
+  :group 'flyspell
+  :type '(choice string (const nil)))
+
+(defcustom flyspell-after-incorrect-word-string nil
+  "String used to indicate an incorrect word ending."
+  :group 'flyspell
+  :type '(choice string (const nil)))
+
 ;*---------------------------------------------------------------------*/
 ;*    Mode specific options                                            */
 ;*    -------------------------------------------------------------    */
@@ -359,6 +380,8 @@
 ;*---------------------------------------------------------------------*/
 ;*    The minor mode declaration.                                      */
 ;*---------------------------------------------------------------------*/
+(eval-when-compile (defvar flyspell-local-mouse-map))
+
 (defvar flyspell-mode nil)
 (make-variable-buffer-local 'flyspell-mode)
 
@@ -399,14 +422,20 @@
 ;*    Highlighting                                                     */
 ;*---------------------------------------------------------------------*/
 (defface flyspell-incorrect-face
-  '((((class color)) (:foreground "OrangeRed" :weight bold :underline t))
-    (t (:weight bold)))
+  (if (eq flyspell-emacs 'xemacs)
+      '((((class color)) (:foreground "OrangeRed" :bold t :underline t))
+	(t (:bold t)))
+    '((((class color)) (:foreground "OrangeRed" :weight bold :underline t))
+      (t (:weight bold))))
   "Face used for marking a misspelled word in Flyspell."
   :group 'flyspell)
 
 (defface flyspell-duplicate-face
-  '((((class color)) (:foreground "Gold3" :weight bold :underline t))
-    (t (:weight bold)))
+  (if (eq flyspell-emacs 'xemacs)
+      '((((class color)) (:foreground "Gold3" :bold t :underline t))
+	(t (:bold t)))
+    '((((class color)) (:foreground "Gold3" :weight bold :underline t))
+      (t (:weight bold))))
   "Face used for marking a misspelled word that appears twice in the buffer.
 See also `flyspell-duplicate-distance'."
   :group 'flyspell)
@@ -483,6 +512,15 @@
     (and (consp ws) (window-minibuffer-p (car ws)))))
 
 ;*---------------------------------------------------------------------*/
+;*    flyspell-version ...                                             */
+;*---------------------------------------------------------------------*/
+;;;###autoload
+(defun flyspell-version ()
+  "The flyspell version"
+  (interactive)
+  "1.6h")
+
+;*---------------------------------------------------------------------*/
 ;*    flyspell-accept-buffer-local-defs ...                            */
 ;*---------------------------------------------------------------------*/
 (defun flyspell-accept-buffer-local-defs ()
@@ -501,8 +539,6 @@
 ;*---------------------------------------------------------------------*/
 ;*    flyspell-mode-on ...                                             */
 ;*---------------------------------------------------------------------*/
-(eval-when-compile (defvar flyspell-local-mouse-map))
-
 (defun flyspell-mode-on ()
   "Turn Flyspell mode on.  Do not use this; use `flyspell-mode' instead."
   (setq ispell-highlight-face 'flyspell-incorrect-face)
@@ -530,7 +566,9 @@
     (if mode-predicate
 	(setq flyspell-generic-check-word-p mode-predicate)))
   ;; the welcome message
-  (if (and flyspell-issue-welcome-flag (interactive-p))
+  (if (and flyspell-issue-message-flag
+	   flyspell-issue-welcome-flag
+	   (interactive-p))
       (let ((binding (where-is-internal 'flyspell-auto-correct-word
 					nil 'non-ascii)))
 	(message
@@ -538,7 +576,6 @@
 	     (format "Welcome to flyspell. Use %s or Mouse-2 to correct words."
 		     (key-description binding))
 	   "Welcome to flyspell. Use Mouse-2 to correct words."))))
-
   ;; we end with the flyspell hooks
   (run-hooks 'flyspell-mode-hook))
 
@@ -907,7 +944,8 @@
 			(if flyspell-sort-corrections
 			    (sort (car (cdr (cdr poss))) 'string<)
 			  (car (cdr (cdr poss)))))))
-    (message (format "mispelling `%s'  %S" word replacements))))
+    (if flyspell-issue-message-flag
+	(message (format "mispelling `%s'  %S" word replacements)))))
 
 ;*---------------------------------------------------------------------*/
 ;*    flyspell-word ...                                                */
@@ -1206,7 +1244,7 @@
     (goto-char beg)
     (let ((count 0))
       (while (< (point) end)
-	(if (= count 100)
+	(if (and flyspell-issue-message-flag (= count 100))
 	    (progn
 	      (message "Spell Checking...%d%%"
 		       (* 100 (/ (float (- (point) beg)) (- end beg))))
@@ -1219,7 +1257,7 @@
 	  (if (and (< (point) end) (> (point) (+ cur 1)))
 	      (backward-char 1)))))
     (backward-char 1)
-    (message "Spell Checking completed.")
+    (if flyspell-issue-message-flag (message "Spell Checking completed."))
     (flyspell-word)))
 
 ;*---------------------------------------------------------------------*/
@@ -1254,9 +1292,10 @@
 	      (goto-char (match-end 0))
 	      (set-buffer flyspell-large-region-buffer)
 	      (goto-char flyspell-large-region-beg)
-	      (message "Spell Checking...%d%% [%s]"
-		       (* 100 (/ (float (- (point) start)) size))
-		       word)
+	      (if flyspell-issue-message-flag
+		  (message "Spell Checking...%d%% [%s]"
+			   (* 100 (/ (float (- (point) start)) size))
+			   word))
 	      (if (search-forward word flyspell-large-region-end t)
 		  (progn
 		    (setq flyspell-large-region-beg (point))
@@ -1265,7 +1304,7 @@
 	      (set-buffer buffer))
 	  (goto-char (point-max)))))
     ;; we are done
-    (message "Spell Checking completed.")
+    (if flyspell-issue-message-flag (message "Spell Checking completed."))
     ;; ok, we are done with pointing out incorrect words, we just
     ;; have to kill the temporary buffer
     (kill-buffer flyspell-external-ispell-buffer)
@@ -1284,7 +1323,7 @@
     (set-buffer buffer)
     (erase-buffer)
     ;; this is done, we can start checking...
-    (message "Checking region...")
+    (if flyspell-issue-message-flag (message "Checking region..."))
     (set-buffer curbuf)
     (let ((c (apply 'call-process-region beg
 		    end
@@ -1454,10 +1493,18 @@
     (overlay-put flyspell-overlay 'face face)
     (overlay-put flyspell-overlay 'mouse-face mouse-face)
     (overlay-put flyspell-overlay 'flyspell-overlay t)
+    (overlay-put flyspell-overlay 'evaporate t)
     (if flyspell-use-local-map
-	(overlay-put flyspell-overlay
-		     flyspell-overlay-keymap-property-name
-		     flyspell-mouse-map))
+        (overlay-put flyspell-overlay
+                     flyspell-overlay-keymap-property-name
+                     flyspell-mouse-map))
+    (when (eq face 'flyspell-incorrect-face)
+      (and (stringp flyspell-before-incorrect-word-string)
+           (overlay-put flyspell-overlay 'before-string
+                        flyspell-before-incorrect-word-string))
+      (and (stringp flyspell-after-incorrect-word-string)
+           (overlay-put flyspell-overlay 'after-string
+                        flyspell-after-incorrect-word-string)))
     flyspell-overlay))
 
 ;*---------------------------------------------------------------------*/
@@ -1503,7 +1550,8 @@
 	;; now we can use a new overlay
 	(setq flyspell-overlay
 	      (make-flyspell-overlay beg end
-				     'flyspell-duplicate-face 'highlight)))))
+				     'flyspell-duplicate-face
+				     'highlight)))))
 
 ;*---------------------------------------------------------------------*/
 ;*    flyspell-auto-correct-cache ...                                  */
@@ -1581,6 +1629,14 @@
     local-abbrev-table))
 
 ;*---------------------------------------------------------------------*/
+;*    flyspell-define-abbrev ...                                       */
+;*---------------------------------------------------------------------*/
+(defun flyspell-define-abbrev (name expansion)
+  (let ((table (flyspell-abbrev-table)))
+    (when table
+      (define-abbrev table name expansion))))
+
+;*---------------------------------------------------------------------*/
 ;*    flyspell-auto-correct-word ...                                   */
 ;*---------------------------------------------------------------------*/
 (defun flyspell-auto-correct-word ()
@@ -1596,6 +1652,7 @@
 	;; we have already been using the function at the same location
 	(let* ((start (car flyspell-auto-correct-region))
 	       (len   (cdr flyspell-auto-correct-region)))
+	  (flyspell-unhighlight-at start)
 	  (delete-region start (+ start len))
 	  (setq flyspell-auto-correct-ring (cdr flyspell-auto-correct-ring))
 	  (let* ((word (car flyspell-auto-correct-ring))
@@ -1608,9 +1665,8 @@
 		    (flyspell-change-abbrev (flyspell-abbrev-table)
 					    flyspell-auto-correct-word
 					    word)
-		  (define-abbrev (flyspell-abbrev-table)
-		    flyspell-auto-correct-word word)))
-	    (insert word)
+		  (flyspell-define-abbrev flyspell-auto-correct-word word)))
+	    (funcall flyspell-insert-function word)
 	    (flyspell-word)
 	    (flyspell-display-next-corrections flyspell-auto-correct-ring))
 	  (flyspell-ajust-cursor-point pos (point) old-max)
@@ -1660,8 +1716,9 @@
 				   (rplacd l (cons (car poss) replacements)))
 				 (setq flyspell-auto-correct-ring
 				       replacements)
+				 (flyspell-unhighlight-at start)
 				 (delete-region start end)
-				 (insert new-word)
+				 (funcall flyspell-insert-function new-word)
 				 (if flyspell-abbrev-p
 				     (if (flyspell-already-abbrevp
 					  (flyspell-abbrev-table) word)
@@ -1669,8 +1726,7 @@
 					  (flyspell-abbrev-table)
 					  word
 					  new-word)
-				       (define-abbrev (flyspell-abbrev-table)
-					 word new-word)))
+				       (flyspell-define-abbrev word new-word)))
 				 (flyspell-word)
 				 (flyspell-display-next-corrections
 				  (cons new-word flyspell-auto-correct-ring))
@@ -1681,6 +1737,66 @@
 	(ispell-pdict-save t)))))
 
 ;*---------------------------------------------------------------------*/
+;*    flyspell-auto-correct-previous-pos ...                           */
+;*---------------------------------------------------------------------*/
+(defvar flyspell-auto-correct-previous-pos nil
+  "Holds the start of the first incorrect word before point.")
+
+;*---------------------------------------------------------------------*/
+;*    flyspell-auto-correct-previous-hook ...                          */
+;*---------------------------------------------------------------------*/
+(defun flyspell-auto-correct-previous-hook ()
+  "Hook to track successive calls to `flyspell-auto-correct-previous-word'.
+Sets flyspell-auto-correct-previous-pos to nil"
+  (interactive)
+  (remove-hook 'pre-command-hook (function flyspell-auto-correct-previous-hook) t)
+  (unless (eq this-command (function flyspell-auto-correct-previous-word))
+    (setq flyspell-auto-correct-previous-pos nil)))
+
+;*---------------------------------------------------------------------*/
+;*    flyspell-auto-correct-previous-word ...                          */
+;*---------------------------------------------------------------------*/
+(defun flyspell-auto-correct-previous-word (position)
+  "*Auto correct the first mispelled word that occurs before point."
+  (interactive "d")
+
+  (add-hook 'pre-command-hook
+	    (function flyspell-auto-correct-previous-hook) t t)
+
+  (save-excursion
+    (unless flyspell-auto-correct-previous-pos
+      ;; only reset if a new overlay exists
+      (setq flyspell-auto-correct-previous-pos nil)
+
+      (let ((overlay-list (overlays-in (point-min) position))
+	    (new-overlay 'dummy-value))
+
+	;; search for previous (new) flyspell overlay
+	(while (and new-overlay
+		    (or (not (flyspell-overlay-p new-overlay))
+			;; check if its face has changed
+			(not (eq (get-char-property
+				  (overlay-start new-overlay) 'face)
+				 'flyspell-incorrect-face))))
+	  (setq new-overlay (car-safe overlay-list))
+	  (setq overlay-list (cdr-safe overlay-list)))
+
+	;; if nothing new exits new-overlay should be nil
+	(if new-overlay;; the length of the word may change so go to the start
+	    (setq flyspell-auto-correct-previous-pos
+		  (overlay-start new-overlay)))))
+
+    (when flyspell-auto-correct-previous-pos
+      (save-excursion
+	(goto-char flyspell-auto-correct-previous-pos)
+	(let ((ispell-following-word t));; point is at start
+	  (if (numberp flyspell-auto-correct-previous-pos)
+	      (goto-char flyspell-auto-correct-previous-pos))
+	  (flyspell-auto-correct-word))
+	;; the point may have moved so reset this
+	(setq flyspell-auto-correct-previous-pos (point))))))
+
+;*---------------------------------------------------------------------*/
 ;*    flyspell-correct-word ...                                        */
 ;*---------------------------------------------------------------------*/
 (defun flyspell-correct-word (event)
@@ -1736,6 +1852,7 @@
 		    (if (eq replace 'buffer)
 			(ispell-add-per-file-word-list word)))
 		   (replace
+		    (flyspell-unhighlight-at cursor-location)
 		    (let ((new-word (if (atom replace)
 					replace
 				      (car replace)))
@@ -1744,11 +1861,9 @@
 		      (if (not (equal new-word (car poss)))
 			  (let ((old-max (point-max)))
 			    (delete-region start end)
-			    (insert new-word)
+			    (funcall flyspell-insert-function new-word)
 			    (if flyspell-abbrev-p
-				(define-abbrev (flyspell-abbrev-table)
-				  word
-				  new-word))
+				(flyspell-define-abbrev word new-word))
 			    (flyspell-ajust-cursor-point save
 							 cursor-location
 							 old-max)))))
@@ -1792,11 +1907,9 @@
 	       (progn
 		 (delete-region start end)
 		 (goto-char start)
-		 (insert new-word)
+		 (funcall flyspell-insert-function new-word)
 		 (if flyspell-abbrev-p
-		     (define-abbrev (flyspell-abbrev-table)
-		       word
-		       new-word))))
+		     (flyspell-define-abbrev word new-word))))
 	   (flyspell-ajust-cursor-point save cursor-location old-max)))))
 
 ;*---------------------------------------------------------------------*/
@@ -1842,7 +1955,7 @@
 				     (list
 				      (list (concat "Save affix: " (car affix))
 					    'save)
-				      '("Accept (session)" accept)
+				      '("Accept (session)" session)
 				      '("Accept (buffer)" buffer))
 				   '(("Save word" save)
 				     ("Accept (session)" session)