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.
Juergen,
Did you have time to look at this patch?
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
--
lyx-devel mailing list
lyx-devel@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-devel