ae08312bce
The escaping of the main shell script is also tidied up, and some processes that were spawned for no reason are removed.
57 lines
2.3 KiB
Plaintext
57 lines
2.3 KiB
Plaintext
decl -hidden range-faces spell_regions
|
|
decl -hidden str spell_tmp_file
|
|
|
|
def -params ..1 \
|
|
-docstring %{spell [<language>]: spell check the current buffer
|
|
The first optional argument is the language against which the check will be performed
|
|
Formats of language supported:
|
|
- ISO language code, e.g. 'en'
|
|
- language code above followed by a dash or underscore with an ISO country code, e.g. 'en-US'} \
|
|
spell %{
|
|
try %{ addhl ranges 'spell_regions' }
|
|
%sh{
|
|
file=$(mktemp -d -t kak-spell.XXXXXXXX)/buffer
|
|
printf 'eval -no-hooks write %s\n' "${file}"
|
|
printf 'set buffer spell_tmp_file %s\n' "${file}"
|
|
}
|
|
%sh{
|
|
if [ $# -ge 1 ]; then
|
|
if [ ${#1} -ne 2 -a ${#1} -ne 5 ]; then
|
|
echo 'echo -color Error Invalid language code (examples of expected format: en, en_US, en-US)'
|
|
rm -r "$(dirname "$kak_opt_spell_tmp_file")"
|
|
exit 1
|
|
else
|
|
options="-l '$1'"
|
|
fi
|
|
fi
|
|
|
|
{
|
|
sed 's/^/^/' "$kak_opt_spell_tmp_file" | eval "aspell -a $options" 2>&1 | {
|
|
line_num=1
|
|
regions=$kak_timestamp
|
|
read line # drop the identification message
|
|
while read -r line; do
|
|
case "$line" in
|
|
[\#\&]*)
|
|
if expr "$line" : '^&' >/dev/null; then
|
|
begin=$(printf %s\\n "$line" | cut -d ' ' -f 4 | sed 's/:$//')
|
|
else
|
|
begin=$(printf %s\\n "$line" | cut -d ' ' -f 3)
|
|
fi
|
|
word=$(printf %s\\n "$line" | cut -d ' ' -f 2)
|
|
end=$((begin + ${#word}))
|
|
regions="$regions:$line_num.$begin,$line_num.$end|Error"
|
|
;;
|
|
'') line_num=$((line_num + 1));;
|
|
\*) ;;
|
|
*) printf 'echo -color Error %%{%s}\n' "${line}" | kak -p "${kak_session}";;
|
|
esac
|
|
done
|
|
printf 'set "buffer=%s" spell_regions %%{%s}' "${kak_bufname}" "${regions}" \
|
|
| kak -p "${kak_session}"
|
|
}
|
|
rm -r $(dirname "$kak_opt_spell_tmp_file")
|
|
} </dev/null >/dev/null 2>&1 &
|
|
}
|
|
}
|