Wie bringe ich die Bash-Vervollständigung dazu, mit Aliasen zu arbeiten?

Lesezeit: 8 Minuten

Wie bringe ich die Bash Vervollstandigung dazu mit Aliasen zu arbeiten
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/…

    – dstarh

    21. Januar 2014 um 14:09 Uhr

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

  • 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


1646251687 807 Wie bringe ich die Bash Vervollstandigung dazu mit Aliasen zu arbeiten
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

Wie bringe ich die Bash Vervollstandigung dazu mit Aliasen zu arbeiten
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

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

    – acht Augen

    22. März 2013 um 19:19 Uhr

  • das funktioniert gut – habe dies zu meinem .bash_profile hinzugefügt und funktioniert bisher gut mit und ohne Aliase: github.com/larrybotha/dotfiles/blob/master/…

    – Larry

    2. Juli 2013 um 14:25 Uhr

1646251688 894 Wie bringe ich die Bash Vervollstandigung dazu mit Aliasen zu arbeiten
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

  • (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

1646251689 894 Wie bringe ich die Bash Vervollstandigung dazu mit Aliasen zu arbeiten
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.

915680cookie-checkWie bringe ich die Bash-Vervollständigung dazu, mit Aliasen zu arbeiten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy