kakoune/rc/tools/go/gopls.kak
Johannes Altmanninger 7b93567bb1 Reset SIGINT handler in background processes
In a noninteractive shell, asynchronous commands ignore SIGINT and
SIGQUIT. We typically use such shells to feed fifo buffers which we
do want to cancel them on Control-C.  Make it so.

Same for SIGQUIT; that one is not typically used but I expect that
along the Kakoune server it kills any child processes that (haven't
been daemonized).

Note that for unknown reasons, Bash already doesn't ignore SIGINT in
async processes that use "eval".

Note that Dash has a bug that prevents this from working;
proposed fix is at
https://lore.kernel.org/dash/20240329153905.154792-2-aclopte@gmail.com/

(While at it balance out some parens, to help the m command)
2024-03-31 20:13:35 +11:00

99 lines
2.7 KiB
Plaintext

# gopls.kak: gopls bindings for kakoune
define-command -params 1 -docstring %{
gopls <command>: gopls command wrapper
All commands are forwarded to gopls utility
Available commands are:
format
imports
definition
references
} -shell-script-candidates %{
printf "format\nimports\ndefinition\nreferences\n"
} \
gopls %{
require-module gopls
evaluate-commands %sh{
case "$1" in
format|imports)
printf %s\\n "gopls-cmd $1"
;;
definition)
printf %s\\n "gopls-def"
;;
references)
printf %s\\n "gopls-ref"
;;
*)
printf "fail Unknown gopls command '%s'\n" "$1"
exit
;;
esac
}
}
provide-module gopls %§
evaluate-commands %sh{
if ! command -v gopls > /dev/null 2>&1; then
echo "fail Please install gopls or add to PATH!"
fi
}
# Temp dir preparation
declare-option -hidden str gopls_tmp_dir
define-command -hidden -params 0 gopls-prepare %{
evaluate-commands %sh{
dir=$(mktemp -d "${TMPDIR:-/tmp}"/kak-gopls.XXXXXXXX)
printf %s\\n "set-option buffer gopls_tmp_dir ${dir}"
}
}
# gopls format/imports
define-command -hidden -params 1 gopls-cmd %{
gopls-prepare
evaluate-commands %sh{
dir=${kak_opt_gopls_tmp_dir}
gopls "$1" -w "${kak_buffile}" 2> "${dir}/stderr"
if [ $? -ne 0 ]; then
# show error messages in *debug* buffer
printf %s\\n "echo -debug %file{${dir}/stderr}"
fi
}
edit!
nop %sh{ rm -rf "${kak_opt_gopls_tmp_dir}" }
}
# gopls definition
define-command -hidden -params 0 gopls-def %{
evaluate-commands %sh{
jump=$( gopls definition "${kak_buffile}:${kak_cursor_line}:${kak_cursor_column}" 2> /dev/null \
|sed -e 's/-[0-9]\+:.*//; s/:/ /g; q' )
if [ -n "${jump}" ]; then
printf %s\\n "evaluate-commands -try-client '${kak_opt_jumpclient}' %{
edit ${jump}
}"
fi
}
}
# gopls references
define-command -hidden -params 0 gopls-ref %{
gopls-prepare
evaluate-commands %sh{
dir=${kak_opt_gopls_tmp_dir}
mkfifo "${dir}/fifo"
( { trap - INT QUIT; gopls references "${kak_buffile}:${kak_cursor_line}:${kak_cursor_column}"
} > "${dir}/fifo" 2> /dev/null & ) > /dev/null 2>&1 < /dev/null
# using filetype=grep for nice hilight and <ret> mapping
printf %s\\n "evaluate-commands -try-client '${kak_opt_toolsclient}' %{
edit! -fifo '${dir}/fifo' *gopls-refs*
set-option buffer filetype grep
hook -always -once buffer BufCloseFifo .* %{ nop %sh{ rm -r '${dir}' } }
}"
}
}
§