bash_completion 3.06 KB
Newer Older
1 2
# Fonction de notre auto completion

3
_cranspasswords_completion(){
4
  # declaration des variables locales
5 6 7 8 9 10
  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/"
11 12
  # Combien de temps on garde les réponses du serveur en cache (en minutes)
  timeout=5
13
  
14 15 16 17
  #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};
18
  
19 20 21 22 23 24 25
  # 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"
26
  opts="--help --server --verbose --quiet --clipboard --noclipboard --force --drop-invalid --edit --view --remove --list --check-keys --update-keys --list-roles --recrypt-files --roles --list-servers"
27 28 29 30 31
  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 {} \;
32
  
33
  # On détermine si on utilsie un serveur alternatif
34
  if [[ "${COMP_WORDS[*]}" = *" --server "* ]]; then
35
    if [[ "$prev" = "--server" ]]; then
36
      _memorize_server=$last;
37 38
    fi
  else
39
    _memorize_server="default";
40
  fi
41 42 43
  
  server=$_memorize_server
  
44 45 46 47 48 49 50
  # 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
51
    server_list="`$cmd_name --quiet --list-servers | grep -- "*" | awk '{print $2}'`"
52 53 54 55 56 57
    COMPREPLY=( $(compgen -W "$server_list" -- $cur ) )
    return 0
  fi
  
  if [[ "$last" = "--roles" ]]; then 
    if  [ ! -f "${role_dir}$server" ]; then
58
      echo "`$cmd_name --quiet --server $server --list-roles | grep -- "*" | awk '{print $2}'`" > "${role_dir}$server"
59 60 61 62 63 64
    fi
    role_list="`cat "${role_dir}$server"`"
    COMPREPLY=( $(compgen -W "$role_list" -- $cur ) )
    return 0
  fi
  
65
  if [[ "$last" = "--edit" ]]; then
66
    if  [ ! -f "${pass_dir}${server}-w" ]; then
67
      echo "`$cmd_name --quiet --server $server -l | grep "+" | awk '{print $2}'`" > "${pass_dir}${server}-w"
68 69 70 71 72
    fi
    pass_list="`cat "${pass_dir}${server}-w"`"
    COMPREPLY=( $(compgen -W "$pass_list" -- $cur ) )
    return 0
  fi
73
  
74 75
  if true; then
    if  [ ! -f "${pass_dir}$server" ]; then
76
      echo "`$cmd_name --quiet --server $server -l | grep "\( +\| -\)" | awk '{print $2}'`" > "${pass_dir}$server"
77 78 79 80 81 82 83
    fi
    pass_list="`cat "${pass_dir}$server"`"
    COMPREPLY=( $(compgen -W "$pass_list" -- $cur ) )
    return 0
  fi
}

84 85 86 87 88
# 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