/usr/share/kak/rc/extra/go-tools.kak is in kakoune 0~2016.12.20.1.3a6167ae-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | # Provides integration of the following tools:
# - gocode for code completion (github.com/nsf/gocode)
# - goimports for code formatting on save
# - gogetdoc for documentation display and source jump (needs jq) (github.com/zmb3/gogetdoc)
# Needs the following tools in the path:
# - jq for json deserializaton
# Auto-completion
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
decl -hidden str go_complete_tmp_dir
decl -hidden completions gocode_completions
def go-complete -docstring "Complete the current selection with gocode" %{
%sh{
dir=$(mktemp -d -t kak-go.XXXXXXXX)
printf %s\\n "set buffer go_complete_tmp_dir ${dir}"
printf %s\\n "eval -no-hooks write ${dir}/buf"
}
%sh{
dir=${kak_opt_go_complete_tmp_dir}
(
gocode_data=$(gocode -f=godit --in=${dir}/buf autocomplete ${kak_cursor_byte_offset})
rm -r ${dir}
column_offset=$(echo "${gocode_data}" | head -n1 | cut -d, -f1)
header="${kak_cursor_line}.$((${kak_cursor_column} - $column_offset))@${kak_timestamp}"
compl=$(echo "${gocode_data}" | sed 1d | awk -F ",," '{print $2 "||" $1}' | paste -s -d: -)
printf %s\\n "eval -client '${kak_client}' %{
set buffer=${kak_bufname} gocode_completions '${header}:${compl}'
}" | kak -p ${kak_session}
) > /dev/null 2>&1 < /dev/null &
}
}
def go-enable-autocomplete -docstring "Add gocode completion candidates to the completer" %{
set window completers "option=gocode_completions:%opt{completers}"
hook window -group go-autocomplete InsertIdle .* %{ try %{
exec -draft <a-h><a-k>[\w\.].\z<ret>
go-complete
} }
alias window complete go-complete
}
def go-disable-autocomplete -docstring "Disable gocode completion" %{
set window completers %sh{ printf %s\\n "'${kak_opt_completers}'" | sed 's/option=gocode_completions://g' }
rmhooks window go-autocomplete
unalias window complete go-complete
}
# Auto-format
# ‾‾‾‾‾‾‾‾‾‾‾
decl -hidden str go_format_tmp_dir
def -params ..1 go-format \
-docstring "go-format [-use-goimports]: custom formatter for go files" %{
%sh{
dir=$(mktemp -d -t kak-go.XXXXXXXX)
printf %s\\n "set buffer go_format_tmp_dir ${dir}"
printf %s\\n "eval -no-hooks write ${dir}/buf"
}
%sh{
dir=${kak_opt_go_format_tmp_dir}
if [ "$1" = "-use-goimports" ]; then
fmt_cmd="goimports -srcdir '${kak_buffile}'"
else
fmt_cmd="gofmt -s"
fi
eval "${fmt_cmd} -e -w ${dir}/buf 2> ${dir}/stderr"
if [ $? ]; then
cp ${dir}/buf "${kak_buffile}"
else
# we should report error if linting isn't active
printf %s\\n "echo -debug '$(cat ${dir}/stderr)'"
fi
rm -r ${dir}
}
edit!
}
# Documentation
# ‾‾‾‾‾‾‾‾‾‾‾‾‾
decl -hidden str go_doc_tmp_dir
# FIXME text escaping
def -hidden -params 1..2 _gogetdoc-cmd %{
%sh{
dir=$(mktemp -d -t kak-go.XXXXXXXX)
printf %s\\n "set buffer go_doc_tmp_dir ${dir}"
printf %s\\n "eval -no-hooks write ${dir}/buf"
}
%sh{
dir=${kak_opt_go_doc_tmp_dir}
(
printf %s\\n "${kak_buffile}" > ${dir}/modified
cat ${dir}/buf | wc -c >> ${dir}/modified
cat ${dir}/buf >> ${dir}/modified
if [ "$2" = "1" ]; then
args="-json"
fi
output=$(cat ${dir}/modified \
| gogetdoc $args -pos "${kak_buffile}:#${kak_cursor_byte_offset}" -modified \
| sed 's/%/%%/g')
rm -r ${dir}
printf %s "${output}" | grep -v -q "^gogetdoc: "
status=$?
case "$1" in
"info")
if [ ${status} -eq 0 ]; then
printf %s\\n "eval -client '${kak_client}' %{
info -anchor ${kak_cursor_line}.${kak_cursor_column} %@${output}@
}" | kak -p ${kak_session}
else
msg=$(printf %s "${output}" | cut -d' ' -f2-)
printf %s\\n "eval -client '${kak_client}' %{
echo '${msg}'
}" | kak -p ${kak_session}
fi
;;
"echo")
if [ ${status} -eq 0 ]; then
signature=$(printf %s "${output}" | sed -n 3p)
printf %s\\n "eval -client '${kak_client}' %{
echo '${signature}'
}" | kak -p ${kak_session}
fi
;;
"jump")
if [ ${status} -eq 0 ]; then
pos=$(printf %s "${output}" | jq -r .pos)
file=$(printf %s "${pos}" | cut -d: -f1)
line=$(printf %s "${pos}" | cut -d: -f2)
col=$(printf %s "${pos}" | cut -d: -f3)
printf %s\\n "eval -client '${kak_client}' %{
eval -try-client '${kak_opt_jumpclient}' edit -existing ${file} ${line} ${col}
try %{ focus '${kak_opt_jumpclient}' }
}" | kak -p ${kak_session}
fi
;;
*)
printf %s\\n "eval -client '${kak_client}' %{
echo -error %{unknown command '$1'}
}" | kak -p ${kak_session}
;;
esac
) > /dev/null 2>&1 < /dev/null &
}
}
def go-doc-info -docstring "Show the documentation of the symbol under the cursor" %{
_gogetdoc-cmd "info"
}
def go-print-signature -docstring "Print the signature of the symbol under the cursor" %{
_gogetdoc-cmd "echo"
}
def go-jump -docstring "Jump to the symbol definition" %{
_gogetdoc-cmd "jump" 1
}
def go-share-selection -docstring "Share the selection using the Go Playground" %{ %sh{
snippet_id=$(printf %s\\n "${kak_selection}" | curl -s https://play.golang.org/share --data-binary @-)
printf "echo https://play.golang.org/p/%s" ${snippet_id}
} }
|