To install this package, run in Emacs:
M-x package-install RET jinx RET
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 highlights misspellings lazily, recognizes window boundaries and text folding, if any. For example, when unfolding or scrolling, only the newly visible part of the text is checked if it has not been checked before. Each misspelling can be corrected from a list of dictionary words presented as a completion menu.
Installing Jinx is straight-forward and configuring takes not much intervention. Jinx can safely co-exist with Emacs's built-in spell-checker.
Jinx's high performance and low resource usage comes from directly calling the
widely-used API of the Enchant library (see libenchant). Jinx automatically
compiles jinx-mod.c
and loads the dynamic module at startup. By binding directly
to the native Enchant API, Jinx avoids the slower backend process communication
with Aspell. Thanks to the Enchant API, this method is widely used by other text
editors and supports Nuspell, Hunspell, Aspell and a few lesser known backends.
Jinx supports spell-checking multiple languages in the same buffer. See the
jinx-languages
variable to customize for multiple languages. Jinx can flexibly
ignore misspellings via faces (jinx-exclude-faces
and jinx-include-faces
),
regular expressions (jinx-exclude-regexps
), and programmable predicates. Jinx
comes preconfigured for the most important Emacs major modes. For modes listed
in jinx-camel-modes
composite words in camelCase and PascalCase are accepted.
Jinx can be installed from GNU ELPA and MELPA directly or with package-install
.
Jinx requires libenchant
. Enchant library is a required dependency for Jinx to
compile its module at install time. If pkg-config
is available when installing
Jinx, Jinx will use pkg-config
to locate libenchant
.
On Debian or Ubuntu, install the packages libenchant-2-dev
and pkg-config
. On
Fedora or RHEL, install the package enchant2-devel
. On Mac, install enchant2
and
pkgconfig
.
Jinx has two modes: the command, global-jinx-mode
activates globally; and the
command, jinx-mode
, for activating for specific modes.
;; Alternative 1: Enable Jinx globally (add-hook 'emacs-startup-hook #'global-jinx-mode) ;; Alternative 2: Enable Jinx per mode (dolist (hook '(text-mode-hook prog-mode-hook conf-mode-hook)) (add-hook hook #'jinx-mode))
Jinx autoloads the commands jinx-correct
and jinx-languages
. Invoking
jinx-correct
corrects the misspellings. Binding jinx-correct
to M-$
chord takes
over that chord from Emacs's default assignment to ispell word
. Since Jinx is
independent of the Emacs's Ispell package, M-$
can be re-used.
(keymap-global-set "<remap> <ispell-word>" #'jinx-correct)
M-$
triggers correction for the misspelled word before point.C-u M-$
triggers correction for the entire buffer.
A sample configuration with the popular use-package
macro is shown here:
(use-package jinx :hook (emacs-startup . global-jinx-mode) :bind ([remap ispell-word] . jinx-correct))
Suggested corrections are displayed as a completion menu. You can press 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 variables. Note that you can enter arbitrary input at the
correction prompt in order to make the correction. By pressing M-n
(M-p
) again
in the correction menu, you can skip to the next (previous) misspelling.
The completion menu is compatible with all popular completion UIs: Vertico, Mct,
Icomplete, Ivy, Helm and of course default completion. 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.
(add-to-list 'vertico-multiform-categories '(jinx grid (vertico-grid-annotate . 25))) (vertico-multiform-mode 1)
Enchant uses different backends for different languages. The backends are
ordered as specified in the personal configuration file
~/.config/enchant/enchant.ordering
and the system-wide configuration file
/usr/share/enchant-2/enchant.ordering
. Enchant uses Hunspell as default backend
for most languages. There are a few exceptions. For English Enchant prefers
Aspell and for Finnish and Turkish special backends called Voikko and Zemberek
are used. On non-Linux operating systems Enchant may also integrate with the
spell-checker provided by the operating system.
Depending on the backend the personal dictionary will be taken from different
locations, e.g., ~/.aspell.LANG.pws
or ~/.config/enchant/
. It is possible to
symlink different personal dictionaries such that they are shared by different
spell checkers. See the Enchant manual for details.
There exist multiple alternative spell-checking packages for Emacs, most famously the builtin ispell.el and flyspell.el packages. The main advantages of Jinx are its automatic checking of the visible text, its sharp focus on performance and the ability to easily use multiple dictionaries at once. The following three alternative packages come closest to the behavior of Jinx.
flyspell-buffer
.Since this package is part of GNU ELPA contributions require a copyright assignment to the FSF.
jinx-0.7.tar.lz | 2023-Apr-21 | 17.4 KiB |
jinx-0.6.tar.lz | 2023-Apr-17 | 16.3 KiB |
jinx-0.5.tar.lz | 2023-Apr-05 | 15.6 KiB |
jinx-0.4.tar.lz | 2023-Mar-27 | 14.5 KiB |
jinx-0.3.tar.lz | 2023-Mar-27 | 14.0 KiB |
jinx-0.2.tar.lz | 2023-Mar-26 | 11.1 KiB |
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
.jinx-faces
customization group.jinx--save-keys
.executable-find
.jinx-languages
: Only ask in file-backed buffers if file-local variable should
be saved.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.jinx-correct-map
bound in the jinx-correct
minibuffer.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.jinx-correct-select
is
bound to the keys 1
to 9
in the jinx-correct-map
.jinx-mod.so
first on the load-path
before
attempting to compile it. This is useful if the module is packed and installed
separately..
punctuation character, '
word character, %
and $
identifier characters.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.jinx-local-words
to save file-local words. jinx-correct
supports saving to
jinx-local-words
by pressing *
.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.jinx-mode-map
to make it easy to bind keys if jinx-mode
is enabled. The
map is empty by default.jinx-camel-modes
variable.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.jinx-misspelled-map
.jinx-correct
: Unfold invisible line when correcting misspellings.jinx-correct
: Show number of misspellings.emacs-module.h
to avoid compilation problems.jinx-languages
: Use current-locale-environment
by default.