Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package emacs-jinx for openSUSE:Factory 
checked in at 2026-08-19 17:58:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/emacs-jinx (Old)
 and      /work/SRC/openSUSE:Factory/.emacs-jinx.new.1258 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "emacs-jinx"

Wed Aug 19 17:58:35 2026 rev:13 rq:1371839 version:2.10

Changes:
--------
--- /work/SRC/openSUSE:Factory/emacs-jinx/emacs-jinx.changes    2026-05-24 
19:36:13.052661490 +0200
+++ /work/SRC/openSUSE:Factory/.emacs-jinx.new.1258/emacs-jinx.changes  
2026-08-19 18:00:41.882112799 +0200
@@ -1,0 +2,12 @@
+Tue Aug 18 19:19:54 UTC 2026 - BjΓΆrn Kettunen <[email protected]>
+
+- Update to version 2.10:
+  * Let-bind parse-sexp-lookup-properties to nil during Jinx tokenization.
+    This avoids interference with the syntax-table property attached by some 
major modes like haskell-mode.
+  * Rename CHANGELOG.org to NEWS.org
+
+- Changes from version 2.9:
+  * New command jinx-remove-word to remove words from personal dictionary, 
file local variable, and so on.
+  * New customizable variable jinx-save-prop-line.
+
+-------------------------------------------------------------------

Old:
----
  jinx-2.8.obscpio

New:
----
  jinx-2.10.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ emacs-jinx.spec ++++++
--- /var/tmp/diff_new_pack.BslyBO/_old  2026-08-19 18:00:42.751143735 +0200
+++ /var/tmp/diff_new_pack.BslyBO/_new  2026-08-19 18:00:42.752143771 +0200
@@ -20,7 +20,7 @@
 %global _name    jinx
 
 Name:           emacs-%{_name}
-Version:        2.8
+Version:        2.10
 Release:        0
 Summary:        Enchanted Spell Checker for Emacs
 License:        GPL-3.0-or-later
@@ -55,7 +55,7 @@
 %check
 
 %files
-%doc README.org CHANGELOG.org
+%doc README.org NEWS.org
 %license LICENSE
 %{_emacs_sitelispdir}/%{_name}.el*
 %{_emacs_sitelispdir}/%{_name}-autoloads.el

++++++ jinx-2.8.obscpio -> jinx-2.10.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jinx-2.8/CHANGELOG.org new/jinx-2.10/CHANGELOG.org
--- old/jinx-2.8/CHANGELOG.org  2026-05-19 12:41:55.000000000 +0200
+++ new/jinx-2.10/CHANGELOG.org 1970-01-01 01:00:00.000000000 +0100
@@ -1,221 +0,0 @@
-#+title: jinx.el - Changelog
-#+author: Daniel Mendler
-#+language: en
-
-* Version 2.8 (2026-05-19)
-
-- Add support for minor modes to ~jinx-include-*~ and ~jinx-exclude-*~ 
variables.
-- Require Compat 31.
-
-* Version 2.7 (2026-03-09)
-
-- Improve mouse menu.
-
-* Version 2.6 (2026-01-17)
-
-- Use =when-let*= instead of =when-let=.
-- =jinx-next/previous=: Make argument optional.
-
-* Version 2.5 (2025-11-29)
-
-- Actions can be triggered via digit keys now.
-- Drop legacy =annotation-function=.
-
-* Version 2.4 (2025-10-13)
-
-- =jinx-exclude-properties=: New variable to exclude propertized text from
-  checking. Exclude =read-only= text by default.
-- Use =eager-display= for the default completion UI.
-- Require Emacs 29.
-
-* Version 2.3 (2025-07-28)
-
-- ~jinx-correct-all~: Show message if ~ONLY-CHECK~ is non-nil.
-
-* Version 2.2 (2025-05-26)
-
-- Stop using =enchant_dict_get_extra_word_characters=. Instead rely on the
-  =jinx--syntax-table= for tokenization.
-
-* Version 2.1 (2025-04-04)
-
-- ~jinx-correct~: For capitalized words, offer lower case variants to save in
-  personal dictionary and file local variables.
-- Add ~help-echo~ to the Jinx overlays.
-
-* Version 2.0 (2025-03-11)
-
-- Add ~jinx-dir-local-words~ saved in ~.dir-locals.el~. Words can be added to 
the
-  ~.dir-locals.el~ with the ~/~ key in the ~jinx-correct~ dialog. The 
~.dir-locals.el~
-  file of the current or a parent directory is used. If it does not exist it is
-  created in the project root or the current directory.
-
-* Version 1.12 (2025-01-28)
-
-- Improve performance in large folded Org buffers.
-- Support ~lisp-data-mode~.
-- Retain dictionaries in weak hash table for sharing.
-
-* Version 1.11 (2024-12-22)
-
-- Require Emacs 28.1.
-- Remove special ~org-fold~ code. Set ~org-fold-core-style~ to ~overlays~ if 
unfolding
-  in Org files does not work for you.
-- ~jinx-languages~: Group dictionaries by dictionary provider.
-
-* Version 1.10 (2024-07-23)
-
-- Bump Compat dependency to Compat 30.
-- Add include and linkpaths from FreeBSD for compilation.
-- Add ~jinx--syntax-overrides~ to override syntax table.
-
-* Version 1.9 (2024-06-29)
-
-- Bugfix: In some rare scenarios, Jinx could hang when checking pending 
regions.
-- ~jinx-correct-all~: Add ~ONLY-CHECK~ prefix argument.
-
-* Version 1.8 (2024-06-19)
-
-- Bugfix in ~jinx-correct~: Fix ~wrong-type-argument~ error if no Enchant
-  dictionaries are found.
-
-* Version 1.7 (2024-05-15)
-
-- ~jinx--word-valid-p~: Do not error on invalid characters.
-- ~jinx-save-languages~: New custom variable.
-
-* Version 1.6 (2024-04-12)
-
-- Bugfix (again): Ensure that directory local variables work correctly with
-  Jinx. It is possible to turn Jinx on or off via dir-locals, and also 
configure
-  the language and local words.
-
-* Version 1.5 (2024-04-04)
-
-- Bugfix: Ensure that ~jinx-next~ unfolds hidden misspellings.
-- Bugfix: Ensure that directory local variable enabling ~jinx-mode~ works.
-
-* Version 1.4 (2024-03-10)
-
-- Bugfix: Ensure that ~jinx-correct~ saves words without text properties in the
-  file-local variable ~jinx-local-words~.
-- Bugfix: Ensure that ~eval~ local variable enabling ~jinx-mode~ works.
-- ~jinx-correct~: If a region is marked, call ~jinx-correct-all~ and restrict
-  corrections to the marked region.
-- ~jinx-exclude-faces~, ~jinx-include-faces~, ~jinx-exclude-regexps~: Support 
mode
-  aliases.
-
-* Version 1.3 (2024-02-23)
-
-- Fix interaction bug with the newest version of AUCTeX, where the major mode
-  got changed unexpectedly.
-
-* Version 1.2 (2024-01-22)
-
-- Fix deadlock on MacOS during Jinx startup.
-- Timer optimizations.
-
-* Version 1.1 (2023-12-27)
-
-- Add mouse context menu to correct misspellings. The menu is triggered by a
-  right click on a misspelling.
-
-* Version 1.0 (2023-12-01)
-
-- Allow capitalized form of a word if non-capitalized word is stored in the
-  session word list.
-- Replace =jinx-excluded-modes= with =global-jinx-modes=, the Emacs 28 
convention
-  for globalized minor modes.
-- =jinx-correct=: Offer session words as suggestions.
-- Add =jinx-correct-nearest=, =jinx-correct-all= and =jinx-correct-word= 
commands. The
-  command =jinx-correct= dispatches to one of those commands depending on the
-  prefix argument.
-- Recommend libenchant 2.3.1 or newer. Print a message if Enchant is outdated.
-- Support $LANG=C and $LANG=POSIX environment variable settings.
-
-* Version 0.9 (2023-07-02)
-
-- πŸͺ„ Make sure that Emojis are not marked as misspelled πŸ§™πŸΌβ€β™€οΈ.
-- Rename =jinx-correct-next/previous= to =jinx-next/previous=. The commands 
can be
-  used outside the minibuffer.
-- Bind =M-n= and =M-p= to =jinx-next/previous= in =jinx-overlay-map=.
-- Bind =M-$= to =jinx-correct= in the =jinx-overlay-map=.
-- Add =jinx-repeat-map=.
-- Rename category of Jinx overlays to =jinx-overlay=.
-- Rename =jinx-misspelled-map= to =jinx-overlay-map=.
-- Add many more language modes to =jinx-camel-modes=.
-
-* Version 0.8 (2023-04-28)
-
-- =jinx-correct=: Consistently move backward to the previous misspelling. In 
order
-  to move backward further, press =M-$= again (or =M-p=). Move forward with 
=M-n=.
-- =jinx-correct-select=: Support more than 10 quick keys.
-- =jinx-languages=: New argument =LANGS=.
-- Add =jinx-faces= customization group.
-- Add configurable save actions via =jinx--save-keys=.
-- Detect C compiler via $CC or =executable-find=.
-
-* Version 0.7 (2023-04-21)
-
-- Bugfixes
-- =jinx-languages=: Only ask in file-backed buffers if file-local variable 
should
-  be saved.
-- Push =undo-boundary= before correcting a word, such that corrections are not
-  undone in a single step.
-- =jinx-correct=: Use =+= as prefix to add word to the current session.
-- Add =jinx-correct-map= bound in the =jinx-correct= minibuffer.
-- Add navigation keys to correction UI. The commands =jinx-correct-next= and
-  =jinx-correct-previous= are bound to the keys =M-n= and =M-p= in the
-  =jinx-correct-map= respectively. The commands accept prefix arguments to skip
-  over a number of misspellings.
-- Add quick selection keys to correction UI. The command =jinx-correct-select= 
is
-  bound to the keys =1= to =9= in the =jinx-correct-map=.
-- Try to locate the native module =jinx-mod.so= first on the =load-path= before
-  attempting to compile it. This is useful if the module is packed and 
installed
-  separately.
-
-* Version 0.6 (2023-04-17)
-
-- Fix the type of a few characters: =.= punctuation character, ='= word 
character, =%=
-  and =$= identifier characters.
-- Abandon =flyspell-mode-predicate= completely. Rely on faces only.
-- =jinx-languages=: The value must be a string now. Multiple language codes 
can be
-  separated by space.
-- =jinx-languages=: Ask if the file-local variable should be saved when 
changing
-  the language.
-- Add =jinx-local-words= to save file-local words. =jinx-correct= supports 
saving to
-  =jinx-local-words= by pressing =*=.
-- Add a lighter and a minor mode menu.
-- Avoid scheduling the idle timer while typing a word.
-
-* Version 0.5 (2023-04-05)
-
-- Add =jinx-languages= command to switch languages locally or globally.
-- =jinx-correct=: When checking the whole buffer via =C-u M-$=, don't restore
-  original point position upon =C-g= to ease cursory edits. Instead push a mark
-  which can be used to go back to the original position.
-- Add =jinx-mode-map= to make it easy to bind keys if =jinx-mode= is enabled. 
The
-  map is empty by default.
-- Ignore single quotes and apostrophes at the beginning and end of words. 
Please
-  provide feedback if this is a reasonable approach.
-- Support spell checking of camelCased words via the =jinx-camel-modes= 
variable.
-
-* Version 0.4 (2023-03-27)
-
-- =jinx-languages=: Fall back to =$LANG= environment variable, since
-  =current-locale-environment= is an Emacs 29 addition.
-- =jinx--mod-wordchars=: Handle non-UTF8 return values gracefully.
-- =jinx-correct=: Always start from nearest overlay.
-- =jinx-misspelled=: Use less obtrusive color for the underlining.
-
-* Version 0.3 (2023-03-27)
-
-- Add =jinx-misspelled-map=.
-- =jinx-correct=: Unfold invisible line when correcting misspellings.
-- =jinx-correct=: Show number of misspellings.
-- Add =emacs-module.h= to avoid compilation problems.
-- =jinx-languages=: Use =current-locale-environment= by default.
-
-* Version 0.2 (2023-03-26)
-
-- Start of changelog.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jinx-2.8/NEWS.org new/jinx-2.10/NEWS.org
--- old/jinx-2.8/NEWS.org       1970-01-01 01:00:00.000000000 +0100
+++ new/jinx-2.10/NEWS.org      2026-08-13 11:54:27.000000000 +0200
@@ -0,0 +1,233 @@
+#+title: jinx.el - News
+#+author: Daniel Mendler
+#+language: en
+
+* Version 2.10 (2026-08-13)
+
+- Let-bind =parse-sexp-lookup-properties= to nil during Jinx tokenization. This
+  avoids inference with the =syntax-table= property attached by some major 
modes
+  like =haskell-mode=.
+
+* Version 2.9 (2026-08-01)
+
+- New command =jinx-remove-word= to remove words from personal dictionary, file
+  local variable, and so on.
+- New customizable variable =jinx-save-prop-line=.
+
+* Version 2.8 (2026-05-19)
+
+- Add support for minor modes to ~jinx-include-*~ and ~jinx-exclude-*~ 
variables.
+- Require Compat 31.
+
+* Version 2.7 (2026-03-09)
+
+- Improve mouse menu.
+
+* Version 2.6 (2026-01-17)
+
+- Use =when-let*= instead of =when-let=.
+- =jinx-next/previous=: Make argument optional.
+
+* Version 2.5 (2025-11-29)
+
+- Actions can be triggered via digit keys now.
+- Drop legacy =annotation-function=.
+
+* Version 2.4 (2025-10-13)
+
+- =jinx-exclude-properties=: New variable to exclude propertized text from
+  checking. Exclude =read-only= text by default.
+- Use =eager-display= for the default completion UI.
+- Require Emacs 29.
+
+* Version 2.3 (2025-07-28)
+
+- ~jinx-correct-all~: Show message if ~ONLY-CHECK~ is non-nil.
+
+* Version 2.2 (2025-05-26)
+
+- Stop using =enchant_dict_get_extra_word_characters=. Instead rely on the
+  =jinx--syntax-table= for tokenization.
+
+* Version 2.1 (2025-04-04)
+
+- ~jinx-correct~: For capitalized words, offer lower case variants to save in
+  personal dictionary and file-local variables.
+- Add ~help-echo~ to the Jinx overlays.
+
+* Version 2.0 (2025-03-11)
+
+- Add ~jinx-dir-local-words~ saved in ~.dir-locals.el~. Words can be added to 
the
+  ~.dir-locals.el~ with the ~/~ key in the ~jinx-correct~ dialog. The 
~.dir-locals.el~
+  file of the current or a parent directory is used. If it does not exist it is
+  created in the project root or the current directory.
+
+* Version 1.12 (2025-01-28)
+
+- Improve performance in large folded Org buffers.
+- Support ~lisp-data-mode~.
+- Retain dictionaries in weak hash table for sharing.
+
+* Version 1.11 (2024-12-22)
+
+- Require Emacs 28.1.
+- Remove special ~org-fold~ code. Set ~org-fold-core-style~ to ~overlays~ if 
unfolding
+  in Org files does not work for you.
+- ~jinx-languages~: Group dictionaries by dictionary provider.
+
+* Version 1.10 (2024-07-23)
+
+- Bump Compat dependency to Compat 30.
+- Add include and linkpaths from FreeBSD for compilation.
+- Add ~jinx--syntax-overrides~ to override syntax table.
+
+* Version 1.9 (2024-06-29)
+
+- Bugfix: In some rare scenarios, Jinx could hang when checking pending 
regions.
+- ~jinx-correct-all~: Add ~ONLY-CHECK~ prefix argument.
+
+* Version 1.8 (2024-06-19)
+
+- Bugfix in ~jinx-correct~: Fix ~wrong-type-argument~ error if no Enchant
+  dictionaries are found.
+
+* Version 1.7 (2024-05-15)
+
+- ~jinx--word-valid-p~: Do not error on invalid characters.
+- ~jinx-save-languages~: New custom variable.
+
+* Version 1.6 (2024-04-12)
+
+- Bugfix (again): Ensure that directory-local variables work correctly with
+  Jinx. It is possible to turn Jinx on or off via dir-locals, and also 
configure
+  the language and local words.
+
+* Version 1.5 (2024-04-04)
+
+- Bugfix: Ensure that ~jinx-next~ unfolds hidden misspellings.
+- Bugfix: Ensure that directory-local variable enabling ~jinx-mode~ works.
+
+* Version 1.4 (2024-03-10)
+
+- Bugfix: Ensure that ~jinx-correct~ saves words without text properties in the
+  file-local variable ~jinx-local-words~.
+- Bugfix: Ensure that ~eval~ local variable enabling ~jinx-mode~ works.
+- ~jinx-correct~: If a region is marked, call ~jinx-correct-all~ and restrict
+  corrections to the marked region.
+- ~jinx-exclude-faces~, ~jinx-include-faces~, ~jinx-exclude-regexps~: Support 
mode
+  aliases.
+
+* Version 1.3 (2024-02-23)
+
+- Fix interaction bug with the newest version of AUCTeX, where the major mode
+  got changed unexpectedly.
+
+* Version 1.2 (2024-01-22)
+
+- Fix deadlock on MacOS during Jinx startup.
+- Timer optimizations.
+
+* Version 1.1 (2023-12-27)
+
+- Add mouse context menu to correct misspellings. The menu is triggered by a
+  right click on a misspelling.
+
+* Version 1.0 (2023-12-01)
+
+- Allow capitalized form of a word if non-capitalized word is stored in the
+  session word list.
+- Replace =jinx-excluded-modes= with =global-jinx-modes=, the Emacs 28 
convention
+  for globalized minor modes.
+- =jinx-correct=: Offer session words as suggestions.
+- Add =jinx-correct-nearest=, =jinx-correct-all= and =jinx-correct-word= 
commands. The
+  command =jinx-correct= dispatches to one of those commands depending on the
+  prefix argument.
+- Recommend libenchant 2.3.1 or newer. Print a message if Enchant is outdated.
+- Support $LANG=C and $LANG=POSIX environment variable settings.
+
+* Version 0.9 (2023-07-02)
+
+- πŸͺ„ Make sure that Emojis are not marked as misspelled πŸ§™πŸΌβ€β™€οΈ.
+- Rename =jinx-correct-next/previous= to =jinx-next/previous=. The commands 
can be
+  used outside the minibuffer.
+- Bind =M-n= and =M-p= to =jinx-next/previous= in =jinx-overlay-map=.
+- Bind =M-$= to =jinx-correct= in the =jinx-overlay-map=.
+- Add =jinx-repeat-map=.
+- Rename category of Jinx overlays to =jinx-overlay=.
+- Rename =jinx-misspelled-map= to =jinx-overlay-map=.
+- Add many more language modes to =jinx-camel-modes=.
+
+* Version 0.8 (2023-04-28)
+
+- =jinx-correct=: Consistently move backward to the previous misspelling. In 
order
+  to move backward further, press =M-$= again (or =M-p=). Move forward with 
=M-n=.
+- =jinx-correct-select=: Support more than 10 quick keys.
+- =jinx-languages=: New argument =LANGS=.
+- Add =jinx-faces= customization group.
+- Add configurable save actions via =jinx--save-keys=.
+- Detect C compiler via $CC or =executable-find=.
+
+* Version 0.7 (2023-04-21)
+
+- Bugfixes
+- =jinx-languages=: Only ask in file-backed buffers if file-local variable 
should
+  be saved.
+- Push =undo-boundary= before correcting a word, such that corrections are not
+  undone in a single step.
+- =jinx-correct=: Use =+= as prefix to add word to the current session.
+- Add =jinx-correct-map= bound in the =jinx-correct= minibuffer.
+- Add navigation keys to correction UI. The commands =jinx-correct-next= and
+  =jinx-correct-previous= are bound to the keys =M-n= and =M-p= in the
+  =jinx-correct-map= respectively. The commands accept prefix arguments to skip
+  over a number of misspellings.
+- Add quick selection keys to correction UI. The command =jinx-correct-select= 
is
+  bound to the keys =1= to =9= in the =jinx-correct-map=.
+- Try to locate the native module =jinx-mod.so= first on the =load-path= before
+  attempting to compile it. This is useful if the module is packed and 
installed
+  separately.
+
+* Version 0.6 (2023-04-17)
+
+- Fix the type of a few characters: =.= punctuation character, ='= word 
character, =%=
+  and =$= identifier characters.
+- Abandon =flyspell-mode-predicate= completely. Rely on faces only.
+- =jinx-languages=: The value must be a string now. Multiple language codes 
can be
+  separated by space.
+- =jinx-languages=: Ask if the file-local variable should be saved when 
changing
+  the language.
+- Add =jinx-local-words= to save file-local words. =jinx-correct= supports 
saving to
+  =jinx-local-words= by pressing =*=.
+- Add a lighter and a minor mode menu.
+- Avoid scheduling the idle timer while typing a word.
+
+* Version 0.5 (2023-04-05)
+
+- Add =jinx-languages= command to switch languages locally or globally.
+- =jinx-correct=: When checking the whole buffer via =C-u M-$=, don't restore
+  original point position upon =C-g= to ease cursory edits. Instead push a mark
+  which can be used to go back to the original position.
+- Add =jinx-mode-map= to make it easy to bind keys if =jinx-mode= is enabled. 
The
+  map is empty by default.
+- Ignore single quotes and apostrophes at the beginning and end of words. 
Please
+  provide feedback if this is a reasonable approach.
+- Support spell checking of camelCased words via the =jinx-camel-modes= 
variable.
+
+* Version 0.4 (2023-03-27)
+
+- =jinx-languages=: Fall back to =$LANG= environment variable, since
+  =current-locale-environment= is an Emacs 29 addition.
+- =jinx--mod-wordchars=: Handle non-UTF8 return values gracefully.
+- =jinx-correct=: Always start from nearest overlay.
+- =jinx-misspelled=: Use less obtrusive color for the underlining.
+
+* Version 0.3 (2023-03-27)
+
+- Add =jinx-misspelled-map=.
+- =jinx-correct=: Unfold invisible line when correcting misspellings.
+- =jinx-correct=: Show number of misspellings.
+- Add =emacs-module.h= to avoid compilation problems.
+- =jinx-languages=: Use =current-locale-environment= by default.
+
+* Version 0.2 (2023-03-26)
+
+- Start of changelog.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jinx-2.8/README.org new/jinx-2.10/README.org
--- old/jinx-2.8/README.org     2026-05-19 12:41:55.000000000 +0200
+++ new/jinx-2.10/README.org    2026-08-13 11:54:27.000000000 +0200
@@ -9,8 +9,8 @@
 #+html: <a href="https://www.gnu.org/software/emacs/";><img alt="GNU Emacs" 
src="https://github.com/minad/corfu/blob/screenshots/emacs.svg?raw=true"/></a>
 #+html: <a href="https://elpa.gnu.org/packages/jinx.html";><img alt="GNU ELPA" 
src="https://elpa.gnu.org/packages/jinx.svg"/></a>
 #+html: <a href="https://elpa.gnu.org/devel/jinx.html";><img alt="GNU-devel 
ELPA" src="https://elpa.gnu.org/devel/jinx.svg"/></a>
-#+html: <a href="https://melpa.org/#/jinx";><img alt="MELPA" 
src="https://melpa.org/packages/jinx-badge.svg"/></a>
-#+html: <a href="https://stable.melpa.org/#/jinx";><img alt="MELPA Stable" 
src="https://stable.melpa.org/packages/jinx-badge.svg"/></a>
+#+html: <a href="https://releases.melpa.org/#/jinx";><img alt="MELPA Releases" 
src="https://releases.melpa.org/packages/jinx-badge.svg"/></a>
+#+html: <a href="https://snapshots.melpa.org/#/jinx";><img alt="MELPA 
Snapshots" src="https://snapshots.melpa.org/packages/jinx-badge.svg"/></a>
 
 Jinx is a fast just-in-time spell-checker for Emacs. Jinx highlights misspelled
 words in the text of the visible portion of the buffer. For efficiency, Jinx
@@ -28,7 +28,8 @@
 API of the [[https://rrthomas.github.io/enchant/][Enchant library]]. Jinx 
automatically compiles =jinx-mod.c= and loads the
 dynamic module at startup. By binding directly to the native Enchant API, Jinx
 avoids slower inter-process communication. Enchant is used by other text 
editors
-and supports multiple backends like [[https://nuspell.github.io/][Nuspell]], 
[[https://hunspell.github.io/][Hunspell]] and [[http://aspell.net/][Aspell]].
+and supports multiple backends like [[https://nuspell.github.io/][Nuspell]], 
[[https://hunspell.github.io/][Hunspell]] and [[http://aspell.net/][Aspell]], 
and the system
+spell checkers of Mac or Windows.
 
 Jinx supports spell-checking multiple languages in the same buffer. See the
 =jinx-languages= variable to customize for multiple languages. Jinx can 
flexibly
@@ -42,7 +43,7 @@
 
 * Installation
 
-Jinx can be installed from [[https://elpa.gnu.org/packages/jinx.html][ELPA]] 
or [[https://melpa.org/#/jinx][MELPA]] directly with =package-install=.
+Jinx can be installed from [[https://elpa.gnu.org/packages/jinx.html][ELPA]] 
or [[https://releases.melpa.org/#/jinx][MELPA]] directly with =package-install=.
 
 Your Emacs must be compiled with dynamic module support. Furthermore a C
 compiler must be available on your system (=gcc= or =clang=). Jinx requires
@@ -118,7 +119,8 @@
 Suggested corrections will be displayed as a completion menu. You can press the
 displayed digit keys to quickly select a suggestion. Furthermore the menu 
offers
 options to save the word temporarily for the current session, in the personal
-dictionary or in the file-local or directory-local variables.
+dictionary or in the file-local or directory-local variables. Words can be
+removed from these places again via =M-x jinx-remove-word=.
 
 You can enter arbitrary input at the correction prompt in order to make the
 correction or to store a modified word in the personal dictionary. For example
@@ -130,10 +132,12 @@
 =jinx-next= and =jinx-previous= respectively and allow you to move the next and
 previous misspelled word.
 
-The completion menu is compatible with all popular completion UIs: Vertico, 
Mct,
-Icomplete, Ivy, Helm and the default completions buffer. In case you use 
Vertico
-I suggest that you tweak the completion display via =vertico-multiform-mode= 
for
-the completion category =jinx=. You can for example use the grid display such 
that
+* Completion configuration
+
+The completion menu is compatible with the popular completion UIs: Vertico, 
Mct,
+Icomplete, Helm and the default completions buffer. In case you use Vertico I
+suggest that you tweak the completion display via =vertico-multiform-mode= for 
the
+completion category =jinx=. You can for example use the grid display such that
 more suggestions fit on the screen and enable annotations.
 
 #+begin_src emacs-lisp
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jinx-2.8/jinx-mod.c new/jinx-2.10/jinx-mod.c
--- old/jinx-2.8/jinx-mod.c     2026-05-19 12:41:55.000000000 +0200
+++ new/jinx-2.10/jinx-mod.c    2026-08-13 11:54:27.000000000 +0200
@@ -80,11 +80,8 @@
 static emacs_value jinx_dict(emacs_env* env, ptrdiff_t jinx_unused(nargs),
                              emacs_value args[], void* jinx_unused(data)) {
     jinx_autofree char* str = jinx_cstr(env, args[0]);
-    EnchantDict* dict =
-        str ? enchant_broker_request_dict(jinx_broker(), str) : 0;
-    return dict
-        ? env->make_user_ptr(env, jinx_free_dict, dict)
-        : Qnil;
+    EnchantDict* dict = str ? enchant_broker_request_dict(jinx_broker(), str) 
: 0;
+    return dict ? env->make_user_ptr(env, jinx_free_dict, dict) : Qnil;
 }
 
 static void jinx_describe_cb(const char* const lang_tag,
@@ -135,7 +132,7 @@
     jinx_autofree char* str = jinx_cstr(env, args[1]);
     // Do not error in the checking function (Non-Unicode strings)
     env->non_local_exit_clear(env);
-    return !dict || !str || enchant_dict_check(dict, str, -1) ? Qnil : Qt;
+    return dict && str && !enchant_dict_check(dict, str, -1) ? Qt : Qnil;
 }
 
 static emacs_value jinx_add(emacs_env* env, ptrdiff_t jinx_unused(nargs),
@@ -147,6 +144,22 @@
     return Qnil;
 }
 
+static emacs_value jinx_remove(emacs_env* env, ptrdiff_t jinx_unused(nargs),
+                            emacs_value args[], void* jinx_unused(data)) {
+    EnchantDict* dict = env->get_user_ptr(env, args[0]);
+    jinx_autofree char* str = jinx_cstr(env, args[1]);
+    if (dict && str)
+        enchant_dict_remove(dict, str, -1);
+    return Qnil;
+}
+
+static emacs_value jinx_has(emacs_env* env, ptrdiff_t jinx_unused(nargs),
+                            emacs_value args[], void* jinx_unused(data)) {
+    EnchantDict* dict = env->get_user_ptr(env, args[0]);
+    jinx_autofree char* str = jinx_cstr(env, args[1]);
+    return dict && str && enchant_dict_is_added(dict, str, -1) ? Qt : Qnil;
+}
+
 static emacs_value jinx_suggest(emacs_env* env, ptrdiff_t jinx_unused(nargs),
                                 emacs_value args[], void* jinx_unused(data)) {
     EnchantDict* dict = env->get_user_ptr(env, args[0]);
@@ -175,6 +188,8 @@
     jinx_defun(env, "jinx--mod-suggest", 2, 2, jinx_suggest);
     jinx_defun(env, "jinx--mod-check", 2, 2, jinx_check);
     jinx_defun(env, "jinx--mod-add", 2, 2, jinx_add);
+    jinx_defun(env, "jinx--mod-remove", 2, 2, jinx_remove);
+    jinx_defun(env, "jinx--mod-has", 2, 2, jinx_has);
     jinx_defun(env, "jinx--mod-dict", 1, 1, jinx_dict);
     jinx_defun(env, "jinx--mod-langs", 0, 0, jinx_langs);
     jinx_defun(env, "jinx--mod-describe", 1, 1, jinx_describe);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jinx-2.8/jinx.el new/jinx-2.10/jinx.el
--- old/jinx-2.8/jinx.el        2026-05-19 12:41:55.000000000 +0200
+++ new/jinx-2.10/jinx.el       2026-08-13 11:54:27.000000000 +0200
@@ -5,7 +5,7 @@
 ;; Author: Daniel Mendler <[email protected]>
 ;; Maintainer: Daniel Mendler <[email protected]>
 ;; Created: 2023
-;; Version: 2.8
+;; Version: 2.10
 ;; Package-Requires: ((emacs "29.1") (compat "31"))
 ;; URL: https://github.com/minad/jinx
 ;; Keywords: convenience, text
@@ -83,15 +83,17 @@
   "Dictionary language codes, as a string separated by whitespace."
   :type 'string)
 
+(defcustom jinx-save-prop-line nil
+  "Save file-local variables in the prop line.
+By default use the \"Local Variables\" comment block."
+  :type 'boolean)
+
 (defcustom jinx-save-languages 'ask
   "Save the variable `jinx-languages' as file-local variable?"
   :type '(choice (const :tag "Never"  nil)
                  (const :tag "Always" t)
                  (const :tag "Ask"    ask)))
 
-;;;###autoload
-(put 'jinx-languages 'safe-local-variable #'stringp)
-
 (defcustom jinx-include-faces
   '((prog-mode font-lock-comment-face
                font-lock-doc-face
@@ -201,6 +203,7 @@
 
 ;;;###autoload
 (progn
+  (put 'jinx-languages 'safe-local-variable #'stringp)
   (put 'jinx-local-words 'safe-local-variable #'stringp)
   (put 'jinx-dir-local-words 'safe-local-variable #'stringp)
   (put 'jinx-mode 'safe-local-variable #'not))
@@ -280,6 +283,7 @@
     ["Correct word" jinx-correct-word
      :keys "\\[universal-argument] \\[universal-argument] \\[jinx-correct]"]
     ["Change languages" jinx-languages]
+    ["Remove word" jinx-remove-word]
     "----"
     ["Manual" (info "(jinx)")]
     ["Customize" (customize-group 'jinx)]
@@ -366,6 +370,8 @@
 (defvar jinx-mode)
 (declare-function jinx--mod-check "ext:jinx-mod.c")
 (declare-function jinx--mod-add "ext:jinx-mod.c")
+(declare-function jinx--mod-remove "ext:jinx-mod.c")
+(declare-function jinx--mod-has "ext:jinx-mod.c")
 (declare-function jinx--mod-suggest "ext:jinx-mod.c")
 (declare-function jinx--mod-dict "ext:jinx-mod.c")
 (declare-function jinx--mod-describe "ext:jinx-mod.c")
@@ -424,10 +430,9 @@
       ;; Allow capitalized words
       (let (case-fold-search)
         (and (string-match-p "\\`[[:upper:]][[:lower:]]+\\'" word)
-             (cl-loop
-              for w in jinx--session-words
-              thereis (and (string-equal-ignore-case word w)
-                           (string-match-p "\\`[[:lower:]]+\\'" w)))))
+             (cl-loop for w in jinx--session-words
+                      thereis (and (string-equal-ignore-case word w)
+                                   (string-match-p "\\`[[:lower:]]+\\'" w)))))
       (cl-loop for dict in jinx--dicts
                thereis (jinx--mod-check dict word))))
 
@@ -476,56 +481,52 @@
   "Check region between START and END.
 Optionally RETRY word at given position.  Return updated END
 position."
-  (let ((st (syntax-table)) case-fold-search
-        retry-start retry-end)
-    (unwind-protect
-        (with-silent-modifications
-          (save-excursion
-            (save-match-data
-              ;; Use dictionary-dependent syntax table
-              (set-syntax-table jinx--syntax-table)
-              ;; Ensure that region starts and ends at word boundaries
-              (goto-char start)
-              (unless (looking-at-p "\\<")
-                (re-search-backward "\\<\\|^")
-                (setq start (match-beginning 0)))
-              (goto-char end)
-              (unless (looking-at-p "\\>")
-                (re-search-forward "\\>\\|$")
-                (setq end (match-beginning 0)))
-              (jinx--delete-overlays start end)
-              (goto-char start)
-              (while (re-search-forward "\\<\\w+\\>" end t)
-                (let ((word-start (match-beginning 0))
-                      (word-end (match-end 0)))
-                  ;; No quote or apostrophe at start or end
-                  (while (and (< word-start word-end)
-                              (let ((c (char-after word-start)))
-                                (or (= c ?') (= c ?’))))
-                    (incf word-start))
-                  (while (and (< word-start word-end)
-                              (let ((c (char-before word-end)))
-                                (or (= c ?') (= c ?’))))
-                    (decf word-end))
-                  (while (< word-start word-end)
-                    (let ((subword-end word-end))
-                      (when jinx--camel
-                        (goto-char word-start)
-                        (when (looking-at 
"\\([[:upper:]]?[[:lower:]]+\\)\\(?:[[:upper:]][[:lower:]]+\\)+\\>")
-                          (setq subword-end (match-end 1))))
-                      (goto-char subword-end)
-                      (pcase (run-hook-with-args-until-success 
'jinx--predicates word-start)
-                        ((and (pred integerp) skip)
-                         (goto-char (max subword-end (min end skip))))
-                        ('nil
-                         (if (and retry (<= word-start retry subword-end))
-                             (setq retry-start word-start retry-end 
subword-end retry nil)
-                           (overlay-put (make-overlay word-start subword-end) 
'category 'jinx-overlay))))
-                      (setq word-start subword-end)))))
-              (remove-list-of-text-properties start end '(jinx--pending))
-              (when retry-start
-                (put-text-property retry-start retry-end 'jinx--pending t)))))
-      (set-syntax-table st))))
+  (let (parse-sexp-lookup-properties case-fold-search retry-start retry-end)
+    (with-silent-modifications
+      (save-excursion
+        (save-match-data
+          (with-syntax-table jinx--syntax-table
+            ;; Ensure that region starts and ends at word boundaries
+            (goto-char start)
+            (unless (looking-at-p "\\<")
+              (re-search-backward "\\<\\|^")
+              (setq start (match-beginning 0)))
+            (goto-char end)
+            (unless (looking-at-p "\\>")
+              (re-search-forward "\\>\\|$")
+              (setq end (match-beginning 0)))
+            (remove-overlays start end 'category 'jinx-overlay)
+            (goto-char start)
+            (while (re-search-forward "\\<\\w+\\>" end t)
+              (let ((word-start (match-beginning 0))
+                    (word-end (match-end 0)))
+                ;; No quote or apostrophe at start or end
+                (while (and (< word-start word-end)
+                            (let ((c (char-after word-start)))
+                              (or (= c ?') (= c ?’))))
+                  (incf word-start))
+                (while (and (< word-start word-end)
+                            (let ((c (char-before word-end)))
+                              (or (= c ?') (= c ?’))))
+                  (decf word-end))
+                (while (< word-start word-end)
+                  (let ((subword-end word-end))
+                    (when jinx--camel
+                      (goto-char word-start)
+                      (when (looking-at 
"\\([[:upper:]]?[[:lower:]]+\\)\\(?:[[:upper:]][[:lower:]]+\\)+\\>")
+                        (setq subword-end (match-end 1))))
+                    (goto-char subword-end)
+                    (pcase (run-hook-with-args-until-success 'jinx--predicates 
word-start)
+                      ((and (pred integerp) skip)
+                       (goto-char (max subword-end (min end skip))))
+                      ('nil
+                       (if (and retry (<= word-start retry subword-end))
+                           (setq retry-start word-start retry-end subword-end 
retry nil)
+                         (overlay-put (make-overlay word-start subword-end) 
'category 'jinx-overlay))))
+                    (setq word-start subword-end)))))
+            (remove-list-of-text-properties start end '(jinx--pending))
+            (when retry-start
+              (put-text-property retry-start retry-end 'jinx--pending t))))))))
 
 (defun jinx--get-overlays (start end &optional visible)
   "Return misspelled word overlays between START and END.
@@ -556,17 +557,11 @@
       (user-error "No misspelled word in %s"
                   (if visible "visible text" (format "buffer `%s'" 
(buffer-name))))))
 
-(defun jinx--delete-overlays (start end)
-  "Delete overlays between START and END."
-  (dolist (ov (overlays-in start end))
-    (when (eq (overlay-get ov 'category) 'jinx-overlay)
-      (delete-overlay ov))))
-
 (defun jinx--cleanup ()
   "Cleanup all overlays and trigger fontification."
   (with-silent-modifications
     (without-restriction
-      (jinx--delete-overlays (point-min) (point-max))
+      (remove-overlays nil nil 'category 'jinx-overlay)
       (remove-list-of-text-properties (point-min) (point-max) '(jinx--pending))
       (jinx--in-base-buffer #'jit-lock-refontify))))
 
@@ -765,14 +760,10 @@
     (dolist (w (jinx--session-suggestions word))
       (jinx--add-suggestion list ht w "Suggestions from session"))
     (cl-loop
-     for (key . fun) in jinx--save-keys
-     for actions = (funcall fun nil key word) do
-     (when (and actions (not (consp (car actions))))
-       (setq actions (list actions)))
+     for (key . fun) in jinx--save-keys do
      (cl-loop
-      for (k w a) in actions
-      for k2 = (propertize (if (stringp k) k (char-to-string k))
-                           'face 'jinx-save 'rear-nonsticky t)
+      for (k w a) in (funcall fun 'format key word)
+      for k2 = (propertize k 'face 'jinx-save 'rear-nonsticky t)
       for a2 = (format #(" [%s]" 0 5 (face jinx-annotation)) a)
       do (cl-loop
           for w2 in (list w (downcase w)) do
@@ -820,7 +811,7 @@
            (len (length choice)))
       (pcase (and (> len 0) (assq (aref choice 0) jinx--save-keys))
         (`(,key . ,fun)
-         (funcall fun 'save key
+         (funcall fun 'add key
                   (if (> len 1) (substring-no-properties choice 1) word))
          (jinx--recheck-overlays))
         ((guard (not (equal choice word)))
@@ -856,13 +847,11 @@
         (cl-loop for w in suggestions repeat jinx-menu-suggestions do
           (push `[,w (jinx--correct-replace ,ov ,w)] menu)))
       (let ((submenu (list "Accept and save")))
-        (cl-loop for (key . fun) in jinx--save-keys
-                 for actions = (funcall fun nil key word) do
-                 (unless (consp (car actions)) (setq actions (list actions)))
-                 (cl-loop for (k w a) in actions do
+        (cl-loop for (key . fun) in jinx--save-keys do
+                 (cl-loop for (k w a) in (funcall fun 'format key word) do
                           (push `[,a (jinx-correct-word
                                       ,(overlay-start ov) ,(overlay-end ov)
-                                      ,(concat (if (stringp k) k 
(char-to-string k)) w))]
+                                      ,(concat k w))]
                                 submenu)))
         (push (nreverse submenu) menu))
       (easy-menu-create-menu (format "Correct \"%s\"" word)
@@ -880,14 +869,15 @@
     (message "Jinx: No dictionaries available for %S" jinx-languages)))
 
 (defun jinx--bounds-of-word ()
-  "Return bounds of word at point using `jinx--syntax-table'."
-  (save-excursion
-    (save-match-data
-      (with-syntax-table jinx--syntax-table
-        (unless (looking-at-p "\\<")
-          (re-search-backward "\\<"))
-        (when (re-search-forward "\\<\\w+\\>" nil t)
-          (cons (match-beginning 0) (match-end 0)))))))
+  "Return bounds of word at point."
+  (let (parse-sexp-lookup-properties case-fold-search)
+    (save-excursion
+      (save-match-data
+        (with-syntax-table jinx--syntax-table
+          (unless (looking-at-p "\\<")
+            (re-search-backward "\\<" nil t))
+          (when (re-search-forward "\\<\\w+\\>" nil t)
+            (cons (match-beginning 0) (match-end 0))))))))
 
 (defun jinx--read-languages ()
   "Read languages via `completing-read-multiple'."
@@ -905,66 +895,84 @@
            (user-error "No languages selected"))
        " ")))
 
-(defun jinx--add-local-word (var word)
-  "Add WORD to local word list VAR."
-  (add-to-list 'jinx--session-words word)
-  (set var
-       (string-join
-        (sort (delete-dups (cons word (split-string (symbol-value var))))
-              #'string<)
-        " ")))
+(defun jinx--save-local-word (action var word)
+  "Add/remove WORD to/from local word list VAR.
+ACTION can be add or remove."
+  (let ((list (split-string (symbol-value var))))
+    (pcase-exhaustive action
+      ('add
+       (push word list)
+       (add-to-list 'jinx--session-words word))
+      ('remove
+       (cl-callf2 remove word list)
+       (cl-callf2 remove word jinx--session-words)))
+    (set var (string-join (sort (delete-dups list) #'string<) " "))))
+
+(defun jinx--add-file-local (var &optional delete)
+  "Add file-local variable VAR, optionally DELETE."
+  (apply (intern (concat (if delete "delete-" "add-")
+                         "file-local-variable"
+                         (and jinx-save-prop-line "-prop-line")))
+         var (and (not delete) (list (symbol-value var)))))
 
 ;;;; Save functions
 
-(defun jinx--save-personal (save key word)
-  "Save WORD in personal dictionary.
-If SAVE is non-nil save, otherwise format candidate given action KEY."
-  (if save
-      (let ((idx (seq-position word key (lambda (x y) (not (equal x y))))))
-        (jinx--mod-add (or (nth idx jinx--dicts)
-                           (user-error "Invalid dictionary"))
-                       (substring word idx)))
-    (cl-loop
-     for dict in jinx--dicts for idx from 1
-     for at = (make-string idx key)
-     for ann = (format "Personal:%s" (car (jinx--mod-describe dict))) collect
-     (list at word ann))))
-
-(defun jinx--save-file (save key word)
-  "Save WORD in file-local variable.
-If SAVE is non-nil save, otherwise format candidate given action KEY."
-  (if save
-      (progn
-        (jinx--add-local-word 'jinx-local-words word)
-        (add-file-local-variable 'jinx-local-words jinx-local-words))
-    (list key word "File")))
+(defun jinx--save-personal (action key word)
+  "Add or remove WORD from personal dictionary, or format word with KEY.
+ACTION can be add, remove, has, format."
+  (let* ((idx (seq-position word key (lambda (x y) (not (equal x y)))))
+         (dict (or (nth idx jinx--dicts) (user-error "Invalid dictionary")))
+         (word (substring word idx)))
+    (pcase-exhaustive action
+      ('add (jinx--mod-add dict word))
+      ('remove (jinx--mod-remove dict word))
+      ('has (jinx--mod-has dict word))
+      ('format
+       (cl-loop
+        for dict in jinx--dicts for idx from 1 collect
+        (list (make-string idx key) word
+              (format "Personal:%s" (car (jinx--mod-describe dict)))))))))
+
+(defun jinx--save-file (action key word)
+  "Add or remove WORD from file-local variable, or format word with KEY.
+ACTION can be add, remove, has, format."
+  (pcase-exhaustive action
+    ((or 'add 'remove)
+     (jinx--save-local-word action 'jinx-local-words word)
+     (jinx--add-file-local 'jinx-local-words (equal jinx-local-words "")))
+    ('has (member word (split-string jinx-local-words)))
+    ('format `((,(char-to-string key) ,word "File")))))
 
-(defun jinx--save-dir (save key word)
-  "Save WORD in directory-local variable.
+(defun jinx--save-dir (action key word)
+  "Add or remove WORD from directory-local variable, or format word with KEY.
 Uses a .dir-locals.el file in the current directory or any parent
 directory.  If no .dir-locals.el file is found, it is created in the
 project root.  If no project root is found, it is created in the current
-directory.  If SAVE is non-nil save, otherwise format candidate given
-action KEY."
-  (if save
-      (progn
-        (jinx--add-local-word 'jinx-dir-local-words word)
-        (let ((default-directory
-               (or (locate-dominating-file default-directory ".dir-locals.el")
-                   (when-let* ((proj (project-current)))
-                     (declare-function project-root "project")
-                     (project-root proj))
-                   default-directory)))
-          (save-window-excursion
-            (add-dir-local-variable nil 'jinx-dir-local-words 
jinx-dir-local-words))))
-    (list key word "Directory")))
-
-(defun jinx--save-session (save key word)
-  "Save WORD for the current session.
-If SAVE is non-nil save, otherwise format candidate given action KEY."
-  (if save
-      (add-to-list 'jinx--session-words word)
-    (list key word "Session")))
+directory.  ACTION can be add, remove, has, format."
+  (pcase-exhaustive action
+    ((or 'add 'remove)
+     (jinx--save-local-word action 'jinx-dir-local-words word)
+     (let ((default-directory
+            (or (locate-dominating-file default-directory ".dir-locals.el")
+                (when-let* ((proj (project-current)))
+                  (declare-function project-root "project")
+                  (project-root proj))
+                default-directory)))
+       (save-window-excursion
+         (if (equal jinx-dir-local-words "")
+             (delete-dir-local-variable nil 'jinx-dir-local-words)
+           (add-dir-local-variable nil 'jinx-dir-local-words 
jinx-dir-local-words)))))
+    ('has (member word (split-string jinx-dir-local-words)))
+    ('format `((,(char-to-string key) ,word "Directory")))))
+
+(defun jinx--save-session (action key word)
+  "Add or remove WORD from current session, or format word with KEY.
+ACTION can be add, remove, has, format."
+  (pcase-exhaustive action
+    ('add (add-to-list 'jinx--session-words word))
+    ('remove (cl-callf2 remove word jinx--session-words))
+    ('has (member word jinx--session-words))
+    ('format `((,(char-to-string key) ,word "Session")))))
 
 ;;;; Public commands
 
@@ -989,7 +997,7 @@
                   (and buffer-file-name
                        (y-or-n-p "Save `jinx-languages' as file-local 
variable? "))
                 jinx-save-languages))
-      (add-file-local-variable 'jinx-languages jinx-languages)
+      (jinx--add-file-local 'jinx-languages)
       (setf (alist-get 'jinx-languages file-local-variables-alist) 
jinx-languages))))
   (jinx--load-dicts)
   (jinx--cleanup))
@@ -1053,6 +1061,39 @@
          (setf (cons start end) bounds
                initial nil))))))
 
+(defun jinx-remove-word ()
+  "Remove word from personal dictionary, session, etc.
+The word and dictionary are read via the minibuffer.  The word defaults
+to the word at point."
+  (interactive nil jinx-mode)
+  (let* ((word (read-string
+                "Remove word: "
+                (pcase (jinx--bounds-of-word)
+                  (`(,start . ,end)
+                   (buffer-substring-no-properties start end)))))
+         (_ (when (equal word "") (user-error "No input")))
+         (actions
+          (cl-loop for (key . fun) in jinx--save-keys nconc
+                   (cl-loop for (k w a) in (funcall fun 'format key word)
+                            for kw = (concat (substring k 1) w)
+                            if (funcall fun 'has key kw)
+                            collect (list a fun 'remove key kw))))
+         (choice
+          (or (assoc
+               (completing-read
+                (format "Remove β€˜%s’ from: " word)
+                (completion-table-with-metadata
+                 (or actions
+                     (user-error "Word β€˜%s’ is not saved anywhere" word))
+                 `((eager-display . t)
+                   (display-sort-function . ,#'identity)
+                   (cycle-sort-function . ,#'identity)))
+                nil nil nil t)
+               actions)
+              (user-error "No selection"))))
+    (apply (cdr choice))
+    (jinx--cleanup)))
+
 ;;;###autoload
 (defun jinx-correct (&optional arg)
   "Correct word depending on prefix ARG.

++++++ jinx.obsinfo ++++++
--- /var/tmp/diff_new_pack.BslyBO/_old  2026-08-19 18:00:42.917149645 +0200
+++ /var/tmp/diff_new_pack.BslyBO/_new  2026-08-19 18:00:42.922149823 +0200
@@ -1,5 +1,5 @@
 name: jinx
-version: 2.8
-mtime: 1779187315
-commit: 987b9f90eb10df53c34c0f4972469875c1e93203
+version: 2.10
+mtime: 1786614867
+commit: f776ca306801f3b4d26a458d5109ea586d52e716
 

Reply via email to