
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?
Wie oben in den Kommentaren erwähnt,
complete -o default -o nospace -F _git_checkout gco
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

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

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
:
complete -o default -o nospace -F _git_checkout gco

Kyker
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
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.

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 master
das 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