emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-26 a0ef733: Fix Flyspell mode when several languages


From: Eli Zaretskii
Subject: [Emacs-diffs] emacs-26 a0ef733: Fix Flyspell mode when several languages are mixed in a buffer
Date: Tue, 7 Aug 2018 11:36:20 -0400 (EDT)

branch: emacs-26
commit a0ef73388615e13467e1bd112a94b73ab85ead62
Author: Eli Zaretskii <address@hidden>
Commit: Eli Zaretskii <address@hidden>

    Fix Flyspell mode when several languages are mixed in a buffer
    
    * 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 | 37 +++++++++++++++++++++++++++++++------
 1 file changed, 31 insertions(+), 6 deletions(-)

diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el
index 5726bd8..4d7a189 100644
--- a/lisp/textmodes/flyspell.el
+++ b/lisp/textmodes/flyspell.el
@@ -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))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]