[PATCH] Allow removing words from the personal dictionary, that weren't previously added
Jean-Marc Lasgouttes
lasgouttes at lyx.org
Sun May 15 16:44:03 UTC 2022
Le 26/04/2022 à 09:27, Isaac Oscar Gariano a écrit :
> I've made the "Remove from personal dictionary" function/context menu
> item work for words that haven't been previously added, but instead are
> in the system-wide dictionary.
Dear Isaac,
Thanks for the patch. Unfortunately, I just realize that you are not on
the list. To make sure that this feature is correctly tracked, I suggest
that you either subscribe to the list, or create a ticket at
www.lyx.org/trac/ and attach your patch and whatever information makes
sense.
We (not me actually) will look at the feature as soon as possible.
JMarc
> I've modified the behaviour so that it will cause the word to be marked
> as incorrectly spelt, regardless of whether it is in the user's personal
> dictionary, or the system-wide dictionary.
> I've attached two patches, one that can be applied on the latest release
> branch |2.3.6.1|, and the other works on the |master| branch)
>
> Previously, this only worked for words not in the system-wide
> dictionary, e.g.:
>
> 1. write "ello", it will be red squigglyunderlined
> 2. right click and go "Add to personal dictionary"
> 3. now the underline will disappear
> 4. right click it and go "Remove from personal dictionary"
> 5. it will now be red underlined again
>
> Now you can also do:
>
> 1. write "hello"
> 2. right click on it, and click "Remove from personal dictionary"
> 3. there should now be a red squiggly underline under "hello", i.e. it
> is no longer considered a word
>
> (The above also works with the corresponding lyx-functions
> |spelling-add| and |spelling-remove|)
> It might be better to change the text of the context menu button, e.g.,
> "Add to personal bad words list" or something, but then it'd need to be
> translated
>
>
> The main use cases I have for this feature are:
>
> 1. removing rare words that are common misspellings, e.g., if you often
> write "whet" instead of "wet", you can mark the former as invalid.
> 2. ensure you consistently use the same variant of a word , e.g., make
> "spelled" an error if you prefer "spelt" (the latter being a word in
> the en_GB dictionary)
>
> This change is backwards compatible: any words you had previously added
> to the personal dictionary will still be recognised.
>
> I have fully tested this on Linux (specifically OpenSUSE Tumbleweed,
> with Aspell v0.60.8, Enchant v2.2.15, and, Hunspell 1.7.0), and Windows
> 11 (using the included Hunspell v1.6.2), I don't have a Mac so I can't
> test the AppleSpeller/Native backend.
>
> How it works:
>
> *
> Enchant already supports this feature out of the box, so I didn't
> need to change the backend at all, all I needed to do was to make
> the "Remove from personal dictionary" context menu button show up
> for all correctly spelt words (and not just those in the personal
> dictionary).
> Specifically, enchant uses two files |~/.config./enchant/<lang>.dic|
> and |~/.config/enchant/<lang>.exc| to store the personal
> dictionary. The former contains all words that you have clicked "Add
> to personal dictionary", and the latter uses all that you have
> clicked "Remove from personal dictionary" for.
> Note that words are added to |.dic| and |.exc| even if unnecessary
> (because the word is in the system-wide dictionary, or not in it,
> respectively).
> The ".exc" file appears to take precedence over |.dic|, so if a
> word is in both, it is considered misspelt.
> * Aspell and Hunspell currently uses a file
> |$LYX_USERDIR/pwl_<lang>.dict| to store words you have clicked "Add
> to personal dictionary" for. LyX now also uses the
> |$LYX_USERDIR/pwl_<lang>.excl| file for words you have "Remove from
> personal dictionary". For consistency, my code treats these files
> like the enchant |.dic| and |.exc| files above, specifically the
> |.excl| file takes precedence of the |.dict| file, and words may
> be added to these files even if redundant/unnecessary.
> The Hunspell backend already natively supports removing words from
> the dictionary at runtime, however Aspell does not, so after spell
> checking a word, my code manually checks for it's presence in the
> |.excl| list, which I have not optimised at all, and so it is an
> O(/n/) operation, where /n/ is the number of words in the |.excl| file.
> AppleSpeller/Native: this may work out of the box like Enchant, or
> not. I have no idea, as I can't test it and the documentation is
> unhelpful (e.g.
> https://developer.apple.com/documentation/appkit/nsspellchecker/1525147-unlearnword
> <https://developer.apple.com/documentation/appkit/nsspellchecker/1525147-unlearnword>)
>
> Note: I have deleted |LEARNED_WORD| from the |SpellChecker::Result|
> enum, as the code no longer distinguishes between words in the personal
> dictionary and the base dictionary. I also removed the |ROOT_FOUND|,
> |COMPOUND_WORD|, and |IGNORED_WORD| variants as they were never used.
>
> For the master branch, I haven't modified the "Remove from document
> dictionary" option to also work with words not in said dictionary; I'd
> have to modify the LyX file format to support a |\spellchecker_reject|
> or something like, but I can probably work out how to do that if you're
> happy with the idea.
>
> — Isaac Oscar Gariano
>
More information about the lyx-devel
mailing list