# mr completion -*- shell-script -*- _mr() { local cur prev words cword _init_completion || return local help commands options help="$(PERLDOC_PAGER=cat PERLDOC=-otext "${1}" help 2>/dev/null)" commands="$(awk '/\[options\]/ { print $3 }' <<<"${help}")" # Split [online|offline] and remove `action` placeholder. commands="${commands//@(action|[\[\|\]])/$'\n'}" # Add standard aliases. commands="${commands} ci co ls" # Determine if user has entered an `mr` command. Used to block top-level # (option and command) completions. local cmd i for (( i=0; i < ${#words[@]}-1; i++ )); do if [[ $commands == *"${words[i]}"* ]]; then cmd="${words[i]}" break fi done # Complete options for specific commands. if [[ -n $cmd ]]; then case $cmd in bootstrap) _filedir # Also complete stdin (-) as a potential bootstrap source. if [[ -z "${cur}" || $cur == - ]] && [[ $prev != - ]]; then COMPREPLY+=( - ) fi return ;; clean) if [[ "${cur}" == -* ]]; then COMPREPLY=( $( compgen -W '-f' -- "${cur}" ) ) fi return ;; commit|ci|record) if [[ "${cur}" == -* ]]; then COMPREPLY=( $( compgen -W '-m' -- "${cur}" ) ) fi return ;; run) COMPREPLY=( $( compgen -c -- "${cur}" ) ) return ;; *) # Do not complete any other command. return ;; esac fi # Complete top-level options and commands. case $prev in -c|--config) _filedir return ;; -d|--directory) _filedir -d return ;; esac if [[ $cur == -* ]]; then options="$(_parse_help - <<<"${help}")" # Remove short options (all have compatible long options). options="${options//-[a-z]$'\n'/}" # Remove deprecated options. options="${options//--path/}" COMPREPLY=( $( compgen -W "${options}" -- "${cur}" ) ) else COMPREPLY=( $( compgen -W "${commands}" -- "${cur}" ) ) fi } && complete -F _mr mr # ex: filetype=sh