mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
Following https://github.com/nim-lang/nimble/pull/1347, this patch adds bash completion support for `nim`, `nimgrep`, `nimpretty`, `nimsuggest`.
340 lines
9.5 KiB
Bash
340 lines
9.5 KiB
Bash
# bash completion for nimgrep -*- shell-script -*-
|
|
|
|
__is_short_or_long()
|
|
{
|
|
local actual short long
|
|
actual="$1"
|
|
short="$2"
|
|
long="$3"
|
|
[[ ! -z $short && $actual == $short ]] && return 0
|
|
[[ ! -z $long && $actual == $long ]] && return 0
|
|
return 1
|
|
}
|
|
|
|
__ask_for_subcmd_or_subopts()
|
|
{
|
|
local args cmd subcmd words sub_words word_first word_last word_lastlast
|
|
local len ilast ilastlast i ele sub_len n_nopts
|
|
|
|
args=("$@")
|
|
ask_for_what="${args[0]}"
|
|
cmd="${args[1]}"
|
|
subcmd="${args[2]}"
|
|
ilast="${args[3]}"
|
|
words=("${args[@]:4}")
|
|
len=${#words[@]}
|
|
ilastlast=$((ilast - 1))
|
|
sub_words=("${words[@]:0:ilast}")
|
|
sub_len=${#sub_words[@]}
|
|
word_first=${words[0]}
|
|
word_last=${words[ilast]}
|
|
word_lastlast=${words[ilastlast]}
|
|
n_nopts=0
|
|
|
|
# printf "\n[DBUG] word_first:${word_first}|ilast:${ilast}|words(${len}):${words[*]}|sub_words(${sub_len}):${sub_words[*]}\n"
|
|
|
|
if [[ $word_first != $cmd ]]
|
|
then
|
|
return 1
|
|
fi
|
|
|
|
i=0
|
|
while [[ $i -lt $len ]]
|
|
do
|
|
ele=${words[i]}
|
|
if [[ ! $ele =~ ^- ]]
|
|
then
|
|
if [[ $ele == $cmd || $ele == $subcmd ]]
|
|
then
|
|
((n_nopts+=1))
|
|
elif [[ $i -eq $ilast && $ele =~ ^[a-zA-Z] ]]
|
|
then
|
|
((i=i))
|
|
elif [[ -z $ele ]]
|
|
then
|
|
((i=i))
|
|
elif [[ $ele =~ ^: ]]
|
|
then
|
|
((i+=1))
|
|
else
|
|
return 1
|
|
fi
|
|
fi
|
|
((i+=1))
|
|
done
|
|
|
|
case $ask_for_what in
|
|
1)
|
|
if [[ n_nopts -eq 1 ]]
|
|
then
|
|
if [[ -z $word_last || $word_last =~ ^[a-zA-Z] ]] && [[ $word_lastlast != : ]]
|
|
then
|
|
return 0
|
|
fi
|
|
fi
|
|
;;
|
|
2)
|
|
if [[ n_nopts -eq 2 ]]
|
|
then
|
|
if [[ -z $word_last ]] || [[ $word_last =~ ^[-:] ]]
|
|
then
|
|
return 0
|
|
fi
|
|
fi
|
|
esac
|
|
|
|
return 1
|
|
}
|
|
|
|
__ask_for_subcmd()
|
|
{
|
|
__ask_for_subcmd_or_subopts 1 "$@"
|
|
}
|
|
|
|
__ask_for_subcmd_opts()
|
|
{
|
|
__ask_for_subcmd_or_subopts 2 "$@"
|
|
}
|
|
|
|
_nimgrep()
|
|
{
|
|
local curr prev prevprev words
|
|
local i_curr n_words i_prev i_prevprev
|
|
|
|
COMPREPLY=()
|
|
i_curr=$COMP_CWORD
|
|
n_words=$((i_curr+1))
|
|
i_prev=$((i_curr-1))
|
|
i_prevprev=$((i_curr-2))
|
|
curr="${COMP_WORDS[i_curr]}"
|
|
prev="${COMP_WORDS[i_prev]}"
|
|
prevprev="${COMP_WORDS[i_prevprev]}"
|
|
words=("${COMP_WORDS[@]:0:n_words}")
|
|
|
|
local subcmds opts candids
|
|
|
|
# printf "\n[DBUG] curr:$curr|prev:$prev|words(${#words[*]}):${words[*]}\n"
|
|
|
|
# Asking for a subcommand
|
|
if false && __ask_for_subcmd nimgrep nimgrep $i_curr "${words[@]}"
|
|
then
|
|
subcmds=""
|
|
return 0
|
|
fi
|
|
|
|
# Prioritize subcmd over opt
|
|
if false
|
|
then
|
|
return 124
|
|
elif false && __ask_for_subcmd_opts nimgrep compileToC $i_curr "${words[@]}"
|
|
then
|
|
opts=() \
|
|
&& candids=()
|
|
else
|
|
opts=() \
|
|
&& candids=()
|
|
opts+=("-f" "--find" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--replace" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--confirm" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--filenames" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--peg" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--re" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-x" "--rex" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-w" "--word" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-i" "--ignoreCase" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-y" "--ignoreStyle" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-r" "--recursive" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--follow" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-s" "--sortTime" "asc desc") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--extensions" "EX") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--notextensions" "EX") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--filename" "PAT") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--notfilename" "PAT") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--dirname" "PAT") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--notdirname" "PAT") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--dirpath" "PAT") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--notdirpath" "PAT") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--inFile" "PAT") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--notinFile" "PAT") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--bin" "on off only") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-t" "--text" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--inContext" "PAT") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--notinContext" "PAT") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--nocolor" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--colorTheme" "THEME") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--color" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--count" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-c" "--context" "N") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-a" "--afterContext" "N") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-b" "--beforeContext" "N") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-g" "--group" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-l" "--newLine" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--cols" "N auto") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--onlyAscii" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-j" "--threads" "N") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--stdin" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("" "--verbose" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-h" "--help" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
opts+=("-v" "--version" "") \
|
|
&& candids+=(${opts[$((${#opts[@]}-3))]} ${opts[$((${#opts[@]}-2))]})
|
|
fi
|
|
|
|
local c_short c_long c_accvals
|
|
local len i idx0 idx1 idx2
|
|
|
|
case $curr in
|
|
# Asking for accepted optvalues, e.g., `out:`
|
|
:)
|
|
len=${#opts[@]}
|
|
i=0
|
|
|
|
while [[ $i -lt $len ]]
|
|
do
|
|
idx0=$((i / 3 * 3))
|
|
idx1=$((idx0 + 1))
|
|
idx2=$((idx1 + 1))
|
|
c_short=${opts[idx0]}
|
|
c_long=${opts[idx1]}
|
|
c_accvals=${opts[idx2]}
|
|
(false \
|
|
|| __is_short_or_long $prev ${c_short} ${c_long} \
|
|
|| false) \
|
|
&& COMPREPLY=( $(compgen -W "${c_accvals}" --) ) \
|
|
&& return 0
|
|
((i+=3))
|
|
done
|
|
|
|
return 124
|
|
;;
|
|
|
|
*)
|
|
# When in a incomplete opt value, e.g., `--check:of`
|
|
if [[ $prev == : ]]
|
|
then
|
|
len=${#opts[@]}
|
|
i=0
|
|
while [[ $i -lt $len ]]
|
|
do
|
|
idx0=$((i / 3 * 3))
|
|
idx1=$((idx0 + 1))
|
|
idx2=$((idx1 + 1))
|
|
c_short=${opts[idx0]}
|
|
c_long=${opts[idx1]}
|
|
c_accvals=${opts[idx2]}
|
|
(false \
|
|
|| __is_short_or_long $prevprev ${c_short} ${c_long} \
|
|
|| false) \
|
|
&& COMPREPLY=( $(compgen -W "${c_accvals}" -- ${curr}) ) \
|
|
&& return 0
|
|
((i+=3))
|
|
done
|
|
return 124
|
|
fi
|
|
|
|
# When in a complete optname, might need optvalue, e.g., `--check`
|
|
if [[ $curr =~ ^--?[:()a-zA-Z]+$ ]]
|
|
then
|
|
len=${#opts[@]}
|
|
i=0
|
|
while [[ $i -lt $len ]]
|
|
do
|
|
idx0=$(((i / 3 * 3)))
|
|
idx1=$((idx0 + 1))
|
|
idx2=$((idx1 + 1))
|
|
c_short=${opts[idx0]}
|
|
c_long=${opts[idx1]}
|
|
c_accvals=${opts[idx2]}
|
|
|
|
if __is_short_or_long $curr ${c_short} ${c_long}
|
|
then
|
|
if [[ ! -z $c_accvals ]]
|
|
then
|
|
COMPREPLY=( $(compgen -W "${curr}:" -- ${curr}) ) \
|
|
&& compopt -o nospace \
|
|
&& return 0
|
|
else
|
|
COMPREPLY=( $(compgen -W "${curr}" -- ${curr}) ) \
|
|
&& return 0
|
|
fi
|
|
fi
|
|
|
|
((i+=3))
|
|
done # while
|
|
|
|
if true
|
|
then
|
|
COMPREPLY=( $(compgen -W "${candids[*]}" -- "$curr") )
|
|
compopt -o nospace
|
|
return 0
|
|
fi
|
|
|
|
# When in an incomplete optname, e.g., `--chec`
|
|
elif [[ $curr =~ ^--?[^:]* ]]
|
|
then
|
|
if true
|
|
then
|
|
COMPREPLY=( $(compgen -W "${candids[*]}" -- "$curr") )
|
|
compopt -o nospace
|
|
return 0
|
|
fi
|
|
fi
|
|
|
|
if true
|
|
then
|
|
compopt -o filenames
|
|
COMPREPLY=( $(compgen -f -- "$curr") )
|
|
compopt -o nospace
|
|
return 0
|
|
fi
|
|
|
|
;;
|
|
esac
|
|
return 0
|
|
|
|
} &&
|
|
complete -F _nimgrep nimgrep
|
|
|
|
# ex: filetype=sh
|