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
