Problem

Problem

Problem

Ich habe folgendes

git reset HEAD^ half_entered_file_n<Tab>

An dieser Stelle möchte ich, dass die Datei half_entered_file_name.txt mit der Tabulatortaste vervollständigt wird.

Meine eigene Untersuchung

Ich kann die Tab-Vervollständigung zum Laufen bringen, wenn ich schreibe

git reset HEAD\^ ...

Stattdessen wird das "^" maskiert.

Das Schreiben eines „^“ als letztes Zeichen scheint die Autovervollständigung nicht zu beeinflussen, es sei denn, HEAD ist ebenfalls vorhanden:

#autocomplete works
git reset RANDOM^ half_entered_file_n<Tab> #works

Zsh-Konfiguration

Ich verwende Oh-my-zsh. Zusätzlich zu oh-my-zsh habe ich Folgendes konfiguriert, was relevant sein könnte:

# Let <TAB> auto completion add a slash at the end instead of space (like BASH)
zstyle ':completion:*' special-dirs true 

# Unless this option is set, you can't write git checkout HEAD^^ without escaping ^ as \^ in zsh
setopt NO_NOMATCH 

# Standard git plugins
plugins=(git git-extras)

Zur Vollständigkeit,hier ist meine Konfiguration

Ich führe dies auf OSX in iTerm2 aus.

Danke!

Aktualisieren

Ich habe einige Teillösungen gefunden, aber keine, die bisher zum Status „Beantwortet“ geführt haben, was sie im Grunde zu Nicht-Lösungen macht.

  1. compdef -d gitin .zshrc festgelegtwie von "Caveman" vorgeschlagen
    • Löst: Jetzt unterbricht HEAD^ nicht mehr die automatische Dateivervollständigung.
    • Nachteil: Die automatische Vervollständigung von Git-Befehlen funktioniert nicht mehr.
  2. Verwenden Sie dieakzeptierte Antwort von "ralphtheninja" auf diese Frage
    • Lösung: Sollte die Art und Weise ersetzen, wie die Dateivervollständigungsliste generiert wird, was das Problem lösen würde.
    • Nachteil: Funktioniert nicht. Es scheint, dass die Syntax von git-completion.zsh/.bash geändert wurde.

Ich kenne mich mit Shell-Skripting nicht gut genug aus, um genau zu verstehen, was in git-completion.zsh/.bash vor sich geht und ob das der Grund ist, warum Dinge nicht funktionieren.

Antwort1

Warum Sie nicht davon ausgehen sollten

Ich habe lange angenommen, dass die Git-Vervollständigung in meiner Zsh-Konfiguration von kam /usr/local/share/git-core/contrib/completion/, genauer gesagt von git-completion.zshoder sogar git-completion.bash. Ich schätze, ich habe das angenommen, weil die meisten Suchvorgänge Ergebnisse liefern, die sich auf diese Dateien beziehen. Ich habe jedoch keine dieser Dateien explizit eingeschlossen und habe lange Zeit einfach vermutet, dass oh-my-zsh sie einschließt.

Aber...

Wir sind nicht mehr in Kansas

Erst als ich die über aktivierte zsh-Methodenverfolgung verwendete, setopt xtracewurde mir (durch das Googeln einiger Methodennamen) klar, dass das verwendete Skript tatsächlich war /usr/local/share/zsh/functions/_git. Ich hatte zuvorXCode Instruments.appum zu überwachen, auf welche Skripte im Dateisystem zugegriffen wurde, habe es damals aber nicht herausgefunden (die Ausgabe ist recht gesprächig und zeigt auch Zugriffe von anderen Apps an).

Was ist los?

Die Spuren haben dies gezeigt (Teilspuren voraus!)

git reset HEAD <TAB>
...
+__git_tree_files:17> tree=HEAD
+__git_tree_files:18> tree_files+=+__git_tree_files:18> _call_program tree-files git ls-tree --name-only -z HEAD ./
+__git_tree_files:18> tree_files+=( first second third )

Und

git reset HEAD^ <TAB>
...
+__git_tree_files:17> tree=HEAD^
+__git_tree_files:18> tree_files+=+__git_tree_files:18> _call_program tree-files git ls-tree --name-only -z 'HEAD^' ./
+__git_tree_files:18> tree_files+=( )

Das Leere tree_filessieht verdächtig aus.

In Zeile 6058 /usr/local/share/zsh/functions/_gitfinden wir

tree_files+=(${(ps:\0:)"$(_call_program tree-files git ls-tree $extra_args --name-only -z $tree $Path 2>/dev/null)"})

Wir müssen diese Variable unbedingt escapen $tree. Gesagt, getan:

tree_files+=(${(ps:\0:)"$(_call_program tree-files git ls-tree $extra_args --name-only -z ${(q)tree} $Path 2>/dev/null)"}) 

Epilog

git reset <tree-ish>In diesem Skript gibt es noch einige weitere Fehler (z. B. basiert die Dateiliste für auf dem <tree-ish>, obwohl sie auf HEAD basieren sollte). Jetzt weiß ich, wo ich sie beheben kann!

Aktualisieren

Es besteht auch die Möglichkeit, die Vervollständigungsskripte stattdessen von Git aus auszuführen.Sie können dies tun, indem Sie dieser Antwort folgen.

verwandte Informationen