In which I futilely attempt to use aspell
to stop using Google as spellcheck.
I am embarrassingly atrocious at spelling. In Vim, which I use for email via Mutt, I can use :set spell
. In Emacs I can use flyspell-mode
. Browsers all have spellcheck now, seemingly. Still… sometimes I find myself just Googling™ (or DDGing™) individual words as I flail through the darkness that is spelling in the English language. This is stupid and ridiculous for myriad reasons that I don’t really want to talk about.
As is my wont, through force of will, by might of awk
, and by glory of xsel
: I have written a function in my dotfiles that solves this problem for me. It might even be generally useful, bask in its awesomeness:
spell() {
local candidates oldifs word array_pos
oldifs="$IFS"
IFS=':'
# Parse the apsell format and return a list of ":" separated words
read -a candidates <<< "$(printf "%s\n" "$1" \
| aspell -a \
| awk -F':' '/^&/ {
split($2, a, ",")
result=""
for (x in a) {
gsub(/^[ \t]/, "", a[x])
result = a[x] ":" result
}
gsub(/:$/, "", result)
print result
}')"
# Reverse number and print the parsed bash array because the list comes
# out of gawk backwards
for item in "${candidates[@]}"; do
printf '%s\n' "$item"
done \
| tac \
| nl \
| less -FirSX
printf "[ $(tput setaf 2)?$(tput sgr0) ]\t%s" \
'Enter the choice (empty to cancel, 0 for input): '
read index
[[ -z "$index" ]] && return
[[ "$index" == 0 ]] && word="$1"
[[ -z "$word" ]] && {
array_pos=$(( ${#candidates[@]} - index ))
word="${candidates[$array_pos]}"
}
[[ -n "$word" ]] && {
printf "$word" | xsel -p
printf "Copied '%s' to clipboard!\n" "$word"
} || printf "[ $(tput setaf 1):($(tput sgr0) ] %s\n" 'No match found'
IFS="$oldifs"
}
Maybe someone can use this ¯\_(ツ)_/¯
Add a comment (Comment Policy)