@ -1,4 +1,4 @@
// Copyright 2013-2022 The Cobra Authors
// Copyright 2013-2023 The Cobra Authors
//
// Licensed under the Apache License, Version 2.0 ( the "License" ) ;
// you may not use this file except in compliance with the License.
@ -38,7 +38,7 @@ func genBashComp(buf io.StringWriter, name string, includeDesc bool) {
__%[ 1] s_debug( )
{
if [ [ -n ${ BASH_COMP_DEBUG_FILE : -} ] ] ; then
if [ [ -n ${ BASH_COMP_DEBUG_FILE -} ] ] ; then
echo " $* " >> " ${ BASH_COMP_DEBUG_FILE } "
fi
}
@ -65,7 +65,7 @@ __%[1]s_get_completion_results() {
lastChar = ${ lastParam : $(( ${# lastParam } - 1 )) : 1 }
__%[ 1] s_debug " lastParam ${ lastParam } , lastChar ${ lastChar } "
if [ -z " ${ cur } " ] && [ " ${ lastChar } " != "=" ] ; then
if [ [ -z ${ cur } && ${ lastChar } != = ] ] ; then
# If the last parameter is complete (there is a space following it)
# We add an extra empty parameter so we can indicate this to the go method.
__%[ 1] s_debug "Adding extra empty parameter"
@ -75,7 +75,7 @@ __%[1]s_get_completion_results() {
# When completing a flag with an = (e.g., %[1]s -n=<TAB>)
# bash focuses on the part after the =, so we need to remove
# the flag part from $cur
if [ [ " ${ cur } " = = -*= * ] ] ; then
if [ [ ${ cur } = = -*= * ] ] ; then
cur = " ${ cur #*= } "
fi
@ -87,7 +87,7 @@ __%[1]s_get_completion_results() {
directive = ${ out ##* : }
# Remove the directive
out = ${ out %% : * }
if [ " ${ directive } " = " ${ out } " ] ; then
if [ [ ${ directive } = = " ${ out } " ] ] ; then
# There is not directive specified
directive = 0
fi
@ -101,22 +101,36 @@ __%[1]s_process_completion_results() {
local shellCompDirectiveNoFileComp = %[ 5] d
local shellCompDirectiveFilterFileExt = %[ 6] d
local shellCompDirectiveFilterDirs = %[ 7] d
local shellCompDirectiveKeepOrder = %[ 8] d
if [ $(( directive & shellCompDirectiveError)) -ne 0 ] ; then
if (( ( directive & shellCompDirectiveError) != 0) ) ; then
# Error code. No completion.
__%[ 1] s_debug "Received error from custom completion go code"
return
else
if [ $(( directive & shellCompDirectiveNoSpace)) -ne 0 ] ; then
if [ [ $( type -t compopt) = "builtin" ] ] ; then
if (( ( directive & shellCompDirectiveNoSpace) != 0) ) ; then
if [ [ $( type -t compopt) = = builtin ] ] ; then
__%[ 1] s_debug "Activating no space"
compopt -o nospace
else
__%[ 1] s_debug "No space directive not supported in this version of bash"
fi
fi
if [ $(( directive & shellCompDirectiveNoFileComp)) -ne 0 ] ; then
if [ [ $( type -t compopt) = "builtin" ] ] ; then
if ( ( ( directive & shellCompDirectiveKeepOrder) != 0) ) ; then
if [ [ $( type -t compopt) = = builtin ] ] ; then
# no sort isn't supported for bash less than < 4.4
if [ [ ${ BASH_VERSINFO [0] } -lt 4 || ( ${ BASH_VERSINFO [0] } -eq 4 && ${ BASH_VERSINFO [1] } -lt 4 ) ] ] ; then
__%[ 1] s_debug "No sort directive not supported in this version of bash"
else
__%[ 1] s_debug "Activating keep order"
compopt -o nosort
fi
else
__%[ 1] s_debug "No sort directive not supported in this version of bash"
fi
fi
if ( ( ( directive & shellCompDirectiveNoFileComp) != 0) ) ; then
if [ [ $( type -t compopt) = = builtin ] ] ; then
__%[ 1] s_debug "Activating no file completion"
compopt +o default
else
@ -130,7 +144,7 @@ __%[1]s_process_completion_results() {
local activeHelp = ( )
__%[ 1] s_extract_activeHelp
if [ $(( directive & shellCompDirectiveFilterFileExt)) -ne 0 ] ; then
if (( ( directive & shellCompDirectiveFilterFileExt) != 0) ) ; then
# File extension filtering
local fullFilter filter filteringCmd
@ -143,13 +157,12 @@ __%[1]s_process_completion_results() {
filteringCmd = " _filedir $fullFilter "
__%[ 1] s_debug " File filtering command: $filteringCmd "
$filteringCmd
elif [ $(( directive & shellCompDirectiveFilterDirs)) -ne 0 ] ; then
elif (( ( directive & shellCompDirectiveFilterDirs) != 0) ) ; then
# File completion for directories only
# Use printf to strip any trailing newline
local subdir
subdir = $( printf "%%s" " ${ completions [0] } " )
if [ -n " $subdir " ] ; then
subdir = ${ completions [0] }
if [ [ -n $subdir ] ] ; then
__%[ 1] s_debug " Listing directories in $subdir "
pushd " $subdir " >/dev/null 2>& 1 && _filedir -d && popd >/dev/null 2>& 1 || return
else
@ -164,7 +177,7 @@ __%[1]s_process_completion_results() {
__%[ 1] s_handle_special_char " $cur " =
# Print the activeHelp statements before we finish
if [ ${# activeHelp [*] } -ne 0 ] ; then
if (( ${# activeHelp [*] } != 0) ) ; then
printf "\n" ;
printf "%%s\n" " ${ activeHelp [@] } "
printf "\n"
@ -184,21 +197,21 @@ __%[1]s_process_completion_results() {
# Separate activeHelp lines from real completions.
# Fills the $activeHelp and $completions arrays.
__%[ 1] s_extract_activeHelp( ) {
local activeHelpMarker = "%[ 8 ]s"
local activeHelpMarker = "%[ 9 ]s"
local endIndex = ${# activeHelpMarker }
while IFS = '' read -r comp; do
if [ " ${ comp : 0 : endIndex } " = " $activeHelpMarker " ] ; then
if [ [ ${ comp : 0 : endIndex } = = $activeHelpMarker ] ] ; then
comp = ${ comp : endIndex }
__%[ 1] s_debug " ActiveHelp found: $comp "
if [ -n " $comp " ] ; then
if [ [ -n $comp ] ] ; then
activeHelp += ( " $comp " )
fi
else
# Not an activeHelp line but a normal completion
completions += ( " $comp " )
fi
done < <( printf "%%s\n" " ${ out } " )
done <<< " ${ out } "
}
__%[ 1] s_handle_completion_types( ) {
@ -254,7 +267,7 @@ __%[1]s_handle_standard_completion_case() {
done < <( printf "%%s\n" " ${ completions [@] } " )
# If there is a single completion left, remove the description text
if [ ${# COMPREPLY [*] } -eq 1 ] ; then
if (( ${# COMPREPLY [*] } = = 1) ) ; then
__%[ 1] s_debug " COMPREPLY[0]: ${ COMPREPLY [0] } "
comp = " ${ COMPREPLY [0]%%%% $tab * } "
__%[ 1] s_debug " Removed description from single completion, which is now: ${ comp } "
@ -271,8 +284,8 @@ __%[1]s_handle_special_char()
if [ [ " $comp " = = *${ char } * && " $COMP_WORDBREAKS " = = *${ char } * ] ] ; then
local word = ${ comp %% " ${ comp ##* ${ char } } " }
local idx = ${# COMPREPLY [*] }
while [[ $(( - - idx)) -ge 0 ] ] ; do
COMPREPLY[ $ idx] = ${ COMPREPLY [ $ idx ]#" $word " }
while (( --idx >= 0) ) ; do
COMPREPLY[ idx] = ${ COMPREPLY [ idx]#" $word " }
done
fi
}
@ -298,7 +311,7 @@ __%[1]s_format_comp_descriptions()
# Make sure we can fit a description of at least 8 characters
# if we are to align the descriptions.
if [[ $maxdesclength -gt 8 ] ] ; then
if (( maxdesclength > 8) ) ; then
# Add the proper number of spaces to align the descriptions
for ( ( i = ${# comp } ; i < longest ; i++) ) ; do
comp += " "
@ -310,8 +323,8 @@ __%[1]s_format_comp_descriptions()
# If there is enough space for any description text,
# truncate the descriptions that are too long for the shell width
if [ $maxdesclength -gt 0 ] ; then
if [ ${# desc } -gt $maxdesclength ] ; then
if (( maxdesclength > 0) ) ; then
if (( ${# desc } > maxdesclength) ) ; then
desc = ${ desc : 0 : $(( maxdesclength - 1 )) }
desc += "…"
fi
@ -332,9 +345,9 @@ __start_%[1]s()
# Call _init_completion from the bash-completion package
# to prepare the arguments properly
if declare -F _init_completion >/dev/null 2>& 1; then
_init_completion -n "=:" || return
_init_completion -n = : || return
else
__%[ 1] s_init_completion -n "=:" || return
__%[ 1] s_init_completion -n = : || return
fi
__%[ 1] s_debug
@ -361,7 +374,7 @@ fi
# ex: ts=4 sw=4 et filetype=sh
` , name, compCmd,
ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp,
ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs,
ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, ShellCompDirectiveKeepOrder,
activeHelpMarker) )
}