Am 26.04.2022 um 09:27 schrieb Isaac Oscar Gariano <isaacos...@live.com.au>: > > 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. > 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.: > • write "ello", it will be red squiggly underlined > • right click and go "Add to personal dictionary" > • now the underline will disappear > • right click it and go "Remove from personal dictionary" > • it will now be red underlined again > Now you can also do: > • write "hello" > • right click on it, and click "Remove from personal dictionary" > • 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: > • removing rare words that are common misspellings, e.g., if you often > write "whet" instead of "wet", you can mark the former as invalid. > • 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) > 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.
Hi Isaac, thank you for your work on LyX. I’ve tried your patch and unfortunately it doesn’t work on Mac. Despite the fact that it relies on the existence of the LEARNED_WORD in the SpellChecker::Result enum there is IMO a problem with the general idea of the solution with the Apple speller. Here the whole paragraph is passed as a big chunk to the speller engine to get a reasonable performance. Best regards, Stephan -- lyx-devel mailing list lyx-devel@lists.lyx.org http://lists.lyx.org/mailman/listinfo/lyx-devel