2015-04-29 19 views
29

Say bash è configurato con i seguenti alias:Bash: Honor specifici repository Git alias nel completamento alias

alias up="git --git-dir /path/to/backup/.git"

E quel particolare repository - e solo quel repository - ha il seguente alias git:

[alias] 
backup = commit --allow-empty-message 

Come può up completare automaticamente backup?


Questa auto-completa backup ma non up:

cd /a/different/dir 
git --git-dir=/path/to/backup/.git ba 

Questa auto-completa up con comandi standard git ma non backup:

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main up


Edit: Etan è giusto, la funzione di completamento ha bisogno di vedere l'alias espanse, così ho creato i seguenti:

CompletableAlias() { 
    if (($#<2)); then 
     return 1 
    fi 
    source_c="$1" 
    target_c="$2" 
    target_a=("${@:2}") 
    target_s="${target_a[*]}" 
    alias "${source_c}=${target_s}" 
    completion_modifier="__${source_c}_completion" 
    completion_original="$(complete -p "$target_c" 2>/dev/null | 
          sed 's/.*-F\W\+\(\w\+\).*/\1/' 
         )" 
    if [[ -n "$completion_original" ]]; then 
     read -r -d '' completion_function <<-EOF 
     function $completion_modifier() { 
      COMP_LINE="\${COMP_LINE/#${source_c}/${target_s}}" 
      ((COMP_POINT+=${#target_s}-${#source_c})) 
      ((COMP_CWORD+=${#target_a[@]}-1)) 
      COMP_WORDS=(${target_a[@]} \${COMP_WORDS[@]:1}) 
      $completion_original 
     } 
EOF 
     eval "$completion_function" 
     completion_command="$(complete -p "$target_c" | 
           sed "s/${completion_original}/${completion_modifier}/; 
            s/\w\+\$/${source_c}/" 
          )" 
     $completion_command 
    fi 
} 


source "/usr/share/bash-completion/completions/git" 

CompletableAlias "up" "git" "--git-dir" "/path/to/backup/.git" 

ma ci problemi inspiegabili:

  • up bac<Tab> non funziona
  • up <Tab> utilizza il completamento di default e non elenca subcommands git
  • e molti altri ...

Edit 2: Aggiornato lo script per risolvere i problemi di cui sopra utilizzando i suggerimenti a Re: Bash completion of aliased commands. Apparentemente questo è un compito piuttosto comune. Comunque ora sto correndo in questo messaggio di errore:

$ cd /a/different/dir 
$ up backup<Tab> fatal: Not a git repository (or any of the parent directories): .git 
+0

La funzione di completamento visualizza 'su' o l'alias espanso? –

+0

se la funzione di completamento legge nel comando come 'su' non si comporta come previsto, utilizzare una funzione secondaria per espandere a 'backup' in modo da poter essere sicuri che il comando esatto venga inviato alla funzione di completamento. Questo è il modo in cui funziona con molte funzioni di completamento, si aspettano (o presumono) che il comando sia quello che * loro * hanno programmato. Pertanto, se vai a collegare un completatore ad un altro comando, non funzionerà (da qui la funzione uomo medio). Per iniziare potresti mostrare un output di -xv dal chiamare i due, per assicurarti che la tua funzione stia facendo quello che ti aspetti (o il diff di esso) – osirisgothra

risposta

1

non si dovrebbe davvero usare gli alias in questi casi complicati, utilizzare bash functions. Gli alias sono più come pre-processore in C (nel senso di usare), quando le funzioni sono più simili a ... funzioni di codice. E ho scoperto che sono anche più "auto-completabili".

Puoi anche dare un'occhiata a come questo problema viene risolto in altre shell, come fish.