Subject: bug#67857: 30.0.50; ispell fails on apostrophes when the dictionary includes contractions

From: Eli Zaretskii <[email-masked]>
Date: Sun, 17 Dec 2023 08:59:42 +0200

tags 67857 notabug
thanks

> Date: Sat, 16 Dec 2023 13:03:46 -0800
> From: Bob Rogers <[email-masked]>
> 
>    1.  "emacs -Q" (in an environment that uses hunspell by default).
> 
>    2.  In the *scratch* buffer, type "this wiouldn't work".
> 
>    3.  Type M-b three times to move point before the "w" in the second
> word.
> 
>    4.  Type M-$.  The sole offered replacement is "wouldn't" but the
> text it offers to replace is "wiouldn"; typing "0" to take the
> replacement results in "this wouldn't't work" in the buffer.

Doesn't happen for me.

>    On my system, the value of ispell-really-hunspell is "1.6.2";

I use Hunspell 1.3.2, FWIW.

> further
> configuration data appear below.  The problem seems to be that the
> dictionary hunspell is using contains contractions, but ispell is
> expecting just [:alpha:] words.  I tried tweaking the regexps in
> ispell-dictionary-alist to accept apostrophes, but got the error:
> 
> 	ispell--run-on-word: Ispell and its process have different
> 	character maps: (* & wiouldn 1 1: wouldn't)
> 
> It seems like a job tailor-made for OTHERCHARS, but I get the same error
> whether I add the apostrophe to OTHERCHARS via
> 
> 	(setf (nth 3 (assoc nil ispell-dictionary-alist)) "['0-9]")
> 
> or to CASECHARS and NOT-CASECHARS in tandem, via (e.g.):
> 
> 	(setf (nth 1 (assoc nil ispell-dictionary-alist)) "['[:alpha:]]")
> 
>    I do not understand how to get past this point, so either the code is
> failing somehow (and I appreciate that it might be hard to glean the
> right config bits for the dictionar(y|ies) in use), I am missing or
> misunderstanding some part of the documentation, or the documentation is
> lacking.  TIA,

You are looking at the wrong places to try fixing this.  First, the
default for OTHERCHARS in English and American dictionaries is "[']"
(see ispell-dictionary-base-alist), and likewise for the "default"
dictionary, so this already includes the apostrophe.  However, when
ispell.el uses Hunspell, it doesn't use this database for OTHERCHARS;
instead, it looks in the dictionary's affix file, see
ispell-parse-hunspell-affix-file.  So you should look in your affix
file and see if the apostrophe is mentioned there.  In my affix file
for English, I see this line:

  WORDCHARS 0123456789'

which includes the apostrophe.  See hunspell(4) man page for more
details about the affix file and its settings.

My affix file also has this line, which also includes the apostrophe:

  TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'-

Not sure if it's relevant, but I though I'd mention it for
completeness.

I see no bug in Emacs here.  ispell.el works as intended.