Git-Vervollständigung:
Ich habe Probleme mit der automatischen Vervollständigung der Dateinamen von Git auf meinem System. Ich verwende zsh
(5.0.5) mit git
(1.9.3) unter OS X (10.9.3). Beide zsh
und git
wurden über Homebrew installiert. (Die Ausgabe der Vollversion befindet sich am Ende des Beitrags.)
git
Beim Vervollständigen des Dateinamens werden keine Leerzeichen wie erwartet eingefügt. Wenn ich den Namen einer Datei mit einem Leerzeichen im Namen eingebe, fügt die Shell den Dateinamen ein, ohne dass Leerzeichen maskiert werden. zsh
Die eingebaute Vervollständigung macht das nicht, aber sie git
macht es.
Hier ist ein Beispiel für das, was ich sehe.
Ich habe ein Repository mit ein paar Dateien mit Leerzeichen im Namen.
% ls -la
test
test four - latest.txt
test three.txt
test two
Der Shell-Backslash verschwindet erwartungsgemäß aus den Dateinamen, wenn ich den Dateinamen mithilfe der Tabulatorvervollständigung einfüge.
% echo "testing" >> test<tab>
wird nach dreimaligem Drücken der Tabulatortaste automatisch vervollständigt.
% echo "testing" >> test\ four\ -\ latest.txt
––– file
test test\ four\ -\ latest.txt test\ three.txt test\ two
git status
zeigt diese Dateinamen in Anführungszeichen (es versteht völlig, was los ist):
% git status --short
M test
M "test four - latest.txt"
M "test three.txt"
M "test two"
Aber wenn ich versuche, git add
mit Tab Autocompletion, geht es seitwärts.
% git add test<tab>
Das führt zu folgendem Ergebnis, nachdem Sie dreimal auf die Registerkarte geklickt haben:
% git add test four - latest.txt
test test four - latest.txt test three.txt test two
Ich habe diese ein wenig versucht , regredieren: meine dotfiles sind in der Versionskontrolle, so dass ich versucht habe zsh 4.3.15
, git 1.8.3
und meine dotfiles von vor einem Jahr, als ich fast sicher bin , das funktionieren. Seltsamerweise war dieses Setup immer noch kaputt.
Ich habe es auf die _git
Vervollständigungsdatei eingegrenzt, von der bezogen wird /usr/local/share/zsh/site-functions
:
% echo $FPATH
/usr/local/share/zsh/site-functions:/usr/local/Cellar/zsh/5.0.5/share/zsh/functions
% ls -l /usr/local/share/zsh/site-functions
_git@ -> ../../../Cellar/git/1.9.3/share/zsh/site-functions/_git
_hg@ -> ../../../Cellar/mercurial/3.0/share/zsh/site-functions/_hg
_j@ -> ../../../Cellar/autojump/21.7.1/share/zsh/site-functions/_j
git-completion.bash@ -> ../../../Cellar/git/1.9.3/share/zsh/site-functions/git-completion.bash
go@ -> ../../../Cellar/go/HEAD/share/zsh/site-functions/go
Wenn ich manuell ändere, $FPATH
bevor meine .zshrc
Läufe ausgeführt werden compinit
(oder einfach die /usr/local/share/zsh/site-functions/_git
symbolische Verknüpfung entferne ), werden die Vervollständigungen wiederhergestellt zsh
und funktionieren wie erwartet.
Die zsh
Fertigstellung ohne _git
:
% git add test<tab>
Dreimaliges Drücken der Tabulatortaste führt zu korrekten Ergebnissen:
% git add test\ four\ -\ latest.txt
––– modified file
test test\ four\ -\ latest.txt test\ three.txt test\ two
Randnotiz: Ich habe versucht, den git-completion.bash
Link zu entfernen , und es bringt die Dinge einfach total zum Erliegen:
% git add test<tab>
produziert diese Busted-Ness:
% git add test__git_zsh_bash_func:9: command not found: __git_aliased_command
git add test
––– file
test test\ four\ -\ latest.txt test\ three.txt test\ two
Ich möchte wirklich , dass dies richtig funktioniert: Der Rest der _git
Vervollständigungen war großartig, weil sie reposicherer sind als zsh
diejenigen, aber ich benötige Dateinamen mit Leerzeichen oder anderen Sonderzeichen, um richtig zu flüchten.
Softwareversionen:
% zsh --version
zsh 5.0.5 (x86_64-apple-darwin13.0.0)
% git --version
git version 1.9.3
% sw_vers
ProductName: Mac OS X
ProductVersion: 10.9.3
BuildVersion: 13D65
Ich habe die Dateien _git
und hochgeladen git-completion.bash
: git-completion.bash und _git (umbenannt in, _git.sh
damit CloudApp sie im Browser anzeigen kann.)
_git
. Die Aufrufe, compadd -Q
seltsam auszusehen: -Q
bedeutet "keine Sonderzeichen zitieren". Versuchen Sie, -Q
aus den compadd
Anrufen zu entfernen .
zsh
das Standardverhalten zurückzuführen ist, bei dem die Ergebnisse der Befehlssubstitution nicht wortspaltend sind. In der Tat - die \bs
Flucht ist nicht notwendig - oder vergeblich, je nachdem, wie Sie es betrachten. "SH_WORD_SPLIT"
Stellen
${=$(completion)}
dass sie wie oder wie auch immer ausgegeben werden, wenn sie zurückkehren.