]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix Flyspell mode when several languages are mixed in a buffer
authorEli Zaretskii <eliz@gnu.org>
Tue, 7 Aug 2018 15:35:12 +0000 (18:35 +0300)
committerEli Zaretskii <eliz@gnu.org>
Tue, 7 Aug 2018 15:35:12 +0000 (18:35 +0300)
* lisp/textmodes/flyspell.el (flyspell-external-point-words):
Handle "misspelled" words that actually belong to a language
unsupported by the current dictionary.  (Bug#32280)  Fix the test
for Ispell the program.

lisp/textmodes/flyspell.el

index 5726bd82cb9436d7bda4bd9d8b71486a10d4f58e..4d7a18969e6568465913299d4aad0674fbbabd4a 100644 (file)
@@ -1420,10 +1420,20 @@ determined by `flyspell-large-region'."
 The list of incorrect words should be in `flyspell-external-ispell-buffer'.
 \(We finish by killing that buffer and setting the variable to nil.)
 The buffer to mark them in is `flyspell-large-region-buffer'."
-  (let (words-not-found
-       (ispell-otherchars (ispell-get-otherchars))
-       (buffer-scan-pos flyspell-large-region-beg)
-       case-fold-search)
+  (let* (words-not-found
+         (flyspell-casechars (flyspell-get-casechars))
+         (ispell-otherchars (ispell-get-otherchars))
+         (ispell-many-otherchars-p (ispell-get-many-otherchars-p))
+         (word-chars (concat flyspell-casechars
+                             "+\\("
+                             (if (not (string= "" ispell-otherchars))
+                                 (concat ispell-otherchars "?"))
+                             flyspell-casechars
+                             "+\\)"
+                             (if ispell-many-otherchars-p
+                                 "*" "?")))
+         (buffer-scan-pos flyspell-large-region-beg)
+         case-fold-search)
     (with-current-buffer flyspell-external-ispell-buffer
       (goto-char (point-min))
       ;; Loop over incorrect words, in the order they were reported,
@@ -1453,11 +1463,18 @@ The buffer to mark them in is `flyspell-large-region-buffer'."
                              ;; Move back into the match
                              ;; so flyspell-get-word will find it.
                              (forward-char -1)
-                             (flyspell-get-word)))
+                              ;; Is this a word that matches the
+                              ;; current dictionary?
+                              (if (looking-at word-chars)
+                                 (flyspell-get-word))))
                           (found (car found-list))
                           (found-length (length found))
                           (misspell-length (length word)))
                      (when (or
+                             ;; Misspelled word is not from the
+                             ;; language supported by the current
+                             ;; dictionary.
+                             (null found)
                             ;; Size matches, we really found it.
                             (= found-length misspell-length)
                             ;; Matches as part of a boundary-char separated
@@ -1479,13 +1496,21 @@ The buffer to mark them in is `flyspell-large-region-buffer'."
                             ;; backslash) and none of the previous
                             ;; conditions match.
                             (and (not ispell-really-aspell)
+                                  (not ispell-really-hunspell)
+                                  (not ispell-really-enchant)
                                  (save-excursion
                                    (goto-char (- (nth 1 found-list) 1))
                                    (if (looking-at "[\\]" )
                                        t
                                      nil))))
                        (setq keep nil)
-                       (flyspell-word nil t)
+                        ;; Don't try spell-checking words whose
+                        ;; characters don't match CASECHARS, because
+                        ;; flyspell-word will then consider as
+                        ;; misspelling the preceding word that matches
+                        ;; CASECHARS.
+                        (or (null found)
+                           (flyspell-word nil t))
                        ;; Search for next misspelled word will begin from
                        ;; end of last validated match.
                        (setq buffer-scan-pos (point))))