Wie bringe ich die Bash-Vervollständigung dazu, mit Aliasen zu arbeiten?
Lesezeit: 8 Minuten
kch
Fallbeispiel:
Ich bin ein Mac mit Bash v3.2.17, ich verwende Git, das über Macports mit der Variante bash_completion installiert wurde.
Wenn ich tippe git checkout m<tab>. zum Beispiel bekomme ich es fertig master.
Allerdings habe ich einen Pseudonym für git checkout, gco. Wenn ich tippe gco m<tab>bekomme ich den Branch-Namen nicht automatisch vervollständigt.
Im Idealfall möchte ich, dass die automatische Vervollständigung auf magische Weise für alle meine Aliase funktioniert. Ist es möglich? Andernfalls möchte ich es für jeden Alias manuell anpassen. Also, wie gehe ich entweder vor?
complete -o default -o nospace -F funktioniert heutzutage nicht mehr
– acht Augen
22. März 2013 um 19:20 Uhr
Fragen mit mehr Upvotes als die Top-Antwort implizieren oft großartig Funktionsanfragen
– Ciro Santilli 新疆再教育营六四事件法轮功郝海东
20. Januar 2014 um 9:16 Uhr
Eine weitere Antwort von Superuser, als mich jemand darauf hinwies, dass meine Frage dort ein Betrüger von dieser war. superuser.com/questions/436314/…
wird nicht mehr funktionieren. Allerdings gibt es eine __git_complete Funktion in git-completion.bash, die verwendet werden kann, um die Vervollständigung für Aliase wie folgt einzurichten:
__git_complete gco _git_checkout
Wenn Sie den globalen Alias „g“ für Git verwenden, könnten Sie auch hinzufügen __git_complete g __git_main damit die Codevervollständigung bei allen Git-Befehlen funktioniert.
– Ondrej Machulda
15. April 2013 um 12:03 Uhr
^^ Für Git/Shell/Bash-Neulinge. Der obige Kommentar bezieht sich auf einen globalen Shell-Alias, nicht auf einen nativen Git-Alias.
– Elijah Lynn
30. Juli 2013 um 13:33 Uhr
Wo soll ich das hinstellen?
– benregn
14. November 2013 um 15:26 Uhr
Endlich herausgefunden, wie man das richtig macht! Schritt 1) Kopieren git-completion.bash von <your git install folder>/etc/bash-completion.d/ zu ~/.git-completion.bash Schritt 2) hinzufügen source ~/.git-completion.bash zu deinem .bash_profile Schritt 3) Hinzufügen __git_complete gco _git_checkout irgendwo nach der obigen Zeile in Ihrem .bash_profile. Schritt 4) Starten Sie die Shell neu und genießen Sie die automatische Vervollständigung Ihres Alias! 🙂
– kpsfoo
5. April 2014 um 21:14 Uhr
@benregn Ich habe es direkt unter dem platziert source ~/.git_completion.sh in meinem ~/.bash_profile
– Kleider
20. Juni 2014 um 13:44 Uhr
Hesky Fischer
Ich bin auch auf dieses Problem gestoßen und habe mir diesen Codeausschnitt ausgedacht. Dadurch erhalten Sie automatisch die Vervollständigung für alle Aliase. Führen Sie es aus, nachdem Sie alle (oder beliebige) Aliase deklariert haben.
# wrap_alias takes three arguments:
# $1: The name of the alias
# $2: The command used in the alias
# $3: The arguments in the alias all in one string
# Generate a wrapper completion function (completer) for an alias
# based on the command and the given arguments, if there is a
# completer for the command, and set the wrapper as the completer for
# the alias.
function wrap_alias() {
[[ "$#" == 3 ]] || return 1
local alias_name="$1"
local aliased_command="$2"
local alias_arguments="$3"
local num_alias_arguments=$(echo "$alias_arguments" | wc -w)
# The completion currently being used for the aliased command.
local completion=$(complete -p $aliased_command 2> /dev/null)
# Only a completer based on a function can be wrapped so look for -F
# in the current completion. This check will also catch commands
# with no completer for which $completion will be empty.
echo $completion | grep -q -- -F || return 0
local namespace=alias_completion::
# Extract the name of the completion function from a string that
# looks like: something -F function_name something
# First strip the beginning of the string up to the function name by
# removing "* -F " from the front.
local completion_function=${completion##* -F }
# Then strip " *" from the end, leaving only the function name.
completion_function=${completion_function%% *}
# Try to prevent an infinite loop by not wrapping a function
# generated by this function. This can happen when the user runs
# this twice for an alias like ls="ls --color=auto" or alias l="ls"
# and alias ls="l foo"
[[ "${completion_function#$namespace}" != $completion_function ]] && return 0
local wrapper_name="${namespace}${alias_name}"
eval "
function ${wrapper_name}() {
let COMP_CWORD+=$num_alias_arguments
args=( \"${alias_arguments}\" )
COMP_WORDS=( $aliased_command \${args[@]} \${COMP_WORDS[@]:1} )
$completion_function
}
"
# To create the new completion we use the old one with two
# replacements:
# 1) Replace the function with the wrapper.
local new_completion=${completion/-F * /-F $wrapper_name }
# 2) Replace the command being completed with the alias.
new_completion="${new_completion% *} $alias_name"
eval "$new_completion"
}
# For each defined alias, extract the necessary elements and use them
# to call wrap_alias.
eval "$(alias -p | sed -e 's/alias \([^=][^=]*\)='\''\([^ ][^ ]*\) *\(.*\)'\''/wrap_alias \1 \2 '\''\3'\'"https://stackoverflow.com/")"
unset wrap_alias
die Linie let COMP_CWORD+=$num_alias_arguments funktionierte aus irgendeinem Grund nicht unter Mac OS X. Ersetzen Sie es durch ((COMP_CWORD+=$num_alias_arguments)) hat es aber behoben
– Mario F
5. Januar 2011 um 20:17 Uhr
Wow, das ist toll – danke! wrap_alias verschluckt sich in doppelten Anführungszeichen in der Alias-Definition, und ich denke, es macht nicht viel Sinn für Aliase mit mehreren Befehlen (alias 'foo=bar; baz'), also setze ich ein Extra | grep -v '[";|&]' nach dem alias -p. Außerdem wird es bei Hunderten von Alias-Definitionen etwas langsam, aber ich bestätige das gerne mit echo anstatt eval und Weiterleitung der Ausgabe in eine Cache-Datei (die dann eval‘ed in einem Rutsch) funktioniert gut und ist superschnell.
– Jo Liss
13. Januar 2011 um 20:07 Uhr
Noch ein Hinweis: wrap_alias erfordert, dass die Fertigstellungen eingerichtet werden, also musste ich umziehen source /etc/bash_completion vor dem wrap_alias Code.
– Jo Liss
13. Januar 2011 um 20:30 Uhr
Dies funktionierte für mich unter OS X 10.7.2, nachdem ich die Zeile geändert hatte let COMP_CWORD+=$num_alias_arguments zu let \"COMP_CWORD+=$num_alias_arguments\".
– irh
31. Oktober 2011 um 12:29 Uhr
Siehe die aktualisierte Version dieses Skripts unter superuser.com/a/437508/102281 (Zum Beispiel habe ich Unterstützung für COMP_LINE und COMP_POINT hinzugefügt, die für einige Git-Vervollständigungen erforderlich sind).
– John Mellor
4. November 2014 um 17:24 Uhr
Chris Lloyd
Im git-completion.bash da ist eine zeile:
complete -o default -o nospace -F _git git
Wenn Sie sich diese Zeile (und die _git-Funktion) ansehen, können Sie diese Zeile zu Ihrer hinzufügen .bash_profile:
manche der git* Bash-Funktionen funktionieren mit dieser Methode nicht mehr
– cmcginty
23. September 2011 um 1:37 Uhr
Ja, das hat früher großartig funktioniert, bis sich etwas in git_completion.bash geändert hat … Jetzt funktioniert es mit dem vollständigen Befehl, aber nicht mit dem Alias.
– Michael Schmidt
24. Januar 2012 um 3:21 Uhr
Am Ende dieser Seite finden Sie Antworten, die in modernem Git funktionieren.
Im Idealfall möchte ich, dass die automatische Vervollständigung auf magische Weise für alle meine Aliase funktioniert. Ist es möglich?
Ja, das ist mit möglich vollständiger Alias Projekt (unter Linux). Die Unterstützung für Mac ist experimentell, aber Benutzer haben Erfolge gemeldet.
Ich habe den Alias g=’git’ und in Kombination mit meinen Git-Aliassen tippe ich Dinge wie
$ g co <branchname>
Die einfachere Lösung für meinen speziellen Anwendungsfall bestand darin, eine einzelne Zeile zu git-completion hinzuzufügen.
Direkt unter dieser Zeile:
__git_complete git _git
Ich habe diese Zeile hinzugefügt, um meinen einzelnen ‘g’-Alias zu behandeln:
__git_complete g _git
(Ich verwende Cygwin.) Ich konnte die Datei nicht finden git-completion oder diese Zeile in /etc/bash_completion.d/gitaber ich fügte hinzu complete -o default -o nospace -F _git g nach meinem Alias in .bash_aliases und es hat funktioniert!
– idbrii
4. Dezember 2012 um 19:07 Uhr
Beachten Sie, dass wenn Sie eine Datei in bearbeiten /etc/bash-completion.d/ oder neu drin /usr/share/bash-completion/verlieren Sie Ihre Änderungen, wenn diese Datei mit Ihrem Paketmanager aktualisiert wird.
– kub1x
26. Februar 2016 um 13:20 Uhr
Eine weitere Option ist die Verwendung ~/.bash_completion Datei. Um die zu erstellen gco Pseudonym für git checkout stell das einfach da rein:
_xfunc git __git_complete gco _git_checkout
Dann in ~/.bashrc Sie müssen nur den Alias selbst eingeben:
alias gco='git checkout'
Zwei Linien. Das ist es.
Erläuterung:
Die ~/bash_completion wird am Ende des Hauptskripts bash_completion bezogen. In gentoo fand ich das Hauptskript in /usr/share/bash-completion/bash_completion.
Die _xfunc git bit kümmert sich um die Beschaffung der git-completion Datei für Sie, sodass Sie nichts weiter eingeben müssen ~/.bashrc.
Die akzeptierte Antwort muss kopiert werden .git-completion.sh und beziehen Sie es von Ihrem ~/.bashrc Datei, die ich lahm finde.
PS: Ich versuche immer noch herauszufinden, wie ich das Ganze nicht beschaffen soll git-completion Skript in meine Bash-Umgebung. Bitte kommentieren oder bearbeiten Sie, wenn Sie einen Weg finden.
(Ich verwende Cygwin.) Ich konnte die Datei nicht finden git-completion oder diese Zeile in /etc/bash_completion.d/gitaber ich fügte hinzu complete -o default -o nospace -F _git g nach meinem Alias in .bash_aliases und es hat funktioniert!
– idbrii
4. Dezember 2012 um 19:07 Uhr
Beachten Sie, dass wenn Sie eine Datei in bearbeiten /etc/bash-completion.d/ oder neu drin /usr/share/bash-completion/verlieren Sie Ihre Änderungen, wenn diese Datei mit Ihrem Paketmanager aktualisiert wird.
– kub1x
26. Februar 2016 um 13:20 Uhr
mipadi
Sie können auch versuchen, Git-Aliase zu verwenden. Zum Beispiel in meiner ~/.gitconfig Datei habe ich einen Abschnitt, der so aussieht:
[alias]
co = checkout
Du könntest also tippen git co m<TAB>und das sollte erweitert werden zu git co masterdas ist die git checkout Befehl.
9156800cookie-checkWie bringe ich die Bash-Vervollständigung dazu, mit Aliasen zu arbeiten?yes
complete -o default -o nospace -F funktioniert heutzutage nicht mehr
– acht Augen
22. März 2013 um 19:20 Uhr
Fragen mit mehr Upvotes als die Top-Antwort implizieren oft großartig Funktionsanfragen
– Ciro Santilli 新疆再教育营六四事件法轮功郝海东
20. Januar 2014 um 9:16 Uhr
Eine weitere Antwort von Superuser, als mich jemand darauf hinwies, dass meine Frage dort ein Betrüger von dieser war. superuser.com/questions/436314/…
– dstarh
21. Januar 2014 um 14:09 Uhr