Say atakujących jest skonfigurowany z następującym aliasuatakujących: Cześć repozytorium specyficzne GIT aliasu zakończeniu ps
alias up="git --git-dir /path/to/backup/.git"
I szczególności magazyn - a jedynie, że magazyn - ma następujący git aliasu
[alias]
backup = commit --allow-empty-message
Jak można up
autouzupełniania backup
?
to automatycznie uzupełnia backup
ale nie up
:
cd /a/different/dir
git --git-dir=/path/to/backup/.git ba
to automatycznie uzupełnia up
ze standardowych poleceń git ale nie backup
:
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main up
Edit: Etan jest odpowiednia funkcja zakończenie musi zobaczyć rozszerzone alias, więc stworzyłem następujące:
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"
ale nie niewytłumaczalne problemy:
up bac<Tab>
nie działaup <Tab>
używa domyślnego zakończenie i nie wymienia podpolecenia git- i wiele więcej ...
Edycja 2: Zaktualizowano skrypt rozwiązać wyżej wymienione problemy, korzystając z sugestii na Re: Bash completion of aliased commands. Najwyraźniej jest to dość powszechne zadanie. Jednak teraz biegnę do tego komunikatu o błędzie:
$ cd /a/different/dir
$ up backup<Tab> fatal: Not a git repository (or any of the parent directories): .git
Czy funkcja uzupełniania wyświetla 'up' lub rozszerzony alias? –
jeśli funkcja zakończenia czyta w komendzie jako "w górę", nie będzie zachowywać się zgodnie z oczekiwaniami, użyj funkcji pomocniczej, aby rozwinąć do "kopii zapasowej", aby mieć pewność, że dokładne polecenie jest wysyłane do funkcji uzupełniania. Tak właśnie jest z wieloma pełnymi funkcjami, oczekują (lub zakładają), że polecenie jest tym, do czego je zaprogramowali. Dlatego jeśli pójdziesz i załączysz do innego polecenia, to nie zadziała (stąd funkcja pośrednika). Aby zacząć, możesz pokazać niektóre wyjście z -xv z wywołania dwóch, aby upewnić się, że twoja funkcja spełnia twoje oczekiwania (lub różnice) – osirisgothra