• Stars
    star
    200
  • Rank 195,325 (Top 4 %)
  • Language
    Emacs Lisp
  • License
    Other
  • Created over 8 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Distraction-free words correction with flyspell via selected interface.

Banner

flyspell-correct

https://github.com/d12frosted/flyspell-correct/workflows/CI/badge.svg

flyspell-correcthttp://melpa.org/packages/flyspell-correct-badge.svghttps://stable.melpa.org/packages/flyspell-correct-badge.svg
flyspell-correct-ivyhttp://melpa.org/packages/flyspell-correct-ivy-badge.svghttps://stable.melpa.org/packages/flyspell-correct-ivy-badge.svg
flyspell-correct-helmhttp://melpa.org/packages/flyspell-correct-helm-badge.svghttps://stable.melpa.org/packages/flyspell-correct-helm-badge.svg
flyspell-correct-popuphttp://melpa.org/packages/flyspell-correct-popup-badge.svghttps://stable.melpa.org/packages/flyspell-correct-popup-badge.svg
flyspell-correct-avy-menuhttp://melpa.org/packages/flyspell-correct-avy-menu-badge.svghttps://stable.melpa.org/packages/flyspell-correct-avy-menu-badge.svg

Correcting misspelled words with flyspell using favourite interface.

flyspell-correct provides several functions to start the correction process:

  • flyspell-correct-wrapper - by default jumps to the first misspelled word before the point and prompts for correction and gets you back. Calling it with C-u gives ability to correct multiple misspelled words in one run. C-u C-u changes direction. C-u C-u C-u changes direction and enables multiple corrections.
  • flyspell-correct-at-point - to correct word at point.
  • flyspell-correct-previous to correct any visible word before the point.
  • flyspell-correct-next to correct any visible word after the point.

In most cases flyspell-correct-wrapper is the most convenient, so don’t forget to bind it.

(define-key flyspell-mode-map (kbd "C-;") #'flyspell-correct-wrapper)

Most interfaces also allow you to save the new word to your dictionary, accept this spelling in current buffer or for a whole session, or even skip this word (useful in a rapid flow).

flyspell-correct comes with default interface, which uses completing-read. If you use Ivy, Helm or Ido as completion system you probably want to replace the default interface with the specialized interface. All additional interfaces come in separate packages:

Table of contents

Rapid mode

A so called ‘rapid mode’ means that you can correct multiple words in a single invocation of flyspell-correct-wrapper following current direction (usually, backwards). In order to enable it, one should call flyspell-correct-wrapper with universal argument - C-u. For example, C-u C-; will enable it.

flyspell-correct-completing-read interface

In order to use flyspell-correct-completing-read interface you have to install flyspell-correct package in any preferred way and then add following snippet to relevant part of your init.el file.

(require 'flyspell-correct)
(define-key flyspell-mode-map (kbd "C-;") 'flyspell-correct-wrapper)

Or via use-package.

(use-package flyspell-correct
  :after flyspell
  :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)))

If you do not want any binding, just replace :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)) with :defer t to use lazy loading.

In order to select the (s)ave, (a)ccept, sto(p) or s(k)ip actions, you can enter the shortcut key @s, @a, @p or @k. The actions will be automatically submitted. Furthermore suggestions can be quickly submitted by entering the numeric index in front of the suggestion. Besides the quick keys the usual completing-read interface is available, which may be enhanced and allow scrolling through candidates if you have a completion UI like Icomplete-vertical, Selectrum or Vertico installed.

flyspell-correct-ivy interface

In order to use flyspell-correct-ivy interface you have to install flyspell-correct-ivy package in any preferred way and then add following snippet to relevant part of your init.el file.

(require 'flyspell-correct-ivy)
(define-key flyspell-mode-map (kbd "C-;") 'flyspell-correct-wrapper)

Or via use-package.

(use-package flyspell-correct
  :after flyspell
  :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)))

(use-package flyspell-correct-ivy
  :after flyspell-correct)

If you do not want any binding, just replace :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)) with :defer t to use lazy loading.

Note that in order to access actions in ivy interface you need to press M-o. More on ivy mini buffer key bindings you can read in official documentation.

flyspell-correct-avy-menu interface

In order to use flyspell-correct-avy-menu interface you have to install flyspell-correct-avy-menu package in any preferred way and then add following snippet to relevant part of your init.el file.

(require 'flyspell-correct-avy-menu)
(define-key flyspell-mode-map (kbd "C-;") 'flyspell-correct-wrapper)

Or via use-package.

(use-package flyspell-correct
  :after flyspell
  :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)))

(use-package flyspell-correct-avy-menu
  :after flyspell-correct)

If you do not want any binding, just replace :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)) with :defer t to use lazy loading.

flyspell-correct-ido interface

In order to use flyspell-correct interface you have to install flyspell-correct-ido package in any preferred way and then add following snippet to relevant part of your init.el file.

(require 'flyspell-correct)
(require 'flyspell-correct-ido)
(define-key flyspell-mode-map (kbd "C-;") 'flyspell-correct-wrapper)

Or via use-package.

(use-package flyspell-correct
  :after flyspell
  :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)))

(use-package flyspell-correct-ido
  :after flyspell-correct)

If you do not want any binding, just replace :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)) with :defer t to use lazy loading.

flyspell-correct-helm interface

In order to use flyspell-correct-helm interface you have to install flyspell-correct-helm package in any preferred way and then add following snippet to relevant part of your init.el file.

(require 'flyspell-correct-helm)
(define-key flyspell-mode-map (kbd "C-;") 'flyspell-correct-wrapper)

Or via use-package.

(use-package flyspell-correct
  :after flyspell
  :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)))

(use-package flyspell-correct-helm
  :after flyspell-correct)

If you do not want any binding, just replace :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)) with :defer t to use lazy loading.

flyspell-correct-popup interface

In order to use flyspell-correct-popup interface you have to install flyspell-correct-popup package in any preferred way and then add following snippet to relevant part of your init.el file.

(require 'flyspell-correct-popup)
(define-key flyspell-mode-map (kbd "C-;") 'flyspell-correct-wrapper)

Or via use-package.

(use-package flyspell-correct
  :after flyspell
  :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)))

(use-package flyspell-correct-popup
  :after flyspell-correct)

If you do not want any binding, just replace :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)) with :defer t to use lazy loading.

There are some cool usability suggestions by @alphapapa shared in d12frosted/flyspell-correct#30 that you might want to use. Enjoy!

Deprecations

Deprecations in v0.5

Unfortunately, the following functions are renamed.

  • flyspell-correct-next-word-generic -> flyspell-correct-next
  • flyspell-correct-previous-word-generic -> flyspell-correct-previous
  • flyspell-correct-word-generic -> flyspell-correct-at-point

Please make sure to update to new names.

Custom interfaces

One can easily implement custom interface for flyspell-correct. It has to be a function accepting two arguments:

  • candidates for correction (list of strings)
  • misspelled word (string)

Result must be either a string (replacement word) or a cons of a command and a string (replacement word), where the command is one of the following:

  • skip - do nothing to misspelled word, in rapid mode used for jumping to the next (or previous) misspelled word
  • break - do nothing to misspelled word, break from rapid mode
  • stop - do nothing to misspelled word, break from rapid mode (if enabled) and leave the point at the misspelled word
  • save - replace misspelled word with replacement word and save it to the personal dictionary
  • session - replace misspelled word with replacement word and save it to the session dictionary (correction will be discarded upon quitting Emacs)
  • buffer - replace misspelled word with replacement word and save it to the buffer dictionary (added to the bottom of buffer)

Check any existing interface for reference.

Highlighting

The word that is being currently corrected (e.g. you are selecting the correction for misspelled word) is highlighted with flyspell-correct-highlight-face. If you wish to disable extra highlighting, just set the value of flyspell-correct-highlight to nil.

(setq flyspell-correct-highlight nil)

Auto correction mode

/Take my advice and don’t use this functionality unless you find flyspell-correct-wrapper function useless for your purposes. You can find more info in this comment.

This package also provides auto correction minor mode called flyspell-correct-auto-mode. When enabled it will automatically invoke flyspell-correct-previous-word-generic after certain delay configured by flyspell-correct-auto-delay when there is at least one incorrect word.

(add-hook 'flyspell-mode-hook #'flyspell-correct-auto-mode)

One can also configure interface specially for flyspell-correct-previous-word-generic called by flyspell-correct-auto-mode by setting value of flyspell-correct-auto-mode-interface.

Reasoning

There are already packages like helm-flyspell and flyspell-popup. So why would anyone create yet another similar package? The reason is simple - to support another interface or completion system. flyspell-correct started because ivy was missing similar to helm-flyspell package. But I didn’t want to create a package just for ivy. The reasoning is simple - all those packages should have similar functionality but different interface. Adding something new to one of these packages ideally should be reflected in all others. So I decided to create generic package that works with any interfaces. It’s not about one package containing all possible interfaces, but about a package giving you functionality with an interface of your choice.

And over the time, flyspell-correct got some killer features (like quick access to misspelled words from anywhere), rapid mode and some others.

Screenshots

Ivy interface

images/screenshot-ivy-1.png

images/screenshot-ivy-2.png

Avy Menu interface

images/screenshot-avy-menu.png

Popup interface

images/screenshot-popup.png

Helm interface

images/screenshot-helm.png

Ido interface

images/screenshot-ido.png

completing-read interface

images/screenshot-completing-read.png

Acknowledgements

This package is available thanks to these people:

Additional thanks to all contributors:

More Repositories

1

homebrew-emacs-plus

Emacs Plus formulae for the Homebrew package manager
Ruby
2,314
star
2

vulpea

A collection of functions for note taking based on `org` and `org-roam`.
Emacs Lisp
237
star
3

environment

dotfiles
Emacs Lisp
124
star
4

elpa-mirror

Mirror for some Emacs package archives
Emacs Lisp
101
star
5

dotbot-brew

Install brew packages using dotbot
Python
46
star
6

vino

It's your cellar, your dear cantina.
Emacs Lisp
37
star
7

counsel-osx-app

Launch OSX applications via ivy interface
Emacs Lisp
24
star
8

UnityLibrarySwitcher

Unity plugin for switching build targets, git branches without endless assets reimport. Not maintained anymore.
C#
19
star
9

git-config-manager

Manage git repository configurations with ease
Haskell
8
star
10

mirror-elpa

(To) mirror Emacs Lisp Package Archive(s)
Shell
8
star
11

d12frosted.io

Personal site
Haskell
8
star
12

orgability

Reading list manager for Emacs with offline access support.
Emacs Lisp
7
star
13

publicatorg

Make your vulpea notes public
Emacs Lisp
6
star
14

emacs-ukrainian-input-method

Ukrainian macOS-like input method
Emacs Lisp
5
star
15

fancy-yank

apply transformation upon yanking
Emacs Lisp
4
star
16

emacs-addiction-mode

M-x doctor instead of C-x C-c
Emacs Lisp
4
star
17

barberry.io

Emacs Lisp
3
star
18

org-drawer-list

Tame your lists in a drawer
Emacs Lisp
3
star
19

emacs-plus-basis

Emacs Lisp
3
star
20

CanonicalPath

Abstract data type for canonical paths with some pretty operations. Not maintained anymore.
Haskell
3
star
21

talks

TeX
2
star
22

env-extra

Safe helpers for accessing and modifying environment variables
Haskell
2
star
23

d12frosted

1
star
24

path-extra

Path helpers for my personal projects
Haskell
1
star
25

bomberman-player

Haskell
1
star
26

fish-mode

Major mode for editing fish shell scripts
Emacs Lisp
1
star