# Fonction de notre auto completion _cranspasswords_completion(){ # declaration des variables locales local argc first last prev cur cur_first_char opts_short opts role_dir pass_dir server server_list role_list pass_list timeout cmd_name # La commande ne s'appelle pas forcément cranspasswords cmd_name=$1 role_dir="/tmp/$cmd_name-$USER-role/" pass_dir="/tmp/$cmd_name-$USER-passwords/" # Combien de temps on garde les réponses du serveur en cache (en minutes) timeout=5 #COMPREPLY désigne la réponse à renvoyer pour la complétion actuelle COMPREPLY=() # argc : vaut le nombre d'argument actuel sur la ligne de commande argc=${COMP_CWORD}; # cur : désigne la chaine de caractère actuelle pour le dernier mot de la ligne de commande first="${COMP_WORDS[1]}" last="${COMP_WORDS[$(($argc - 1 ))]}" prev="${COMP_WORDS[$(($argc - 2 ))]}" cur="${COMP_WORDS[argc]}" cur_first_char=${cur:0:1} opts_short="-h -v -c -f -l" opts="--help --server --verbose --quiet --clipboard --noclipboard --force --edit --view --remove --list --check-keys --update-keys --list-roles --recrypt-files --roles --list-servers" mkdir -p -m 700 "$role_dir" mkdir -p -m 700 "$pass_dir" find "$role_dir" -type f -mmin +$timeout -exec rm -f {} \; find "$pass_dir" -type f -mmin +$timeout -exec rm -f {} \; # On détermine si on utilsie un serveur alternatif if [[ "${COMP_WORDS[*]}" = *" --server "* ]]; then if [[ "$prev" = "--server" ]]; then _memorize_server=$last; fi else _memorize_server="default"; fi server=$_memorize_server # les options possibles pour notre auto-complétion if [[ $cur_first_char = "-" ]]; then COMPREPLY=( $(compgen -W "$opts" -- $cur ) ) return 0 fi if [[ "$last" = "--server" ]]; then server_list="`$cmd_name --quiet --list-servers | grep -- "*" | awk '{print $2}'`" COMPREPLY=( $(compgen -W "$server_list" -- $cur ) ) return 0 fi if [[ "$last" = "--roles" ]]; then if [ ! -f "${role_dir}$server" ]; then echo "`$cmd_name --quiet --server $server --list-roles | grep -- "*" | awk '{print $2}'`" > "${role_dir}$server" fi role_list="`cat "${role_dir}$server"`" COMPREPLY=( $(compgen -W "$role_list" -- $cur ) ) return 0 fi if [[ "$last" = "--edit" ]]; then if [ ! -f "${pass_dir}${server}-w" ]; then echo "`$cmd_name --quiet --server $server -l | grep "+" | awk '{print $2}'`" > "${pass_dir}${server}-w" fi pass_list="`cat "${pass_dir}${server}-w"`" COMPREPLY=( $(compgen -W "$pass_list" -- $cur ) ) return 0 fi if true; then if [ ! -f "${pass_dir}$server" ]; then echo "`$cmd_name --quiet --server $server -l | grep "\( +\| -\)" | awk '{print $2}'`" > "${pass_dir}$server" fi pass_list="`cat "${pass_dir}$server"`" COMPREPLY=( $(compgen -W "$pass_list" -- $cur ) ) return 0 fi } # On n'active pas l'auto-completion parce qu'on ne connait pas le nom # de la commande. # Pensez à exécuter # complete -F _cranspasswords_completion <nom de votre commande> # pour avoir la complétion