Trim whitespace from spell check word length variable

Due to ambiguity in the POSIX standard, GNU and BSD versions of the `wc`
utility use slightly different whitespace conventions when formatting
their output [1]. When limiting the output to just counting the number
of bytes (as is done by Kakoune when calculating the length of words
for spell check highlighting), the BSD version of `wc -c` has some
additional leading whitespace:

    gnu$ printf %s "test" | wc -c
    4
    bsd$ printf %s "test" | wc -c
           4

This leading whitespace needs to be removed before defining the "region"
to highlight, or `set-option` will not be able to parse the given
`spell_regions` and will complain that there are "not enough elements
in tuple." In other words, the region `1.21+8|Error` on Linux ends up
looking like `1.21+       8|Error` on macOS, which is invalid.

Removing the whitespace could be accomplished in a number of ways, but
using arithmetic expansion [2] is POSIX compliant and does not require
shelling out to another process.

[1]: https://unix.stackexchange.com/questions/205906/extra-space-with-counted-line-number
[2]: https://mywiki.wooledge.org/ArithmeticExpression
This commit is contained in:
Aaron Bull Schaefer 2019-06-02 16:26:25 -07:00
parent 1ebea85e6f
commit 3a401f0771

View File

@ -41,7 +41,8 @@ Formats of language supported:
pos=$(printf %s\\n "$line" | cut -d ' ' -f 3) pos=$(printf %s\\n "$line" | cut -d ' ' -f 3)
fi fi
word=$(printf %s\\n "$line" | cut -d ' ' -f 2) word=$(printf %s\\n "$line" | cut -d ' ' -f 2)
len=$(printf %s "$word" | wc -c) # trim whitespace to make `wc` output consistent across implementations
len=$(($(printf %s "$word" | wc -c)))
regions="$regions $line_num.$pos+${len}|Error" regions="$regions $line_num.$pos+${len}|Error"
;; ;;
'') line_num=$((line_num + 1));; '') line_num=$((line_num + 1));;