diff --git a/rc/tools/ctags.kak b/rc/tools/ctags.kak index c41b0f41..e6bfb43e 100644 --- a/rc/tools/ctags.kak +++ b/rc/tools/ctags.kak @@ -25,27 +25,38 @@ If no symbol is passed then the current selection is used as symbol name} \ ctags-search \ %{ evaluate-commands %sh{ realpath() { ( cd "$(dirname "$1")"; printf "%s/%s\n" "$(pwd -P)" "$(basename "$1")" ) } - export tagname=${1:-${kak_selection}} + export tagname="${1:-${kak_selection}}" eval "set -- $kak_opt_ctagsfiles" for candidate in "$@"; do [ -f "$candidate" ] && realpath "$candidate" done | awk '!x[$0]++' | # remove duplicates while read -r tags; do printf '!TAGROOT\t%s\n' "$(realpath "${tags%/*}")/" - readtags -t "$tags" $tagname + readtags -t "$tags" "$tagname" done | awk -F '\t|\n' ' - /^!TAGROOT\t/ { tagroot=$2 } - /[^\t]+\t[^\t]+\t\/\^.*\$?\// { - re=$0; - sub(".*\t/\\^", "", re); sub("\\$?/$", "", re); gsub("(\\{|\\}|\\\\E).*$", "", re); - keys=re; gsub(/", keys); gsub(/\t/, "", keys); - out = out " %{" $2 " {MenuInfo}" re "} %{evaluate-commands %{ try %{ edit %{" path($2) "}; execute-keys %{/\\Q" keys "vc} } catch %{ echo %{unable to find tag} } } }" - } - /[^\t]+\t[^\t]+\t[0-9]+/ { out = out " %{" $2 ":" $3 "} %{evaluate-commands %{ edit %{" path($2) "} %{" $3 "}}}" } - END { print ( length(out) == 0 ? "echo -markup %{{Error}no such tag " ENVIRON["tagname"] "}" : "menu -markup -auto-single " out ) } - - # Ensure x is an absolute file path, by prepending with tagroot - function path(x) { return x ~/^\// ? x : tagroot x }' + /^!TAGROOT\t/ { tagroot=$2 } + /[^\t]+\t[^\t]+\t\/\^.*\$?\// { + opener = "\\{"; closer = "\\}" + line = $0; sub(".*\t/\\^", "", line); sub("\\$?/$", "", line); + menu_info = line; gsub("!", "!!", menu_info); gsub(/^[\t+ ]+/, "", menu_info); gsub(opener, "\\"opener, menu_info); gsub(/\t/, " ", menu_info); + keys = line; gsub(/", keys); gsub(/\t/, "", keys); gsub("!", "!!", keys); gsub("&", "&&", keys); gsub("#", "##", keys); gsub("\\|", "||", keys); gsub("\\\\/", "/", keys); + menu_item = $2; gsub("!", "!!", menu_item); + edit_path = path($2); gsub("&", "&&", edit_path); gsub("#", "##", edit_path); gsub("\\|", "||", edit_path); + select = $1; gsub(/", select); gsub(/\t/, "", select); gsub("!", "!!", select); gsub("&", "&&", select); gsub("#", "##", select); gsub("\\|", "||", select); + out = out "%!" menu_item ": {MenuInfo}" menu_info "! %!evaluate-commands %# try %& edit -existing %|" edit_path "|; execute-keys %|/\\Q" keys "vc| & catch %& echo -markup %|{Error}unable to find tag| &; try %& execute-keys %|s\\Q" select "| & # !" + } + /[^\t]+\t[^\t]+\t[0-9]+/ { + opener = "{"; closer = "}" + menu_item = $2; gsub("!", "!!", menu_item); + select = $1; gsub(/", select); gsub(/\t/, "", select); gsub("!", "!!", select); gsub("&", "&&", select); gsub("#", "##", select); gsub("\\|", "||", select); + menu_info = $3; gsub("!", "!!", menu_info); gsub(opener, "\\"opener, menu_info); + edit_path = path($2); gsub("!", "!!", edit_path); gsub("#", "##", edit_path); gsub("&", "&&", edit_path); gsub("\\|", "||", edit_path); + line_number = $3; + out = out "%!" menu_item ": {MenuInfo}" menu_info "! %!evaluate-commands %# try %& edit -existing %|" edit_path "|; execute-keys %|" line_number "gx| & catch %& echo -markup %|{Error}unable to find tag| &; try %& execute-keys %|s\\Q" select "| & # !" + } + END { print ( length(out) == 0 ? "echo -markup %{{Error}no such tag " ENVIRON["tagname"] "}" : "menu -markup -auto-single " out ) } + # Ensure x is an absolute file path, by prepending with tagroot + function path(x) { return x ~/^\// ? x : tagroot x }' }} define-command ctags-complete -docstring "Insert completion candidates for the current selection into the buffer's local variables" %{ evaluate-commands -draft %{