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 then be corrected from a list of dictionary words presented as completion candidates in a list.
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
.
- Install
libenchant-2-dev
andpkg-config
.
- Linux: install
enchant2-devel
. - Mac: install
enchant2
andpkgconfig
.
- Nix-based solution: (without Home-Manager)
environment.systemPackages = with pkgs; [
emacs.pkgs.withPackages (epkgs: (with epkgs.elpaPackages; [
# ... <- your other emacs-nix packages
jinx
]))
];
- Alternative, Home-Manager solution:
programs.emacs = {
enable = true;
extraPackages = epkgs: with epkgs; [
# ... <- your other emacs-nix packages
jinx
];
};
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. The use-package
definition above shows that. The same reassignment using regular keymap is shown
below:
(keymap-global-set "<remap> <ispell-word>" #'jinx-correct)
M-$
triggers correction for the misspelled word next to 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))
Enchant uses different backends for different languages (to be spell-checked).
The backends are ordered as specified in the configuration file
~/.config/enchant/enchant.ordering
. For most languages, Enchant uses Hunspell by
default.
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 following three packages come closest to the behavior of Jinx.
- jit-spell: Jinx UI borrows ideas from Augusto Stoffel’s Jit-spell. Jit-spell uses the less efficient Ispell process communication instead Jinx’s calling native API. Since Jit-spell highlights misspellings in the entire buffer and does not confine to just the visible text, Jit-spell affects the load and latency negatively (issue on github).
- spell-fu: The idea to highlight misspellings just in the visible text portion of the buffer came from Campbell Barton’s spell-fu package. Spell-fu is fast but incurs high memory overhead on account of its dictionary in a hash table. For languages with compound words and inflected word forms, this overhead magnifies (issue on codeberg). By accessing the Enchant API directly, Jinx avoids such an overhead. Jinx also benefits from the advanced spell-checker algorithms of Enchant (affixation, compound words, etc.).
- flyspell: Flyspell is Emacs’s built-in package. Flyspell highlights
misspellings while typing. Only the word under the cursor is spell-checked.
Jinx, on the other hand, is more effective because it automatically checks for
misspellings in the entire visible text of the buffer at once. Flyspell can
check the entire buffer but must be instructed to do so via the command
flyspell-buffer
.
Since this package is part of GNU ELPA contributions require a copyright assignment to the FSF.