]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve string search in `flyspell-word-search-*`. (Bug#16800)
authorAgustin Martin Domingo <agustin6martin@gmail.com>
Thu, 12 Feb 2015 17:38:11 +0000 (18:38 +0100)
committerAgustin Martin Domingo <agustin6martin@gmail.com>
Thu, 12 Feb 2015 17:45:26 +0000 (18:45 +0100)
* flyspell.el (flyspell-duplicate-distance): Limit default search
distance for duplicated words to 40000.
(flyspell-word-search-backward, flyspell-word-search-forward):
Search as full word with defined casechars, not as substring.

Fixes: debbugs:16800
lisp/ChangeLog
lisp/textmodes/flyspell.el

index ea428b1de15231dc6bb3b2916e10db1d8a60509d..6fb752a48a96af5c417e9592c9e903edd6e2f675 100644 (file)
@@ -1,3 +1,12 @@
+2015-02-12  Agustín Martín Domingo <agustin6martin@gmail.com>
+
+       Improve string search in `flyspell-word-search-*`. (Bug#16800)
+
+       * flyspell.el (flyspell-duplicate-distance): Limit default search
+       distance for duplicated words to 40000.
+       (flyspell-word-search-backward, flyspell-word-search-forward):
+       Search as full word with defined casechars, not as substring.
+
 2015-02-10  Juri Linkov  <juri@linkov.net>
 
        Better support for the case of typing RET on the prompt in comint.
index 66243b42102ddf36734708b3d4b85a964f2df891..cd64a8067780d89dcd7ff654df19b35b6b352744 100644 (file)
@@ -92,7 +92,7 @@ downcased before comparing with these exceptions."
   :version "21.1"
   :type 'boolean)
 
-(defcustom flyspell-duplicate-distance -1
+(defcustom flyspell-duplicate-distance 400000
   "The maximum distance for finding duplicates of unrecognized words.
 This applies to the feature that when a word is not found in the dictionary,
 if the same spelling occurs elsewhere in the buffer,
@@ -1010,17 +1010,33 @@ Mostly we check word delimiters."
 ;;*---------------------------------------------------------------------*/
 (defun flyspell-word-search-backward (word bound &optional ignore-case)
   (save-excursion
-    (let ((r '())
-         (inhibit-point-motion-hooks t)
-         p)
-      (while (and (not r) (setq p (search-backward word bound t)))
-       (let ((lw (flyspell-get-word)))
-         (if (and (consp lw)
-                  (if ignore-case
-                      (string-equal (downcase (car lw)) (downcase word))
-                    (string-equal (car lw) word)))
-             (setq r p)
-           (goto-char p))))
+    (let* ((r '())
+          (inhibit-point-motion-hooks t)
+          (flyspell-not-casechars (flyspell-get-not-casechars))
+          (bound (if (and bound
+                          (> bound (point-min)))
+                     (- bound 1)))
+          (word-re (concat
+                     "\\(?:" flyspell-not-casechars "\\|\\`\\)"
+                     (regexp-quote word)
+                     flyspell-not-casechars))
+          p)
+      (while
+         (and (not r)
+               (setq p
+                     (and
+                      (re-search-backward word-re bound t)
+                     (if (bobp)
+                         (point)
+                        (forward-char)
+                        (point)))))
+        (let ((lw (flyspell-get-word)))
+          (if (and (consp lw)
+                   (if ignore-case
+                       (string-equal (downcase (car lw)) (downcase word))
+                     (string-equal (car lw) word)))
+              (setq r p)
+            (goto-char p))))
       r)))
 
 ;;*---------------------------------------------------------------------*/
@@ -1028,14 +1044,28 @@ Mostly we check word delimiters."
 ;;*---------------------------------------------------------------------*/
 (defun flyspell-word-search-forward (word bound)
   (save-excursion
-    (let ((r '())
-         (inhibit-point-motion-hooks t)
-         p)
-      (while (and (not r) (setq p (search-forward word bound t)))
-       (let ((lw (flyspell-get-word)))
-         (if (and (consp lw) (string-equal (car lw) word))
-             (setq r p)
-           (goto-char (1+ p)))))
+    (let* ((r '())
+          (inhibit-point-motion-hooks t)
+          (flyspell-not-casechars (flyspell-get-not-casechars))
+          (bound (if (and bound
+                          (< bound (point-max)))
+                     (+ bound 1)))
+          (word-re (concat flyspell-not-casechars
+                            (regexp-quote word)
+                            "\\(?:" flyspell-not-casechars "\\|\\'\\)"))
+          p)
+      (while
+         (and (not r)
+               (setq p (and
+                        (re-search-forward word-re bound t)
+                        (if (eobp)
+                            (point)
+                          (backward-char)
+                          (point)))))
+        (let ((lw (flyspell-get-word)))
+          (if (and (consp lw) (string-equal (car lw) word))
+              (setq r p)
+            (goto-char (1+ p)))))
       r)))
 
 ;;*---------------------------------------------------------------------*/