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.

Fixes: debbugs:16800
This commit is contained in:
Agustin Martin Domingo 2015-02-12 18:38:11 +01:00
parent f5d1e1f550
commit a7254bbf99
2 changed files with 59 additions and 20 deletions

View 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.

View 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)))
;;*---------------------------------------------------------------------*/