Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: spell check on the command line

On Oct 24, 11:19pm, Eric Smith wrote:
} ~> setopt CORRECTALL
} ~> touch this_settting_doess_not_yet_check_the_spelling_of_these_tags_in_a_filename.txt

Oh, so you want a regular spelling dictionary applied in some way, to
substrings within each command-line argument.  Or perhaps only to
substrings within file names, but since it's not possible to tell in
general which arguments are file names (a shortcoming correctall has
already), it's effectively the same problem.

Let's ignore the complications of shell keywords like "elif", complex
commands like loops, and multi-line buffers.  Your basic choices are:

- override the accept-line widget; or
- create (or add to if already using one) a zle-line-finish widget; or
- attempt to handle it all in prexec.

The simplest one is zle-line-finish so I'll do a quick example of that
here.  If you do it in preexec it's more difficult to implement the
(a)bort and (e)dit cases.

I'll assume that anything matching [[:punct:]] is taken as a word break,
and also that a program or function "suggest" exists that will spit out
pairs of wrong words and their replacments (unlike "spell" which emits
only the wrong words).

    zle-line-finish() {
      local spelt misspelt nyae
      print -R ${BUFFER//[[:punct:][:digit:]]/$'\n'} | suggest |
      while read misspelt spelt
	read -k 1 nyae$'?\n'"correct '$misspelt' to '$spelt' [nyae]? "
	case ${nyae:l} in
	(a) zle send-break;;
	(e) zle push-line; return;;
	(y) BUFFER=${BUFFER/$misspelt/$spelt};;
        [[ -n $nyae ]] && print -nR $nyae
      [[ -n $nyae ]] && { print; zle redisplay }
    zle -N zle-line-finish

Use at your own risk.

Messages sorted by: Reverse Date, Date, Thread, Author