Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: spell check on the command line
- X-seq: zsh-users 19294
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: zsh-users@xxxxxxx
- Subject: Re: spell check on the command line
- Date: Sat, 25 Oct 2014 00:24:53 -0700
- In-reply-to: <mailbox-30175-1414185414-780483@pepper.0.0.200>
- List-help: <mailto:zsh-users-help@zsh.org>
- List-id: Zsh Users List <zsh-users.zsh.org>
- List-post: <mailto:zsh-users@zsh.org>
- Mailing-list: contact zsh-users-help@xxxxxxx; run by ezmlm
- References: <mailbox-22881-1414147596-756685@pepper.0.0.200> <141024083614.ZM20933@torch.brasslantern.com> <mailbox-30175-1414185414-780483@pepper.0.0.200>
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
do
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};;
esac
[[ -n $nyae ]] && print -nR $nyae
done
[[ -n $nyae ]] && { print; zle redisplay }
}
zle -N zle-line-finish
Use at your own risk.
Messages sorted by:
Reverse Date,
Date,
Thread,
Author