rc formatter: Make sure the formatter returned successfully
The previous implementation used to replace the contents of the buffer with whatever the `formatcmd` was returning, regardless of the exit code of the command, which led to the buffer being wiped out on error. This commit does the formatting in a temporary file, and only replaces the current buffer with the contents of the -formatted- temporary file if the `formatcmd` returned successfully. Fixes #1357
This commit is contained in:
parent
dc1b039282
commit
6376aa6206
|
@ -1,17 +1,35 @@
|
||||||
decl -docstring "shell command to which the contents of the current buffer is piped" \
|
decl -docstring "shell command to which the contents of the current buffer is piped" \
|
||||||
str formatcmd
|
str formatcmd
|
||||||
|
|
||||||
def format -docstring "Format the contents of the current buffer" %{
|
def format -docstring "Format the contents of the current buffer" %{ eval -draft %{
|
||||||
%sh{
|
%sh{
|
||||||
if [ ! -z "${kak_opt_formatcmd}" ]; then
|
if [ -n "${kak_opt_formatcmd}" ]; then
|
||||||
readonly kak_opt_formatcmd=$(printf '%s' "${kak_opt_formatcmd}" | sed 's/ /<space>/g')
|
|
||||||
## Save the current position of the cursor
|
## Save the current position of the cursor
|
||||||
readonly x=$((kak_cursor_column - 1))
|
readonly x=$((kak_cursor_column - 1))
|
||||||
readonly y="${kak_cursor_line}"
|
readonly y="${kak_cursor_line}"
|
||||||
|
|
||||||
printf %s\\n "exec -draft %{%|${kak_opt_formatcmd}<ret>}"
|
path_file_tmp=$(mktemp "${TMPDIR:-/tmp}"/kak-formatter-XXXXXX)
|
||||||
|
printf %s\\n "
|
||||||
|
write \"${path_file_tmp}\"
|
||||||
|
|
||||||
|
%sh{
|
||||||
|
readonly path_file_out=\$(mktemp \"${TMPDIR:-/tmp}\"/kak-formatter-XXXXXX)
|
||||||
|
|
||||||
|
if cat \"${path_file_tmp}\" | eval \"${kak_opt_formatcmd}\" > \"\${path_file_out}\"; then
|
||||||
|
printf '%s\\n' \"exec \\%|cat<space>'\${path_file_out}'<ret>\"
|
||||||
|
printf '%s\\n' \"%sh{ rm -f '\${path_file_out}' }\"
|
||||||
## Try to restore the position of the cursor as it was prior to formatting
|
## Try to restore the position of the cursor as it was prior to formatting
|
||||||
printf %s\\n "exec gg ${y}g ${x}l"
|
printf '%s\\n' 'exec gg ${y}g ${x}l'
|
||||||
|
else
|
||||||
|
printf '%s\\n' \"
|
||||||
|
eval -client '${kak_client}' echo -color Error formatter returned an error (\$?)
|
||||||
|
\"
|
||||||
|
rm -f \"\${path_file_out}\"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f \"${path_file_tmp}\"
|
||||||
|
}
|
||||||
|
"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
}
|
} }
|
||||||
|
|
Loading…
Reference in New Issue
Block a user