2015-04-29 7 views
29

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ła
  • up <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 
+0

Czy funkcja uzupełniania wyświetla 'up' lub rozszerzony alias? –

+0

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

Odpowiedz

1

Nie należy używać aliasów naprawdę w takich skomplikowanych przypadkach korzystać bash functions. Aliasy są bardziej podobne do pre-procesora w C (w sensie użycia), gdy funkcje są bardziej podobne do ... funkcji kodu. Odkryłem też, że są one również bardziej "autouzupełniane".

Możesz również rzucić okiem na sposób rozwiązania tego problemu w innych powłokach, takich jak fish.