--- flyspell.el.orig 2014-02-26 19:05:29.651986038 +0100 +++ flyspell.el 2014-02-28 12:01:03.930010553 +0100 @@ -1048,10 +1048,21 @@ ;;*---------------------------------------------------------------------*/ (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* ((r '()) + (inhibit-point-motion-hooks t) + (flyspell-not-casechars (flyspell-get-not-casechars)) + (word-re (concat flyspell-not-casechars + (regexp-quote word) + flyspell-not-casechars)) + p) + (while + (and (not r) + (setq p (if (re-search-backward word-re bound t) + ;; word-re match begins one char before word + (progn (forward-char) (point)) + ;; Check above does not match similar word at b-o-b + (goto-char (point-min)) + (search-forward word (length word) t)))) (let ((lw (flyspell-get-word))) (if (and (consp lw) (if ignore-case @@ -1066,10 +1077,25 @@ ;;*---------------------------------------------------------------------*/ (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* ((r '()) + (inhibit-point-motion-hooks t) + (word-end (nth 2 (flyspell-get-word))) + (flyspell-not-casechars (flyspell-get-not-casechars)) + (word-re (concat flyspell-not-casechars + (regexp-quote word) + flyspell-not-casechars)) + p) + (while + (and (not r) + (setq p (if (= word-end (point-max)) + nil ;; Current word is at e-o-b. No forward search + (if (re-search-forward word-re bound t) + ;; word-re match ends one char after word + (progn (backward-char) (point)) + ;; Check above does not match similar word at e-o-b + (goto-char (point-max)) + (search-backward word (- (point-max) + (length word)) t))))) (let ((lw (flyspell-get-word))) (if (and (consp lw) (string-equal (car lw) word)) (setq r p)