Alexander-Miller/treemacs@6857816 -> Alexander-Miller/treemacs@9eaef27 DarwinAwardWinner/amx@b991497 -> DarwinAwardWinner/amx@37f9c7a Dewdrops/evil-exchange@3030e21 -> Dewdrops/evil-exchange@ac50f21 JuliaEditorSupport/julia-emacs@8ea90c7 -> JuliaEditorSupport/julia-emacs@fe6f6f7 OmniSharp/omnisharp-emacs@8ec5929 -> OmniSharp/omnisharp-emacs@5fad683 ProofGeneral/PG@bdb6782 -> ProofGeneral/PG@f0f0476 Sarcasm/irony-mode@76fd37f -> Sarcasm/irony-mode@ec6dce7 Silex/docker.el@0ca910b -> Silex/docker.el@ed0cdf0 Wilfred/helpful@584ecc8 -> Wilfred/helpful@7e4b1f0 abo-abo/swiper@1deef76 -> abo-abo/swiper@bb7965a agda/agda@9d08edb -> agda/agda@ecb9323 akermu/emacs-libvterm@a3fadd2 -> akermu/emacs-libvterm@1bc4516 akreisher/eshell-syntax-highlighting@172c9fb -> akreisher/eshell-syntax-highlighting@eeace52 alexmurray/flycheck-posframe@24fd9b3 -> alexmurray/flycheck-posframe@8f60c9b amake/flutter.el@696228a -> amake/flutter.el@960b635 ananthakumaran/tide@7f7334b -> ananthakumaran/tide@ad6fa78 asok/projectile-rails@8d6b373 -> asok/projectile-rails@f1fe6e8 bastibe/org-journal@f4b1549 -> bastibe/org-journal@043bb9e bbatsov/projectile@fd59947 -> bbatsov/projectile@1528ed4 bradyt/dart-mode@04fcd64 -> bradyt/dart-mode@43975c9 brotzeit/rustic@61d600e -> brotzeit/rustic@d97ec86 charignon/github-review@d0c8234 -> charignon/github-review@341b7a1 clojure-emacs/cider@815204f -> clojure-emacs/cider@4278d7c clojure-emacs/clj-refactor.el@b24ce76 -> clojure-emacs/clj-refactor.el@9f3e735 clojure-emacs/clojure-mode@f26379b -> clojure-emacs/clojure-mode@a14671e codesuki/add-node-modules-path@f31e69c -> codesuki/add-node-modules-path@7d9be65 company-mode/company-mode@88001d7 -> company-mode/company-mode@7207cb1 cpitclaudel/company-coq@4da7b41 -> cpitclaudel/company-coq@7423ee2 cython/cython@9a761a6 -> cython/cython@9decfca dgutov/diff-hl@4c46b3b -> dgutov/diff-hl@1af31fe dgutov/robe@3ef165c -> dgutov/robe@126650a domtronn/all-the-icons.el@2f5ea72 -> domtronn/all-the-icons.el@a8c8417 editorconfig/editorconfig-emacs@048c553 -> editorconfig/editorconfig-emacs@9da2dab elixir-editors/emacs-elixir@9de08c1 -> elixir-editors/emacs-elixir@0212b06 ema2159/centaur-tabs@50fd573 -> ema2159/centaur-tabs@df97209 emacs-csharp/csharp-mode@09b4d57 -> emacs-csharp/csharp-mode@f977800 emacs-ess/ESS@5169b0d -> emacs-ess/ESS@126d344 emacs-evil/evil-collection@334670e -> emacs-evil/evil-collection@b45ec5b emacs-evil/evil@cc9d688 -> emacs-evil/evil@7eace67 emacs-helm/helm-org@b7a18df -> emacs-helm/helm-org@d67186d emacs-helm/helm@dbdec63 -> emacs-helm/helm@98af298 emacs-jp/migemo@f42832c -> emacs-jp/migemo@f756cba emacs-lsp/dap-mode@aa15b9c -> emacs-lsp/dap-mode@ae395aa emacs-lsp/helm-lsp@e934fea -> emacs-lsp/helm-lsp@74a02f8 emacs-lsp/lsp-dart@71902ca -> emacs-lsp/lsp-dart@f3b70ec emacs-lsp/lsp-ivy@c70ee8b -> emacs-lsp/lsp-ivy@515e597 emacs-lsp/lsp-java@5f6d357 -> emacs-lsp/lsp-java@542aaf1 emacs-lsp/lsp-metals@c76eeb6 -> emacs-lsp/lsp-metals@51a89c1 emacs-lsp/lsp-mode@c3cbadc -> emacs-lsp/lsp-mode@eda51c2 emacs-lsp/lsp-ui@0ac3e12 -> emacs-lsp/lsp-ui@1dbea9f emacs-php/php-mode@8cdc727 -> emacs-php/php-mode@a2bca9b emacs-php/phpactor.el@62d2372 -> emacs-php/phpactor.el@80788a8 emacs-straight/auctex@384c4b9 -> emacs-straight/auctex@0f3639a emacs-straight/dired-git-info@b47f2b0 -> emacs-straight/dired-git-info@9461476 emacs-straight/org-mode@0b117f7 -> emacs-straight/org-mode@7a62a4d emacs-straight/project@2e7afbe -> emacs-straight/project@388ffdf emacs-straight/xclip@2951c6b -> emacs-straight/xclip@ef2ad92 emacsattic/nose@f852829 -> emacsattic/nose@f852829 emacsorphanage/quickrun@8008780 -> emacsorphanage/quickrun@57db985 erlang/otp@af06b43 -> erlang/otp@94c9738 factor/factor@1928e60 -> factor/factor@5bfeab6 flycheck/flycheck@01396a5 -> flycheck/flycheck@f8c679f greghendershott/racket-mode@75ea8f6 -> greghendershott/racket-mode@5115c47 hakimel/reveal.js@0582f57 -> hakimel/reveal.js@cf8e64b haskell/haskell-mode@3a019e6 -> haskell/haskell-mode@1baa12a hlissner/doom-snippets@aa5587b -> hlissner/doom-snippets@afe549b hlissner/emacs-counsel-css@6427dfc -> hlissner/emacs-counsel-css@f7647b4 hlissner/emacs-doom-themes@55f01ed -> hlissner/emacs-doom-themes@4199e74 hlissner/emacs-solaire-mode@a8fe09d -> hlissner/emacs-solaire-mode@9d143db hvesalai/emacs-sbt-mode@7b121fc -> hvesalai/emacs-sbt-mode@0bdc36b hvesalai/emacs-scala-mode@402d6df -> hvesalai/emacs-scala-mode@1ab5f64 ideasman42/emacs-spell-fu@a7db587 -> ideasman42/emacs-spell-fu@30c5eea iqbalansari/emacs-emojify@cfa0086 -> iqbalansari/emacs-emojify@1b72641 jacktasia/dumb-jump@f6a1165 -> jacktasia/dumb-jump@8bc1950 jaor/geiser@26dd2f4 -> jaor/geiser@8e61c27 jcollard/elm-mode@188b9c7 -> jcollard/elm-mode@e9fcf9c jkitchin/ox-clip@38b83ac -> jkitchin/ox-clip@2095537 joaotavora/eglot@a2d1fc9 -> joaotavora/eglot@2fbcab2 joaotavora/sly@fb84318 -> joaotavora/sly@5966d68 jorgenschaefer/circe@265f36c -> jorgenschaefer/circe@e67e2d1 js-emacs/js2-refactor.el@d4c40b5 -> js-emacs/js2-refactor.el@a0977c4 js-emacs/xref-js2@6f1ed5d -> js-emacs/xref-js2@fd6b723 jscheid/dtrt-indent@4a30d8e -> jscheid/dtrt-indent@37529fc justbur/emacs-which-key@c0608e8 -> justbur/emacs-which-key@c632dbf justinbarclay/parinfer-rust-mode@c825606 -> justinbarclay/parinfer-rust-mode@f130fa0 jyp/dante@7b1ab64 -> jyp/dante@8741419 kaushalmodi/ox-hugo@a05667e -> kaushalmodi/ox-hugo@02140a2 kidd/org-gcal.el@0a6f9a7 -> kidd/org-gcal.el@d38acda leanprover/lean-mode@15bee87 -> leanprover/lean-mode@5c50338 ledger/ledger-mode@3495d12 -> ledger/ledger-mode@32fef09 magit/forge@8382fd3 -> magit/forge@f4c95dd magit/magit@4735b92 -> magit/magit@577f16d magit/orgit@ac9b1a4 -> magit/orgit@609fd0c magnars/expand-region.el@ea6b4cb -> magnars/expand-region.el@4b83227 magnars/multiple-cursors.el@a9d7764 -> magnars/multiple-cursors.el@7b13b03 mhayashi1120/Emacs-wgrep@f0ef9bf -> mhayashi1120/Emacs-wgrep@f9687c2 millejoh/emacs-ipython-notebook@4ff76e5 -> millejoh/emacs-ipython-notebook@142ff50 non-Jedi/lsp-julia@c523c25 -> non-Jedi/lsp-julia@c487ed7 nonsequitur/inf-ruby@1fc972e -> nonsequitur/inf-ruby@c6990a6 ocaml-ppx/ocamlformat@7db8d13 -> ocaml-ppx/ocamlformat@448ac7c ocaml/dune@f839fc1 -> ocaml/dune@a88ce5b ocaml/merlin@36d0aef -> ocaml/merlin@cc17ed6 ocaml/tuareg@ccde45b -> ocaml/tuareg@37a6730 org-roam/org-roam@b0fd126 -> org-roam/org-roam@8ad57b1 purcell/diredfl@cd052df -> purcell/diredfl@4ca3265 purcell/envrc@a7c6ca8 -> purcell/envrc@110a221 purescript-emacs/purescript-mode@8410baf -> purescript-emacs/purescript-mode@0acd1af racer-rust/emacs-racer@f17f9d7 -> racer-rust/emacs-racer@1e63e98 raxod502/prescient.el@9631db7 -> raxod502/prescient.el@8573df9 redguardtoo/evil-nerd-commenter@2730820 -> redguardtoo/evil-nerd-commenter@b8ac35f rolandwalker/flyspell-lazy@d57382c -> rolandwalker/flyspell-lazy@0fc5996 rubocop/rubocop-emacs@1372ee3 -> rubocop/rubocop-emacs@f5fd18a seagle0128/doom-modeline@5fe7fd6 -> seagle0128/doom-modeline@00bc89b seagle0128/grip-mode@1aebf9c -> seagle0128/grip-mode@98d566d skeeto/elfeed@362bbe5 -> skeeto/elfeed@e29c8b9 skk-dev/ddskk@275a831 -> skk-dev/ddskk@cec9936 snosov1/toc-org@aef220c -> snosov1/toc-org@c4c61c5 spotify/dockerfile-mode@ed1d04c -> spotify/dockerfile-mode@3b13745 takaxp/org-tree-slide@c9487e5 -> takaxp/org-tree-slide@9d2ba1d technomancy/fennel-mode@bebc9dd -> technomancy/fennel-mode@ba14a7d travisbhartwell/nix-emacs@977b9a5 -> travisbhartwell/nix-emacs@053a2d5 tumashu/posframe@3454a4c -> tumashu/posframe@fff21cc tumashu/pyim@e54153f -> tumashu/pyim@f48c3ed widefox/flycheck-raku@046f35a -> widefox/flycheck-raku@b1acccd wyuenho/all-the-icons-dired@fc2dfa1 -> wyuenho/all-the-icons-dired@f401fe2 xuchunyang/elisp-demos@ed9578d -> xuchunyang/elisp-demos@924b07d xuchunyang/osx-dictionary.el@1b79ff6 -> xuchunyang/osx-dictionary.el@4d4cc19 yqrashawn/fd-dired@9fb966d -> yqrashawn/fd-dired@7d18938 yyoncho/helm-icons@5a668ef -> yyoncho/helm-icons@e4a2cd1 Closes #4786 Closes #4801 Closes #4803 Skipped bumping straight.el because of raxod502/straight.el#714. Will adapt soon.
checkers/spell
Description
This modules provides spellchecking powered by aspell
, hunspell
or enchant
.
Spellcheck is automatically loaded in many text-mode
derivatives, which
includes org-mode
, markdown-mode
, the Git Commit buffer (from magit),
mu4e-compose-mode
, and others.
Maintainers
This module has no dedicated maintainers.
Module Flags
+flyspell
Useflyspell
instead ofspell-fu
. It's significantly slower, but supports multiple languages and dictionaries.+aspell
Useaspell
as a backend for correcting words.+hunspell
Usehunspell
as a backend for correcting words.+enchant
Useenchant-2
as a backend for correcting words.+everywhere
Spell check in programming modes as well (in comments).
Plugins
-
if
+flyspell
- flyspell-correct
- flyspell-correct-ivy (
completion/ivy
) - flyspell-correct-helm (
completion/helm
) - flyspell-correct-popup (if neither
completion/ivy
orcompletion/helm
) - flyspell-lazy
-
else
Prerequisites
This module requires one of aspell
, hunspell
or enchant-2
installed on your system and in your PATH
.
They also need dictionaries for your language(s).
If you are not using
+flyspell
, you will need aspell (and a dictionary) installed whether or not you have+hunspell
or+enchant
enabled. This is becausespell-fu
does not support generating the word list with anything other thanaspell
yet.
Aspell
- Ubuntu:
apt-get install aspell aspell-en
- macOS:
brew install aspell
- Arch Linux:
pacman -S aspell aspell-en
-
NixOS:
{ environment.systemPackages = with pkgs; [ (aspellWithDicts (dicts: with dicts; [ en en-computers en-science ])) ]; }
Hunspell
- Ubuntu:
apt-get install hunspell
- macOS:
brew install hunspell
- Arch Linux:
pacman -S hunspell
-
NixOS:
{ environment.systemPackages = with pkgs; [ hunspell ]; }
Enchant
- Ubuntu:
apt-get install enchant-2
- macOS:
brew install enchant
- Arch Linux:
pacman -S enchant
-
NixOS:
{ environment.systemPackages = with pkgs; [ enchant ]; }
Enchant is just a wrapper for other spelling libraries and you will need to have at least one of the supported backends installed as well.
Features
- Spell checking and correction using
aspell
,hunspell
orenchant
. - Ignores source code inside org or markdown files.
- Lazily spellchecking recent changes only when idle.
- Choosing suggestions using completion interfaces (
ivy
orhelm
).
When using +everywhere
, spell checking is performed for as many major modes as
possible, and not only text-mode
derivatives. e.g. in comments for programming
major modes.
Configuration
Dictionary is set by ispell-dictionary
variable. Can be changed locally with
the function ispell-change-dictionary
.
Changing how quickly spell-fu spellchecks after changes
Spell-fu users
Adjust spell-fu-idle-delay
to change how long Emacs waits to spellcheck after
recent changes.
(after! spell-fu
(setq spell-fu-idle-delay 0.5)) ; default is 0.25
Flyspell users
Lazy spellcheck is provided by flyspell-lazy
package.
flyspell-lazy-idle-seconds
sets how many idle seconds until spellchecking
recent changes (default as 1), while flyspell-lazy-window-idle-seconds
sets
how many seconds until the whole window is spellchecked (default as 3).
(after! flyspell
(setq flyspell-lazy-idle-seconds 2))
Reducing false positives by disabling spelling on certain faces
Spell-fu users
Users can exclude what faces to preform spellchecking on by adjusting
+spell-excluded-faces-alist
in a buffer-local hook:
(setf (alist-get 'markdown-mode +spell-excluded-faces-alist)
'(markdown-code-face
markdown-reference-face
markdown-link-face
markdown-url-face
markdown-markup-face
markdown-html-attr-value-face
markdown-html-attr-name-face
markdown-html-tag-name-face))
Flyspell users
Flyspell will run a series of predicate functions to determine if a word should be spell checked. You can add your own with set-flyspell-predicate!
:
(set-flyspell-predicate! '(markdown-mode gfm-mode)
#'+markdown-flyspell-word-p)
Flyspell predicates take no arguments and must return a boolean to determine if the word at point should be spell checked. For example:
(defun +markdown-flyspell-word-p ()
"Return t if point is on a word that should be spell checked.
Return nil if on a link url, markup, html, or references."
(let ((faces (doom-enlist (get-text-property (point) 'face))))
(or (and (memq 'font-lock-comment-face faces)
(memq 'markdown-code-face faces))
(not (cl-loop with unsafe-faces = '(markdown-reference-face
markdown-url-face
markdown-markup-face
markdown-comment-face
markdown-html-attr-name-face
markdown-html-attr-value-face
markdown-html-tag-name-face
markdown-code-face)
for face in faces
if (memq face unsafe-faces)
return t)))))
Adding or removing words to your personal dictionary
Use M-x +spell/add-word
and M-x +spell/remove-word
to whitelist words that
you know are not misspellings. For evil users these are bound to zg
and zw
,
respectively. +flyspell
users can also add/remove words from the
flyspell-correct
popup interface (there will be extra options on the list of
corrections for "save word to dictionary").