Make ispell-find-hunspell-dictionaries more resilient

* lisp/textmodes/ispell.el (ispell-find-hunspell-dictionaries):
Try harder to find the dictionary (bug#49982).
This commit is contained in:
Lars Ingebrigtsen 2022-08-22 14:57:34 +02:00
parent c202f22f4d
commit 9681ebf125

View file

@ -1062,12 +1062,14 @@ calls it only when invoked interactively."
(cl-pushnew (list dict '()) ispell-dictionary-alist :test #'equal)
(ispell-hunspell-fill-dictionary-entry dict))
(defun ispell-find-hunspell-dictionaries ()
(defun ispell-find-hunspell-dictionaries (&optional dictionary)
"Look for installed Hunspell dictionaries.
Will initialize `ispell-hunspell-dictionary-alist' according
to dictionaries found, and will remove aliases from the list
in `ispell-dicts-name2locale-equivs-alist' if an explicit
dictionary from that list was found."
dictionary from that list was found.
If DICTIONARY, check for that dictionary explicitly."
(let ((hunspell-found-dicts
(seq-filter
(lambda (str)
@ -1081,23 +1083,20 @@ dictionary from that list was found."
(file-name-absolute-p str))
(split-string
(with-temp-buffer
(ispell-call-process ispell-program-name
nil
t
nil
"-D"
;; Use -a to prevent Hunspell from
;; trying to initialize its
;; curses/termcap UI, which causes it
;; to crash or fail to start in some
;; MS-Windows ports.
"-a"
;; Hunspell 1.7.0 (and later?) won't
;; show LOADED DICTIONARY unless
;; there's at least one file argument
;; on the command line. So we feed
;; it with the null device.
null-device)
(apply #'ispell-call-process
ispell-program-name nil t nil
`("-D"
,@(and dictionary (list "-d" dictionary))
;; Use -a to prevent Hunspell from trying to
;; initialize its curses/termcap UI, which
;; causes it to crash or fail to start in some
;; MS-Windows ports.
"-a"
;; Hunspell 1.7.0 (and later?) won't show LOADED
;; DICTIONARY unless there's at least one file
;; argument on the command line. So we feed it
;; with the null device.
,null-device))
(buffer-string))
"[\n\r]+"
t)))
@ -1164,12 +1163,20 @@ dictionary from that list was found."
;; Parse and set values for default dictionary.
(setq hunspell-default-dict (or hunspell-multi-dict
(car hunspell-default-dict)))
;; If we didn't find a dictionary based on the environment (i.e.,
;; the locale and the DICTIONARY variable), try again if
;; `ispell-dictionary' is set.
(when (and (not hunspell-default-dict)
(not dictionary)
ispell-dictionary)
(setq hunspell-default-dict
(ispell-find-hunspell-dictionaries ispell-dictionary)))
;; If hunspell-default-dict is nil, ispell-parse-hunspell-affix-file
;; will barf with an error message that doesn't help users figure
;; out what is wrong. Produce an error message that points to the
;; root cause of the problem.
(or hunspell-default-dict
(error "Can't find Hunspell dictionary with a .aff affix file"))
(unless hunspell-default-dict
(error "Can't find Hunspell dictionary with a .aff affix file"))
(setq hunspell-default-dict-entry
(ispell-parse-hunspell-affix-file hunspell-default-dict))
;; Create an alist of found dicts with only names, except for default dict.
@ -1179,7 +1186,8 @@ dictionary from that list was found."
(cl-pushnew (if (string= dict hunspell-default-dict)
hunspell-default-dict-entry
(list dict))
ispell-hunspell-dictionary-alist :test #'equal))))
ispell-hunspell-dictionary-alist :test #'equal))
hunspell-default-dict))
;; Make ispell.el work better with enchant.