Convert some of the rc/ scripts to the new list syntax

Other scripts relying on lists are broken at the moment, and will
be fixed. This commit is a proof of concept of the new way to work
with lists.
This commit is contained in:
Maxime Coste 2018-05-30 23:28:50 +10:00
parent b548dd3a6f
commit e9fc54538d
6 changed files with 63 additions and 57 deletions

View File

@ -3,14 +3,14 @@
# This script requires the readtags command available in ctags source but # This script requires the readtags command available in ctags source but
# not installed by default # not installed by default
declare-option -docstring "colon separated list of paths to tag files to parse when looking up a symbol" \ declare-option -docstring "list of paths to tag files to parse when looking up a symbol" \
str-list ctagsfiles 'tags' str-list ctagsfiles 'tags'
define-command -params ..1 \ define-command -params ..1 \
-shell-candidates %{ -shell-candidates %{
realpath() { ( path=$(readlink "$1"); cd "$(dirname "$1")"; printf "%s/%s\n" "$(pwd -P)" "$(basename "$1")" ) } realpath() { ( path=$(readlink "$1"); cd "$(dirname "$1")"; printf "%s/%s\n" "$(pwd -P)" "$(basename "$1")" ) }
printf %s\\n "$kak_opt_ctagsfiles" | tr ':' '\n' | eval "set -- $kak_opt_ctagsfiles"
while read -r candidate; do for candidate in "$@"; do
[ -f "$candidate" ] && realpath "$candidate" [ -f "$candidate" ] && realpath "$candidate"
done | awk '!x[$0]++' | # remove duplicates done | awk '!x[$0]++' | # remove duplicates
while read -r tags; do while read -r tags; do
@ -26,8 +26,8 @@ If no symbol is passed then the current selection is used as symbol name} \
%{ evaluate-commands %sh{ %{ evaluate-commands %sh{
realpath() { ( path=$(readlink "$1"); cd "$(dirname "$1")"; printf "%s/%s\n" "$(pwd -P)" "$(basename "$1")" ) } realpath() { ( path=$(readlink "$1"); cd "$(dirname "$1")"; printf "%s/%s\n" "$(pwd -P)" "$(basename "$1")" ) }
export tagname=${1:-${kak_selection}} export tagname=${1:-${kak_selection}}
printf %s\\n "$kak_opt_ctagsfiles" | tr ':' '\n' | eval "set -- $kak_opt_ctagsfiles"
while read -r candidate; do for candidate in "$@"; do
[ -f "$candidate" ] && realpath "$candidate" [ -f "$candidate" ] && realpath "$candidate"
done | awk '!x[$0]++' | # remove duplicates done | awk '!x[$0]++' | # remove duplicates
while read -r tags; do while read -r tags; do

View File

@ -330,17 +330,19 @@ define-command -hidden c-family-insert-include-guards %{
hook -group c-family-insert global BufNewFile .*\.(h|hh|hpp|hxx|H) c-family-insert-include-guards hook -group c-family-insert global BufNewFile .*\.(h|hh|hpp|hxx|H) c-family-insert-include-guards
declare-option -docstring "colon separated list of path in which header files will be looked for" \ declare-option -docstring "colon separated list of path in which header files will be looked for" \
str-list alt_dirs ".:.." str-list alt_dirs '.' '..'
define-command c-family-alternative-file -docstring "Jump to the alternate file (header/implementation)" %{ evaluate-commands %sh{ define-command c-family-alternative-file -docstring "Jump to the alternate file (header/implementation)" %{ evaluate-commands %sh{
alt_dirs=$(printf %s\\n "${kak_opt_alt_dirs}" | tr ':' '\n')
file="${kak_buffile##*/}" file="${kak_buffile##*/}"
file_noext="${file%.*}" file_noext="${file%.*}"
dir=$(dirname "${kak_buffile}") dir=$(dirname "${kak_buffile}")
# Set $@ to alt_dirs
eval "set -- ${kak_opt_alt_dirs}"
case ${file} in case ${file} in
*.c|*.cc|*.cpp|*.cxx|*.C|*.inl|*.m) *.c|*.cc|*.cpp|*.cxx|*.C|*.inl|*.m)
for alt_dir in ${alt_dirs}; do for alt_dir in "$@"; do
for ext in h hh hpp hxx H; do for ext in h hh hpp hxx H; do
altname="${dir}/${alt_dir}/${file_noext}.${ext}" altname="${dir}/${alt_dir}/${file_noext}.${ext}"
if [ -f ${altname} ]; then if [ -f ${altname} ]; then
@ -351,7 +353,7 @@ define-command c-family-alternative-file -docstring "Jump to the alternate file
done done
;; ;;
*.h|*.hh|*.hpp|*.hxx|*.H) *.h|*.hh|*.hpp|*.hxx|*.H)
for alt_dir in ${alt_dirs}; do for alt_dir in "$@"; do
for ext in c cc cpp cxx C m; do for ext in c cc cpp cxx C m; do
altname="${dir}/${alt_dir}/${file_noext}.${ext}" altname="${dir}/${alt_dir}/${file_noext}.${ext}"
if [ -f ${altname} ]; then if [ -f ${altname} ]; then

View File

@ -43,7 +43,7 @@ evaluate-commands %sh{
# Add the language's grammar to the static completion list # Add the language's grammar to the static completion list
printf '%s\n' "hook global WinSetOption filetype=kak %{ printf '%s\n' "hook global WinSetOption filetype=kak %{
set-option window static_words '$(join "${keywords}:${attributes}:${types}:${values}" ':')' set-option window static_words $(join "${keywords} ${attributes} ${types} ${values}" ' ')'
set-option -- window extra_word_chars '-' set-option -- window extra_word_chars '-'
}" }"

View File

@ -50,7 +50,7 @@ The syntaxic errors detected during parsing are shown when auto-diagnostics are
/^COMPLETION:/ && ! /\(Hidden\)/ { /^COMPLETION:/ && ! /\(Hidden\)/ {
id=$2 id=$2
gsub(/ +$/, "", id) gsub(/ +$/, "", id)
gsub(/:/, "\\:", id) gsub(/~/, "~~", id)
gsub(/\|/, "\\|", id) gsub(/\|/, "\\|", id)
gsub(/[[{<]#|#[}>]/, "", $3) gsub(/[[{<]#|#[}>]/, "", $3)
@ -59,10 +59,10 @@ The syntaxic errors detected during parsing are shown when auto-diagnostics are
gsub(/ +$/, "", $3) gsub(/ +$/, "", $3)
desc=$4 ? $3 "\\n" $4 : $3 desc=$4 ? $3 "\\n" $4 : $3
gsub(/:/, "\\:", desc) gsub(/~/, "~~", desc)
gsub(/\|/, "\\|", desc) gsub(/\|/, "\\|", desc)
if (id in docstrings) if (id in docstrings)
docstrings[id]=docstrings[id] "\\n" desc docstrings[id]=docstrings[id] "\n" desc
else else
docstrings[id]=desc docstrings[id]=desc
} }
@ -72,31 +72,30 @@ The syntaxic errors detected during parsing are shown when auto-diagnostics are
gsub(/(^|[^[:alnum:]_])(operator|new|delete)($|[^{}_[:alnum:]]+)/, "{keyword}&{}", menu) gsub(/(^|[^[:alnum:]_])(operator|new|delete)($|[^{}_[:alnum:]]+)/, "{keyword}&{}", menu)
gsub(/(^|[[:space:]])(int|size_t|bool|char|unsigned|signed|long)($|[[:space:]])/, "{type}&{}", menu) gsub(/(^|[[:space:]])(int|size_t|bool|char|unsigned|signed|long)($|[[:space:]])/, "{type}&{}", menu)
gsub(/[^{}_[:alnum:]]+/, "{operator}&{}", menu) gsub(/[^{}_[:alnum:]]+/, "{operator}&{}", menu)
print id "|" docstrings[id] "|" menu printf "%%~%s|%s|%s~ ", id, docstrings[id], menu
} }
}' | paste -s -d ':' - | sed -e "s/\\\\n/\\n/g; s/'/\\\\'/g") }')
printf %s\\n "evaluate-commands -client ${kak_client} echo 'clang completion done' printf %s\\n "evaluate-commands -client ${kak_client} echo 'clang completion done'
set-option 'buffer=${kak_buffile}' clang_completions '${header}:${compl}'" | kak -p ${kak_session} set-option 'buffer=${kak_buffile}' clang_completions ${header} ${compl}" | kak -p ${kak_session}
else else
clang++ -x ${ft} -fsyntax-only ${kak_opt_clang_options} - < ${dir}/buf 2> ${dir}/stderr clang++ -x ${ft} -fsyntax-only ${kak_opt_clang_options} - < ${dir}/buf 2> ${dir}/stderr
printf %s\\n "evaluate-commands -client ${kak_client} echo 'clang parsing done'" | kak -p ${kak_session} printf %s\\n "evaluate-commands -client ${kak_client} echo 'clang parsing done'" | kak -p ${kak_session}
fi fi
flags=$(cat ${dir}/stderr | sed -rne " flags=$(cat ${dir}/stderr | sed -rne "
/^<stdin>:[0-9]+:([0-9]+:)? (fatal )?error/ { s/^<stdin>:([0-9]+):.*/\1|{red}█/; p } /^<stdin>:[0-9]+:([0-9]+:)? (fatal )?error/ { s/^<stdin>:([0-9]+):.*/'\1|{red}█'/; p }
/^<stdin>:[0-9]+:([0-9]+:)? warning/ { s/^<stdin>:([0-9]+):.*/\1|{yellow}█/; p } /^<stdin>:[0-9]+:([0-9]+:)? warning/ { s/^<stdin>:([0-9]+):.*/'\1|{yellow}█'/; p }
" | paste -s -d ':' -) " | paste -s -d ' ' -)
errors=$(cat ${dir}/stderr | sed -rne " errors=$(cat ${dir}/stderr | sed -rne "
/^<stdin>:[0-9]+:([0-9]+:)? ((fatal )?error|warning)/ { /^<stdin>:[0-9]+:([0-9]+:)? ((fatal )?error|warning)/ {
s/^<stdin>:([0-9]+):([0-9]+:)? (.*)/\1|\3/ s/'/''/g; s/^<stdin>:([0-9]+):([0-9]+:)? (.*)/'\1|\3'/; p
s/'/\\\\'/g; s/:/\\\\:/g; p }" | sort -n | paste -s -d ' ' -)
}" | sort -n | paste -s -d ':' -)
sed -e "s|<stdin>|${kak_bufname}|g" < ${dir}/stderr > ${dir}/fifo sed -e "s|<stdin>|${kak_bufname}|g" < ${dir}/stderr > ${dir}/fifo
printf %s\\n "set-option 'buffer=${kak_buffile}' clang_flags %{${kak_timestamp}:${flags}} printf %s\\n "set-option 'buffer=${kak_buffile}' clang_flags ${kak_timestamp} ${flags}
set-option 'buffer=${kak_buffile}' clang_errors '${kak_timestamp}:${errors}'" | kak -p ${kak_session} set-option 'buffer=${kak_buffile}' clang_errors ${kak_timestamp} ${errors}" | kak -p ${kak_session}
) > /dev/null 2>&1 < /dev/null & ) > /dev/null 2>&1 < /dev/null &
} }
} }
@ -115,7 +114,7 @@ define-command -hidden clang-show-completion-info %[ try %[
] ] ] ]
define-command clang-enable-autocomplete -docstring "Enable automatic clang completion" %{ define-command clang-enable-autocomplete -docstring "Enable automatic clang completion" %{
set-option window completers "option=clang_completions:%opt{completers}" set-option window completers "option=clang_completions" %opt{completers}
hook window -group clang-autocomplete InsertIdle .* %{ hook window -group clang-autocomplete InsertIdle .* %{
try %{ try %{
execute-keys -draft <a-h><a-k>(\.|->|::).\z<ret> execute-keys -draft <a-h><a-k>(\.|->|::).\z<ret>
@ -128,7 +127,7 @@ define-command clang-enable-autocomplete -docstring "Enable automatic clang comp
} }
define-command clang-disable-autocomplete -docstring "Disable automatic clang completion" %{ define-command clang-disable-autocomplete -docstring "Disable automatic clang completion" %{
set-option window completers %sh{ printf %s\\n "'${kak_opt_completers}'" | sed -e 's/option=clang_completions://g' } evaluate-commands %sh{ printf "set-option window completers "; printf %s\\n "'${kak_opt_completers}'" | sed -e "s/'option=clang_completions'//g" }
remove-hooks window clang-autocomplete remove-hooks window clang-autocomplete
unalias window complete clang-complete unalias window complete clang-complete
} }
@ -136,11 +135,15 @@ define-command clang-disable-autocomplete -docstring "Disable automatic clang co
define-command -hidden clang-show-error-info %{ define-command -hidden clang-show-error-info %{
update-option buffer clang_errors # Ensure we are up to date with buffer changes update-option buffer clang_errors # Ensure we are up to date with buffer changes
evaluate-commands %sh{ evaluate-commands %sh{
desc=$(printf %s\\n "${kak_opt_clang_errors}" | eval "set -- ${kak_opt_clang_errors}"
sed -e "s/\([^\\]\):/\1\n/g" | shift # skip timestamp
sed -ne "/^${kak_cursor_line}|.*/ { s/^[[:digit:]]\+|//g; s/'/\\\\'/g; s/\\\\:/:/g; p }") for error in "$@"; do
if [ "${error%%|*}" == "$kak_cursor_line" ]; then
desc=$(printf '%s%s\n' "$desc" "${error##*|}")
fi
done
if [ -n "$desc" ]; then if [ -n "$desc" ]; then
printf %s\\n "info -anchor ${kak_cursor_line}.${kak_cursor_column} '${desc}'" printf %s\\n "info -anchor ${kak_cursor_line}.${kak_cursor_column} '$desc'"
fi fi
} } } }
@ -160,8 +163,10 @@ define-command clang-disable-diagnostics -docstring "Disable automatic error rep
define-command clang-diagnostics-next -docstring "Jump to the next line that contains an error" %{ define-command clang-diagnostics-next -docstring "Jump to the next line that contains an error" %{
update-option buffer clang_errors # Ensure we are up to date with buffer changes update-option buffer clang_errors # Ensure we are up to date with buffer changes
evaluate-commands %sh{ evaluate-commands %sh{
printf "%s\n" "${kak_opt_clang_errors}" | sed -e 's/\([^\\]\):/\1\n/g' | tail -n +2 | ( eval "set -- ${kak_opt_clang_errors}"
while IFS='|' read candidate rest; do shift # skip timestamp
for error in "$@"; do
candidate=${error%%|*}
first_line=${first_line-$candidate} first_line=${first_line-$candidate}
if [ "$candidate" -gt $kak_cursor_line ]; then if [ "$candidate" -gt $kak_cursor_line ]; then
line=$candidate line=$candidate
@ -174,5 +179,4 @@ define-command clang-diagnostics-next -docstring "Jump to the next line that con
else else
echo "echo -markup '{Error}no next clang diagnostic'" echo "echo -markup '{Error}no next clang diagnostic'"
fi fi
)
} } } }

View File

@ -70,14 +70,14 @@ Available commands:\n add\n rm\n blame\n commit\n checkout\n diff\n hide-
function send_flags(text, flag, i) { function send_flags(text, flag, i) {
if (line == "") { return; } if (line == "") { return; }
text=substr(sha,1,8) " " dates[sha] " " authors[sha] text=substr(sha,1,8) " " dates[sha] " " authors[sha]
gsub(":", "\\:", text)
# gsub("|", "\\|", text) # gsub("|", "\\|", text)
flag=line "|" text gsub("~", "~~", text)
flag="%~" line "|" text "~"
for ( i=1; i < count; i++ ) { for ( i=1; i < count; i++ ) {
flag=flag ":" line+i "|" text flag=flag " %~" line+i "|" text "~"
} }
cmd = "kak -p " ENVIRON["kak_session"] cmd = "kak -p " ENVIRON["kak_session"]
print "set-option -add buffer=" ENVIRON["kak_bufname"] " git_blame_flags %{" flag "}" | cmd print "set-option -add buffer=" ENVIRON["kak_bufname"] " git_blame_flags " flag | cmd
close(cmd) close(cmd)
} }
/^([0-9a-f]{40}) ([0-9]+) ([0-9]+) ([0-9]+)/ { /^([0-9a-f]{40}) ([0-9]+) ([0-9]+) ([0-9]+)/ {
@ -109,39 +109,39 @@ Available commands:\n add\n rm\n blame\n commit\n checkout\n diff\n hide-
if ($from_count == 0 and $to_count > 0) { if ($from_count == 0 and $to_count > 0) {
for $i (0..$to_count - 1) { for $i (0..$to_count - 1) {
$line = $to_line + $i; $line = $to_line + $i;
$flags .= ":$line|\{green\}+"; $flags .= " $line|\{green\}+";
} }
} }
elsif ($from_count > 0 and $to_count == 0) { elsif ($from_count > 0 and $to_count == 0) {
if ($to_line == 0) { if ($to_line == 0) {
$flags .= ":1|\{red\}‾"; $flags .= " 1|\{red\}‾";
} else { } else {
$flags .= ":$to_line|\{red\}_"; $flags .= " $to_line|\{red\}_";
} }
} }
elsif ($from_count > 0 and $from_count == $to_count) { elsif ($from_count > 0 and $from_count == $to_count) {
for $i (0..$to_count - 1) { for $i (0..$to_count - 1) {
$line = $to_line + $i; $line = $to_line + $i;
$flags .= ":$line|\{blue\}~"; $flags .= " $line|\{blue\}~";
} }
} }
elsif ($from_count > 0 and $from_count < $to_count) { elsif ($from_count > 0 and $from_count < $to_count) {
for $i (0..$from_count - 1) { for $i (0..$from_count - 1) {
$line = $to_line + $i; $line = $to_line + $i;
$flags .= ":$line|\{blue\}~"; $flags .= " $line|\{blue\}~";
} }
for $i ($from_count..$to_count - 1) { for $i ($from_count..$to_count - 1) {
$line = $to_line + $i; $line = $to_line + $i;
$flags .= ":$line|\{green\}+"; $flags .= " $line|\{green\}+";
} }
} }
elsif ($to_count > 0 and $from_count > $to_count) { elsif ($to_count > 0 and $from_count > $to_count) {
for $i (0..$to_count - 2) { for $i (0..$to_count - 2) {
$line = $to_line + $i; $line = $to_line + $i;
$flags .= ":$line|\{blue\}~"; $flags .= " $line|\{blue\}~";
} }
$last = $to_line + $to_count - 1; $last = $to_line + $to_count - 1;
$flags .= ":$last|\{blue+u\}~"; $flags .= " $last|\{blue+u\}~";
} }
} }
} }

View File

@ -1,7 +1,7 @@
declare-option -hidden str jedi_tmp_dir declare-option -hidden str jedi_tmp_dir
declare-option -hidden completions jedi_completions declare-option -hidden completions jedi_completions
declare-option -docstring "colon separated list of path added to `python`'s $PYTHONPATH environment variable" \ declare-option -docstring "colon separated list of path added to `python`'s $PYTHONPATH environment variable" \
str-list jedi_python_path str jedi_python_path
define-command jedi-complete -docstring "Complete the current selection" %{ define-command jedi-complete -docstring "Complete the current selection" %{
evaluate-commands %sh{ evaluate-commands %sh{