From 67ce6946d2b9b6cce5df053f1920d74ee7874e84 Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 12 Mar 2018 12:47:47 +0000 Subject: [PATCH 1/4] Add jumpToDefinition and showDoc support for rust (with racer) --- rc/extra/racer.kak | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/rc/extra/racer.kak b/rc/extra/racer.kak index 944e9c65..45ecb8fc 100644 --- a/rc/extra/racer.kak +++ b/rc/extra/racer.kak @@ -93,3 +93,53 @@ define-command racer-disable-autocomplete -docstring "Disable racer completion" remove-hooks window racer-autocomplete unalias window complete racer-complete } + +define-command racer-go-definition -docstring "Jump to where the rust identifier below the cursor is defined" %{ + %sh{ + dir=$(mktemp -d "${TMPDIR:-/tmp}"/kak-racer.XXXXXXXX) + printf %s\\n "set-option buffer racer_tmp_dir ${dir}" + printf %s\\n "evaluate-commands -no-hooks %{ write ${dir}/buf }" + } + %sh{ + dir=${kak_opt_racer_tmp_dir} + ( + cursor="${kak_cursor_line} $((${kak_cursor_column} - 1))" + racer_data=$(racer --interface tab-text find-definition ${cursor} ${kak_buffile} ${dir}/buf | head -n 1) + racer_match=$(echo "$racer_data" | cut -f1 ) + if [[ "$racer_match" == "MATCH" ]]; then + racer_line=$(echo "$racer_data" | cut -f3 ) + racer_column=$(echo "$racer_data" | cut -f4 ) + racer_file=$(echo "$racer_data" | cut -f5 ) + printf %s\\n "edit -existing '$racer_file' $racer_line $racer_column" + printf %s\\n "set-option buffer readonly true" + else + printf %s\\n "echo -debug 'racer could not find a definition'" + fi + ) + } +} + +define-command racer-show-doc -docstring "Show the documentation about the rust identifier below the cursor" %{ + %sh{ + dir=$(mktemp -d "${TMPDIR:-/tmp}"/kak-racer.XXXXXXXX) + printf %s\\n "set-option buffer racer_tmp_dir ${dir}" + printf %s\\n "evaluate-commands -no-hooks %{ write ${dir}/buf }" + } + %sh{ + dir=${kak_opt_racer_tmp_dir} + ( + cursor="${kak_cursor_line} $((${kak_cursor_column} - 1))" + racer_data=$(racer --interface tab-text complete-with-snippet ${cursor} ${kak_buffile} ${dir}/buf | head -n 2 | tail -n 1) + racer_match=$(echo "$racer_data" | cut -f1 ) + printf %s\\n "info '$racer_data'" + if [[ "$racer_match" == "MATCH" ]]; then + racer_doc=$(echo "$racer_data" | cut -f9 | xargs ) + racer_doc=$(echo "${racer_doc//\\n/ +}") # This is a bit ugly and probably should be replaced with something better than a new line in the code itself, but I couldn't work how + printf %s\\n "info '$racer_doc'" + else + printf %s\\n "echo -debug 'racer could not find a definition'" + fi + ) + } +} From 2f41fdb683644aefed4ef2534522c9b54183c08e Mon Sep 17 00:00:00 2001 From: Marc Date: Tue, 13 Mar 2018 13:52:09 +0000 Subject: [PATCH 2/4] Tweak the bash code on the racer support --- rc/extra/racer.kak | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/rc/extra/racer.kak b/rc/extra/racer.kak index 45ecb8fc..57ac37a1 100644 --- a/rc/extra/racer.kak +++ b/rc/extra/racer.kak @@ -105,11 +105,11 @@ define-command racer-go-definition -docstring "Jump to where the rust identifier ( cursor="${kak_cursor_line} $((${kak_cursor_column} - 1))" racer_data=$(racer --interface tab-text find-definition ${cursor} ${kak_buffile} ${dir}/buf | head -n 1) - racer_match=$(echo "$racer_data" | cut -f1 ) + racer_match=$(printf %s\\n "$racer_data" | cut -f1 ) if [[ "$racer_match" == "MATCH" ]]; then - racer_line=$(echo "$racer_data" | cut -f3 ) - racer_column=$(echo "$racer_data" | cut -f4 ) - racer_file=$(echo "$racer_data" | cut -f5 ) + racer_line=$(printf %s\\n "$racer_data" | cut -f3 ) + racer_column=$(printf %s\\n "$racer_data" | cut -f4 ) + racer_file=$(printf %s\\n "$racer_data" | cut -f5 ) printf %s\\n "edit -existing '$racer_file' $racer_line $racer_column" printf %s\\n "set-option buffer readonly true" else @@ -128,15 +128,16 @@ define-command racer-show-doc -docstring "Show the documentation about the rust %sh{ dir=${kak_opt_racer_tmp_dir} ( - cursor="${kak_cursor_line} $((${kak_cursor_column} - 1))" + printf -v NEWLINE '\n' + cursor="${kak_cursor_line} ${kak_cursor_column}" racer_data=$(racer --interface tab-text complete-with-snippet ${cursor} ${kak_buffile} ${dir}/buf | head -n 2 | tail -n 1) - racer_match=$(echo "$racer_data" | cut -f1 ) - printf %s\\n "info '$racer_data'" + racer_match=$(printf %s\\n "$racer_data" | cut -f1) + printf %s\\n "info %@.$racer_match.@" if [[ "$racer_match" == "MATCH" ]]; then - racer_doc=$(echo "$racer_data" | cut -f9 | xargs ) - racer_doc=$(echo "${racer_doc//\\n/ -}") # This is a bit ugly and probably should be replaced with something better than a new line in the code itself, but I couldn't work how - printf %s\\n "info '$racer_doc'" + racer_doc=$(printf %s\\n "$racer_data" | cut -f9 | xargs ) + racer_doc=$(printf %s\\n "$racer_doc" | sed -e "s/\\\n/\\$NEWLINE/g") + racer_doc=$(printf %s\\n "$racer_doc" | sed -e "s/@/\\@/g") + printf %s\\n "info %@$racer_doc@" else printf %s\\n "echo -debug 'racer could not find a definition'" fi From 2bf8941d99f18f7a1a55711dd727f069b6d63b0f Mon Sep 17 00:00:00 2001 From: Marc Date: Wed, 14 Mar 2018 15:56:25 +0000 Subject: [PATCH 3/4] Clean racer support functions --- rc/extra/racer.kak | 52 ++++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/rc/extra/racer.kak b/rc/extra/racer.kak index 57ac37a1..8ca9eafc 100644 --- a/rc/extra/racer.kak +++ b/rc/extra/racer.kak @@ -102,20 +102,18 @@ define-command racer-go-definition -docstring "Jump to where the rust identifier } %sh{ dir=${kak_opt_racer_tmp_dir} - ( - cursor="${kak_cursor_line} $((${kak_cursor_column} - 1))" - racer_data=$(racer --interface tab-text find-definition ${cursor} ${kak_buffile} ${dir}/buf | head -n 1) - racer_match=$(printf %s\\n "$racer_data" | cut -f1 ) - if [[ "$racer_match" == "MATCH" ]]; then - racer_line=$(printf %s\\n "$racer_data" | cut -f3 ) - racer_column=$(printf %s\\n "$racer_data" | cut -f4 ) - racer_file=$(printf %s\\n "$racer_data" | cut -f5 ) - printf %s\\n "edit -existing '$racer_file' $racer_line $racer_column" - printf %s\\n "set-option buffer readonly true" - else - printf %s\\n "echo -debug 'racer could not find a definition'" - fi - ) + cursor="${kak_cursor_line} $((${kak_cursor_column} - 1))" + racer_data=$(racer --interface tab-text find-definition ${cursor} "${kak_buffile}" "${dir}/buf" | head -n 1) + racer_match=$(printf %s\\n "$racer_data" | cut -f1 ) + if [ "$racer_match" = "MATCH" ]; then + racer_line=$(printf %s\\n "$racer_data" | cut -f3 ) + racer_column=$(printf %s\\n "$racer_data" | cut -f4 ) + racer_file=$(printf %s\\n "$racer_data" | cut -f5 ) + printf %s\\n "edit -existing '$racer_file' $racer_line $racer_column" + #printf %s\\n "set-option buffer readonly true" + else + printf %s\\n "echo -debug 'racer could not find a definition'" + fi } } @@ -127,20 +125,16 @@ define-command racer-show-doc -docstring "Show the documentation about the rust } %sh{ dir=${kak_opt_racer_tmp_dir} - ( - printf -v NEWLINE '\n' - cursor="${kak_cursor_line} ${kak_cursor_column}" - racer_data=$(racer --interface tab-text complete-with-snippet ${cursor} ${kak_buffile} ${dir}/buf | head -n 2 | tail -n 1) - racer_match=$(printf %s\\n "$racer_data" | cut -f1) - printf %s\\n "info %@.$racer_match.@" - if [[ "$racer_match" == "MATCH" ]]; then - racer_doc=$(printf %s\\n "$racer_data" | cut -f9 | xargs ) - racer_doc=$(printf %s\\n "$racer_doc" | sed -e "s/\\\n/\\$NEWLINE/g") - racer_doc=$(printf %s\\n "$racer_doc" | sed -e "s/@/\\@/g") - printf %s\\n "info %@$racer_doc@" - else - printf %s\\n "echo -debug 'racer could not find a definition'" - fi - ) + cursor="${kak_cursor_line} ${kak_cursor_column}" + racer_data=$(racer --interface tab-text complete-with-snippet ${cursor} "${kak_buffile}" "${dir}/buf" | head -n 2 | tail -n 1) + racer_match=$(printf %s\\n "$racer_data" | cut -f1) + if [ "$racer_match" = "MATCH" ]; then + racer_doc=$(printf %s\\n "$racer_data" | cut -f9 ) + racer_doc=$(printf %s\\n "$racer_doc" | sed -e 's/^"\(.*\)"$/\1/g') + racer_doc=$(printf %s\\n "$racer_doc" | sed -e "s/@/\\\\@/g") + printf "info %%@$racer_doc@" + else + printf %s\\n "echo -debug 'racer could not find a definition'" + fi } } From 898dfea8a15bc1b06a0e0f16c601aa7e6e3b4fb8 Mon Sep 17 00:00:00 2001 From: Marc Date: Thu, 15 Mar 2018 20:37:27 +0000 Subject: [PATCH 4/4] racer-go-definition forces readonly on files external to the project --- rc/extra/racer.kak | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/rc/extra/racer.kak b/rc/extra/racer.kak index 8ca9eafc..6e2b07b5 100644 --- a/rc/extra/racer.kak +++ b/rc/extra/racer.kak @@ -104,13 +104,20 @@ define-command racer-go-definition -docstring "Jump to where the rust identifier dir=${kak_opt_racer_tmp_dir} cursor="${kak_cursor_line} $((${kak_cursor_column} - 1))" racer_data=$(racer --interface tab-text find-definition ${cursor} "${kak_buffile}" "${dir}/buf" | head -n 1) + racer_match=$(printf %s\\n "$racer_data" | cut -f1 ) if [ "$racer_match" = "MATCH" ]; then racer_line=$(printf %s\\n "$racer_data" | cut -f3 ) racer_column=$(printf %s\\n "$racer_data" | cut -f4 ) racer_file=$(printf %s\\n "$racer_data" | cut -f5 ) printf %s\\n "edit -existing '$racer_file' $racer_line $racer_column" - #printf %s\\n "set-option buffer readonly true" + if [[ "$racer_file" == ${RUST_SRC_PATH}* ]]; then + printf %s\\n "set-option buffer readonly true" # The definition resides on the standard library, and the new buffer should be readonly + else + if [[ "$racer_file" == ${HOME}/.cargo/registry/src* ]]; then + printf %s\\n "set-option buffer readonly true" # The definition resides on an external crate, and the new buffer should be readonly + fi + fi else printf %s\\n "echo -debug 'racer could not find a definition'" fi @@ -126,12 +133,13 @@ define-command racer-show-doc -docstring "Show the documentation about the rust %sh{ dir=${kak_opt_racer_tmp_dir} cursor="${kak_cursor_line} ${kak_cursor_column}" - racer_data=$(racer --interface tab-text complete-with-snippet ${cursor} "${kak_buffile}" "${dir}/buf" | head -n 2 | tail -n 1) + racer_data=$(racer --interface tab-text complete-with-snippet ${cursor} "${kak_buffile}" "${dir}/buf" | sed -n 2p ) racer_match=$(printf %s\\n "$racer_data" | cut -f1) if [ "$racer_match" = "MATCH" ]; then racer_doc=$(printf %s\\n "$racer_data" | cut -f9 ) - racer_doc=$(printf %s\\n "$racer_doc" | sed -e 's/^"\(.*\)"$/\1/g') - racer_doc=$(printf %s\\n "$racer_doc" | sed -e "s/@/\\\\@/g") + racer_doc=$(printf %s\\n "$racer_doc" | + sed -e 's/^"\(.*\)"$/\1/g' | # Remove leading and trailing quotes + sed -e "s/@/\\\\@/g") # Escape all @ so that it can be properly used in the string expansion printf "info %%@$racer_doc@" else printf %s\\n "echo -debug 'racer could not find a definition'"