-
Notifications
You must be signed in to change notification settings - Fork 427
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
#121 better naming in basicExample test, added test for nested subcom…
…mands
- Loading branch information
Showing
3 changed files
with
241 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,184 @@ | ||
#!bash | ||
# | ||
# hierarchy Bash Completion | ||
# ======================= | ||
# | ||
# Bash completion support for hierarchy, | ||
# generated by [picocli](http://picocli.info/). | ||
# | ||
# Installation | ||
# ------------ | ||
# | ||
# 1. Place this file in a `bash-completion.d` folder: | ||
# | ||
# * /etc/bash-completion.d | ||
# * /usr/local/etc/bash-completion.d | ||
# * ~/bash-completion.d | ||
# | ||
# 2. Open a new bash console, and type `hierarchy [TAB][TAB]` | ||
# | ||
# Documentation | ||
# ------------- | ||
# The script is called by bash whenever [TAB] or [TAB][TAB] is pressed after | ||
# 'hierarchy (..)'. By reading entered command line parameters, it determines possible | ||
# bash completions and writes them to the COMPREPLY variable. Bash then | ||
# completes the user input if only one entry is listed in the variable or | ||
# shows the options if more than one is listed in COMPREPLY. | ||
# | ||
# References | ||
# ---------- | ||
# [1] http://stackoverflow.com/a/12495480/1440785 | ||
# [2] http://tiswww.case.edu/php/chet/bash/FAQ | ||
# [3] https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html | ||
# [4] https://stackoverflow.com/questions/17042057/bash-check-element-in-array-for-elements-in-another-array/17042655#17042655 | ||
# | ||
|
||
# Enable programmable completion facilities (see [3]) | ||
shopt -s progcomp | ||
|
||
# ArrContains takes two arguments, both of which are the name of arrays. | ||
# It creates a temporary hash from lArr1 and then checks if all elements of lArr2 | ||
# are in the hashtable. | ||
# | ||
# Returns zero (no error) if all elements of the 2nd array are in the 1st array, | ||
# otherwise returns 1 (error). | ||
# | ||
# Modified from [4] | ||
function ArrContains() { | ||
local lArr1 lArr2 | ||
declare -A tmp | ||
eval lArr1=("\"\${$1[@]}\"") | ||
eval lArr2=("\"\${$2[@]}\"") | ||
for i in "${lArr1[@]}";{ [ -n "$i" ] && ((++tmp['$i']));} | ||
for i in "${lArr2[@]}";{ [ -z "${tmp[$i]}" ] && return 1;} | ||
return 0 | ||
} | ||
|
||
# Bash completion entry point function. | ||
# _complete_hierarchy finds which commands and subcommands have been specified | ||
# on the command line and delegates to the appropriate function | ||
# to generate possible options and subcommands for the last specified subcommand. | ||
function _complete_hierarchy() { | ||
CMDS0=(hierarchy) | ||
CMDS1=(hierarchy sub1) | ||
CMDS2=(hierarchy sub2) | ||
CMDS3=(hierarchy sub2 subsub1) | ||
CMDS4=(hierarchy sub2 subsub2) | ||
|
||
ArrContains COMP_WORDS CMDS4 && { _picocli_hierarchy_sub2_subsub2; return $?; } | ||
ArrContains COMP_WORDS CMDS3 && { _picocli_hierarchy_sub2_subsub1; return $?; } | ||
ArrContains COMP_WORDS CMDS2 && { _picocli_hierarchy_sub2; return $?; } | ||
ArrContains COMP_WORDS CMDS1 && { _picocli_hierarchy_sub1; return $?; } | ||
ArrContains COMP_WORDS CMDS0 && { _picocli_hierarchy; return $?; } | ||
echo "not found" | ||
_picocli_hierarchy; return $?; | ||
} | ||
|
||
function _picocli_hierarchy() { | ||
# Get completion data | ||
CURR_WORD=${COMP_WORDS[COMP_CWORD]} | ||
PREV_WORD=${COMP_WORDS[COMP_CWORD-1]} | ||
|
||
COMMANDS="sub1 sub2" | ||
FLAG_OPTS="-V --version -h --help" | ||
ARG_OPTS="" | ||
|
||
COMPREPLY=( $(compgen -W "${FLAG_OPTS} ${ARG_OPTS} ${COMMANDS}" -- ${CURR_WORD}) ) | ||
} | ||
|
||
function _picocli_hierarchy_sub1() { | ||
# Get completion data | ||
CURR_WORD=${COMP_WORDS[COMP_CWORD]} | ||
PREV_WORD=${COMP_WORDS[COMP_CWORD-1]} | ||
|
||
COMMANDS="" | ||
FLAG_OPTS="" | ||
ARG_OPTS="--num --str" | ||
|
||
COMPREPLY=( $(compgen -W "${FLAG_OPTS} ${ARG_OPTS} ${COMMANDS}" -- ${CURR_WORD}) ) | ||
} | ||
|
||
function _picocli_hierarchy_sub2() { | ||
# Get completion data | ||
CURR_WORD=${COMP_WORDS[COMP_CWORD]} | ||
PREV_WORD=${COMP_WORDS[COMP_CWORD-1]} | ||
|
||
COMMANDS="subsub1 subsub2" | ||
FLAG_OPTS="" | ||
ARG_OPTS="--num2 --directory -d" | ||
|
||
case ${CURR_WORD} in | ||
--directory|-d) | ||
compopt -o filenames | ||
COMPREPLY=( $( compgen -f -- "" ) ) # files | ||
return $? | ||
;; | ||
*) | ||
case ${PREV_WORD} in | ||
--directory|-d) | ||
compopt -o filenames | ||
COMPREPLY=( $( compgen -f -- $CURR_WORD ) ) # files | ||
return $? | ||
;; | ||
esac | ||
esac | ||
|
||
COMPREPLY=( $(compgen -W "${FLAG_OPTS} ${ARG_OPTS} ${COMMANDS}" -- ${CURR_WORD}) ) | ||
} | ||
|
||
function _picocli_hierarchy_sub2_subsub1() { | ||
# Get completion data | ||
CURR_WORD=${COMP_WORDS[COMP_CWORD]} | ||
PREV_WORD=${COMP_WORDS[COMP_CWORD-1]} | ||
|
||
COMMANDS="" | ||
FLAG_OPTS="" | ||
ARG_OPTS="-h --host" | ||
|
||
case ${CURR_WORD} in | ||
-h|--host) | ||
compopt -o filenames | ||
COMPREPLY=( $( compgen -A hostname -- "" ) ) | ||
return $? | ||
;; | ||
*) | ||
case ${PREV_WORD} in | ||
-h|--host) | ||
compopt -o filenames | ||
COMPREPLY=( $( compgen -A hostname -- $CURR_WORD ) ) | ||
return $? | ||
;; | ||
esac | ||
esac | ||
|
||
COMPREPLY=( $(compgen -W "${FLAG_OPTS} ${ARG_OPTS} ${COMMANDS}" -- ${CURR_WORD}) ) | ||
} | ||
|
||
function _picocli_hierarchy_sub2_subsub2() { | ||
# Get completion data | ||
CURR_WORD=${COMP_WORDS[COMP_CWORD]} | ||
PREV_WORD=${COMP_WORDS[COMP_CWORD-1]} | ||
|
||
COMMANDS="" | ||
FLAG_OPTS="" | ||
ARG_OPTS="-u --timeUnit -t --timeout" | ||
timeUnit_OPTION_ARGS="NANOSECONDS MICROSECONDS MILLISECONDS SECONDS MINUTES HOURS DAYS" # TimeUnit values | ||
|
||
case ${CURR_WORD} in | ||
-u|--timeUnit) | ||
COMPREPLY=( $( compgen -W "${timeUnit_OPTION_ARGS}" -- "" ) ) | ||
return $? | ||
;; | ||
*) | ||
case ${PREV_WORD} in | ||
-u|--timeUnit) | ||
COMPREPLY=( $( compgen -W "${timeUnit_OPTION_ARGS}" -- $CURR_WORD ) ) | ||
return $? | ||
;; | ||
esac | ||
esac | ||
|
||
COMPREPLY=( $(compgen -W "${FLAG_OPTS} ${ARG_OPTS} ${COMMANDS}" -- ${CURR_WORD}) ) | ||
} | ||
|
||
complete -F _complete_hierarchy hierarchy |