Używam go
jako prostego aliasu basha dla git checkout branchname
. To, czego mi brakuje, to funkcja autouzupełniania, która działa z pełnym git checkout branchna...
poleceniem, ale nie w aliasie.
Czy istnieje sposób, aby poinstruować Bash, aby „odziedziczył” „sterownik” autouzupełniania dla innego polecenia?
git-dir
użyj tego .Odpowiedzi:
Jeśli możesz znaleźć funkcję uzupełniania używaną przez oryginalne polecenie, możesz przypisać ją do aliasu za pomocą
complete -F
.Na przykład w moim polu ubuntu funkcja uzupełniania używana przez
git checkout
to_git_checkout
(znajduje się w/etc/bash_complete.d/git
).Przykład
Przed bieganiem
complete -F
:[me@home]$ git checkout <TAB><TAB> HEAD master origin/HEAD origin/master [me@home]$ alias go="git checkout" [me@home]$$ go <TAB><TAB> .git/ precommit_config.py README.md SvnSentinel/ .gitignore precommit.py startcommit.py tests/
Po:
źródło
complete -F
to nie zadziała, zobacz odpowiedź na temat__git_complete
poniżej stackoverflow.com/a/24665529/3779Po użyciu
complete -F
:Tabowanie po
go
może spowodować:Zamiast
complete
używać__git_complete
Jest to wbudowana funkcja uzupełniania git bash służąca do tego celu.
Po zadeklarowaniu aliasu, przypisz do niego poprawną funkcję autouzupełniania:
alias g="git" __git_complete g _git alias go="git checkout" __git_complete go _git_checkout alias gp="git push" __git_complete gp _git_push
źródło
__git_complete
funkcję w moim pakiecie uzupełniającym bash (zainstalowanym przez homebrew zbrew install bash-completion
), która nie była obecnie pobierana w moim profilu bash. Musiałem dodać tę linię do ~ / .bash_profile:[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
git checkout
aliasem działało jak urok !!!__git_main
, nie_git
. Powodem_git
jest tylko kompatybilność wsteczna, jest w zasadzie__git_main
opakowany.Na Ubuntu 18.04 (Bionic) działa następująco. Dodaj coś takiego fragmentu (z aliasów) do preferowanej konfiguracji bash pliku np
.bashrc
,.bash_aliases
.bash_profile
.# define aliases alias gc='git checkout' alias gp='git pull' # setup autocompletion if [ -f "/usr/share/bash-completion/completions/git" ]; then source /usr/share/bash-completion/completions/git __git_complete gc _git_checkout __git_complete gp _git_pull else echo "Error loading git completions" fi
Ogólnie format
__git_complete
dyrektywy jest następujący:To łączy mądrość z istniejących odpowiedzi w jednej aktualnej odpowiedzi, dziękuję wszystkim.
źródło
echo "profile"
/,echo "rc"
że to wymyśliłem.W Ubuntu 16.04.3 LTS potrzebowałem pliku źródłowego
/usr/share/bash-completion/completions/git
. Więc w.bash_custom
(lub .bashrc, cokolwiek):źródło
.bashrc
odczytu.Aby dodać do innych doskonałych odpowiedzi: zwykle masz wiele aliasów Git i ręczne uzupełnianie ich wszystkich może być żmudne. Oto mała sztuczka, aby zrobić to automatycznie:
if [ -f "/usr/share/bash-completion/completions/git" ]; then # Enable Git completions for aliases . /usr/share/bash-completion/completions/git for a in $(alias | sed -n 's/^alias \(g[^=]*\)=.git .*/\1/p'); do c=$(alias $a | sed 's/^[^=]*=.git \([a-z0-9\-]\+\).*/\1/' | tr '-' '_') if set | grep -q "^_git_$c *()"; then eval "__git_complete $a _git_$c" fi done fi
źródło
W Linux Mint to nie zadziałało. Dostawałem
bash: [: 1: unary operator expected
.Zauważyłem, że następująca odpowiedź działa całkiem nieźle - sekcja rozwiązywania problemów dostarczona przez użytkownika była całkiem pomocna. /superuser/436314/how-can-i-get-bash-to-perform-tab-completion-for-my-aliases
źródło
W przypadku
macOS
uruchom następujące polecenie, aby zainstalować uzupełnianie bashNastępnie dodaj następujące elementy
[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"
do twojego .bashrc lub .bash_profile
źródło
W Ubuntu 20.04 dodaję to do
~/.bashrc
source /usr/share/bash-completion/completions/git alias g='git' __git_complete g _git alias go='git checkout' __git_complete go _git_checkout
źródło
Jak ktoś inny odpowiedział, powinieneś użyć
__git_complete
, w przeciwnym razie skrypt zawiedzie.alias g="git" __git_complete g __git_main alias g="gl" __git_complete gl _git_log
Ale nie powinieneś używać
_git
głównego polecenia, to jest__git_main
.Niestety wiele informacji o zakończeniu jest ukrytych, ale więcej można znaleźć w pliku README mojego forka: git-complete .
źródło
Zdaję sobie sprawę, że pytasz konkretnie o aliasy bash, ale dla tych, którzy przyjeżdżają tutaj i szukają autouzupełniania w bashu dla złożonych aliasów git, zobacz tutaj .
W szczególności:
# If you use complex aliases of form '!f() { ... }; f', you can use the null # command ':' as the first command in the function body to declare the desired # completion style. For example '!f() { : git commit ; ... }; f' will # tell the completion to use commit completion. This also works with aliases # of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '".
źródło