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 funzionaup <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
La funzione di completamento visualizza 'su' o l'alias espanso? –
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