2020-07-12 23:11:39 -03:00
|
|
|
#+TITLE: checkers/spell
|
|
|
|
#+DATE: January 9, 2020
|
|
|
|
#+SINCE: v3.0.0
|
|
|
|
#+STARTUP: inlineimages nofold
|
|
|
|
|
|
|
|
* Table of Contents :TOC_3:noexport:
|
|
|
|
- [[#description][Description]]
|
|
|
|
- [[#maintainers][Maintainers]]
|
|
|
|
- [[#module-flags][Module Flags]]
|
|
|
|
- [[#plugins][Plugins]]
|
|
|
|
- [[#prerequisites][Prerequisites]]
|
2020-08-23 18:48:50 -04:00
|
|
|
- [[#aspell][Aspell]]
|
|
|
|
- [[#hunspell][Hunspell]]
|
2020-08-26 13:57:06 +03:00
|
|
|
- [[#enchant][Enchant]]
|
2020-07-12 23:11:39 -03:00
|
|
|
- [[#features][Features]]
|
|
|
|
- [[#configuration][Configuration]]
|
2020-08-21 02:41:41 -04:00
|
|
|
- [[#changing-how-quickly-spell-fu-spellchecks-after-changes][Changing how quickly spell-fu spellchecks after changes]]
|
2020-08-23 18:48:50 -04:00
|
|
|
- [[#spell-fu-users][Spell-fu users]]
|
|
|
|
- [[#flyspell-users][Flyspell users]]
|
2020-08-21 02:41:41 -04:00
|
|
|
- [[#reducing-false-positives-by-disabling-spelling-on-certain-faces][Reducing false positives by disabling spelling on certain faces]]
|
2020-08-23 18:48:50 -04:00
|
|
|
- [[#spell-fu-users-1][Spell-fu users]]
|
|
|
|
- [[#flyspell-users-1][Flyspell users]]
|
2020-08-21 02:41:41 -04:00
|
|
|
- [[#adding-or-removing-words-to-your-personal-dictionary][Adding or removing words to your personal dictionary]]
|
2020-07-12 23:11:39 -03:00
|
|
|
- [[#troubleshooting][Troubleshooting]]
|
|
|
|
|
|
|
|
* Description
|
2020-08-26 13:57:06 +03:00
|
|
|
This modules provides spellchecking powered by =aspell=, =hunspell= or =enchant=.
|
2020-07-12 23:11:39 -03:00
|
|
|
|
2020-08-23 18:48:50 -04:00
|
|
|
Spellcheck is automatically loaded in many ~text-mode~ derivatives, which
|
2020-08-21 02:41:41 -04:00
|
|
|
includes ~org-mode~, ~markdown-mode~, the Git Commit buffer (from magit),
|
|
|
|
~mu4e-compose-mode~, and others.
|
2020-07-12 23:11:39 -03:00
|
|
|
|
|
|
|
** Maintainers
|
|
|
|
This module has no dedicated maintainers.
|
|
|
|
|
|
|
|
** Module Flags
|
2020-08-23 18:48:50 -04:00
|
|
|
+ =+flyspell= Use =flyspell= instead of =spell-fu=. It's significantly slower,
|
|
|
|
but supports multiple languages and dictionaries.
|
2020-08-21 02:41:41 -04:00
|
|
|
+ =+aspell= Use =aspell= as a backend for correcting words.
|
|
|
|
+ =+hunspell= Use =hunspell= as a backend for correcting words.
|
2020-08-26 13:57:06 +03:00
|
|
|
+ =+enchant= Use =enchant-2= as a backend for correcting words.
|
2020-08-23 18:48:50 -04:00
|
|
|
+ =+everywhere= Spell check in programming modes as well (in comments).
|
2020-07-12 23:11:39 -03:00
|
|
|
|
|
|
|
** Plugins
|
2020-08-23 18:48:50 -04:00
|
|
|
+ if =+flyspell=
|
|
|
|
+ [[https://github.com/d12frosted/flyspell-correct][flyspell-correct]]
|
|
|
|
+ [[https://github.com/d12frosted/flyspell-correct#flyspell-correct-ivy-interface][flyspell-correct-ivy]] (=completion/ivy=)
|
|
|
|
+ [[https://github.com/d12frosted/flyspell-correct#flyspell-correct-helm-interface][flyspell-correct-helm]] (=completion/helm=)
|
|
|
|
+ [[https://github.com/d12frosted/flyspell-correct#flyspell-correct-popup-interface][flyspell-correct-popup]] (if *neither* =completion/ivy= or =completion/helm=)
|
|
|
|
+ [[https://github.com/rolandwalker/flyspell-lazy][flyspell-lazy]]
|
|
|
|
+ else
|
|
|
|
+ [[https://gitlab.com/ideasman42/emacs-spell-fu][spell-fu]]
|
2020-07-12 23:11:39 -03:00
|
|
|
|
|
|
|
* Prerequisites
|
2020-08-26 13:57:06 +03:00
|
|
|
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).
|
2020-08-23 18:48:50 -04:00
|
|
|
|
|
|
|
#+begin_quote
|
|
|
|
If you *are not* using =+flyspell=, you will need aspell (and a dictionary)
|
2020-08-26 13:57:06 +03:00
|
|
|
installed whether or not you have =+hunspell= or =+enchant= enabled.
|
|
|
|
This is because =spell-fu= does not support generating the word list
|
|
|
|
with anything other than =aspell= yet.
|
2020-08-23 18:48:50 -04:00
|
|
|
#+end_quote
|
|
|
|
|
|
|
|
** Aspell
|
|
|
|
+ Ubuntu: ~apt-get install aspell aspell-en~
|
|
|
|
+ Arch Linux: ~pacman -S aspell aspell-en~
|
|
|
|
+ NixOS:
|
|
|
|
#+BEGIN_SRC nix
|
|
|
|
{
|
|
|
|
environment.systemPackages = with pkgs; [
|
|
|
|
aspell
|
|
|
|
aspellDicts.en
|
|
|
|
aspellDicts.en-computers
|
|
|
|
aspellDicts.en-science
|
|
|
|
];
|
|
|
|
}
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
** TODO Hunspell
|
2020-07-12 23:11:39 -03:00
|
|
|
|
2020-08-26 13:57:06 +03:00
|
|
|
** Enchant
|
|
|
|
+ Ubuntu: ~apt-get install enchant-2~
|
|
|
|
+ Arch Linux: ~pacman -S enchant~
|
|
|
|
+ NixOS:
|
|
|
|
#+BEGIN_SRC nix
|
|
|
|
{
|
|
|
|
environment.systemPackages = with pkgs; [
|
|
|
|
enchant
|
|
|
|
];
|
|
|
|
}
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
2020-07-12 23:11:39 -03:00
|
|
|
* Features
|
2020-08-26 13:57:06 +03:00
|
|
|
+ Spell checking and correction using =aspell=, =hunspell= or =enchant=.
|
2020-08-21 02:41:41 -04:00
|
|
|
+ Ignores source code inside org or markdown files.
|
2020-08-23 18:48:50 -04:00
|
|
|
+ Lazily spellchecking recent changes only when idle.
|
|
|
|
+ Choosing suggestions using completion interfaces (=ivy= or =helm=).
|
2020-07-12 23:11:39 -03:00
|
|
|
|
2020-08-23 18:48:50 -04:00
|
|
|
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.
|
2020-07-12 23:11:39 -03:00
|
|
|
|
|
|
|
* Configuration
|
|
|
|
Dictionary is set by =ispell-dictionary= variable. Can be changed locally with
|
|
|
|
the function =ispell-change-dictionary=.
|
|
|
|
|
2020-08-21 02:41:41 -04:00
|
|
|
** Changing how quickly spell-fu spellchecks after changes
|
2020-08-23 18:48:50 -04:00
|
|
|
*** Spell-fu users
|
|
|
|
Adjust ~spell-fu-idle-delay~ to change how long Emacs waits to spellcheck after
|
|
|
|
recent changes.
|
2020-07-12 23:11:39 -03:00
|
|
|
#+BEGIN_SRC elisp
|
2020-08-21 02:41:41 -04:00
|
|
|
(after! spell-fu
|
2020-08-23 18:48:50 -04:00
|
|
|
(setq spell-fu-idle-delay 0.5)) ; default is 0.25
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
*** 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).
|
|
|
|
#+BEGIN_SRC elisp
|
|
|
|
(after! flyspell
|
|
|
|
(setq flyspell-lazy-idle-seconds 2))
|
2020-07-12 23:11:39 -03:00
|
|
|
#+END_SRC
|
|
|
|
|
2020-08-21 02:41:41 -04:00
|
|
|
** Reducing false positives by disabling spelling on certain faces
|
2020-08-23 18:48:50 -04:00
|
|
|
*** Spell-fu users
|
|
|
|
Users can exclude what faces to preform spellchecking on by adjusting
|
|
|
|
~+spell-excluded-faces-alist~ in a buffer-local hook:
|
2020-07-12 23:11:39 -03:00
|
|
|
#+BEGIN_SRC elisp
|
2020-08-23 18:48:50 -04:00
|
|
|
(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))
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
*** 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!~:
|
|
|
|
#+BEGIN_SRC elisp
|
|
|
|
(set-flyspell-predicate! '(markdown-mode gfm-mode)
|
|
|
|
#'+markdown-flyspell-word-p)
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
Flyspell predicates take no arguments and must return a boolean to determine if
|
|
|
|
the word at point should be spell checked. For example:
|
|
|
|
#+BEGIN_SRC elisp
|
|
|
|
(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)))))
|
2020-07-12 23:11:39 -03:00
|
|
|
#+END_SRC
|
|
|
|
|
2020-08-21 02:41:41 -04:00
|
|
|
** Adding or removing words to your personal dictionary
|
2020-09-02 14:07:10 -04:00
|
|
|
Use ~M-x +spell/add-word~ and ~M-x +spell/remove-word~ to whitelist words that
|
2020-10-04 16:14:16 -04:00
|
|
|
you know are not misspellings. For evil users these are bound to =zg= and =zw=,
|
2020-09-02 14:07:10 -04:00
|
|
|
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").
|
2020-08-21 02:41:41 -04:00
|
|
|
|
|
|
|
* TODO Troubleshooting
|