Git-Vervollständigung mit zsh: Dateinamen mit Leerzeichen werden nicht richtig maskiert


20

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 zshund gitwurden über Homebrew installiert. (Die Ausgabe der Vollversion befindet sich am Ende des Beitrags.)

gitBeim 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. zshDie eingebaute Vervollständigung macht das nicht, aber sie gitmacht 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 addmit 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.3und 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 _gitVervollstä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, $FPATHbevor meine .zshrcLäufe ausgeführt werden compinit(oder einfach die /usr/local/share/zsh/site-functions/_gitsymbolische Verknüpfung entferne ), werden die Vervollständigungen wiederhergestellt zshund funktionieren wie erwartet.

Die zshFertigstellung 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.bashLink 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 _gitVervollständigungen war großartig, weil sie reposicherer sind als zshdiejenigen, 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 _gitund hochgeladen git-completion.bash: git-completion.bash und _git (umbenannt in, _git.shdamit CloudApp sie im Browser anzeigen kann.)


2
Könnten Sie für die Nicht-OSX-Benutzer in der Zielgruppe einen Link zu einem Ort erstellen, an dem wir die mit Ihrem Git-Paket gelieferten Ergänzungen herunterladen können?
Gilles 'SO- hör auf böse zu sein'

2
Sicher: _git (für CloudApp in _git.sh umbenannt): cl.ly/code/423e0i1X1p29 und git-completion.bash: cl.ly/code/153v2t142i2G
cbowns

3
Ich hatte einen Blick auf _git. Die Aufrufe, compadd -Qseltsam auszusehen: -Qbedeutet "keine Sonderzeichen zitieren". Versuchen Sie, -Qaus den compaddAnrufen zu entfernen .
Gilles 'SO- hör auf böse zu sein'

3
Ich bin mir ziemlich sicher, dass das Problem auf zshdas Standardverhalten zurückzuführen ist, bei dem die Ergebnisse der Befehlssubstitution nicht wortspaltend sind. In der Tat - die \bsFlucht ist nicht notwendig - oder vergeblich, je nachdem, wie Sie es betrachten. "SH_WORD_SPLIT" Stellen
mikeserv

4
Alternativ können Sie die Bash-Vervollständigungsfunktionen so bearbeiten, ${=$(completion)}dass sie wie oder wie auch immer ausgegeben werden, wenn sie zurückkehren.
mikeserv

Antworten:


5

Dieser Fehler wird in der Mailingliste erwähnt .

Das Update besteht darin, die Datei zu bearbeiten git-completion.zshund die -QOption von compadd, in in zu entfernen __gitcomp_file.

--- i/contrib/completion/git-completion.zsh
+++ w/contrib/completion/git-completion.zsh
@@ -90,7 +90,7 @@ __gitcomp_file ()

    local IFS=$'\n'
    compset -P '*[=:]'
-   compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
+   compadd -p "${2-}" -f -- ${=1} && _ret=0
 }

 __git_zsh_bash_func ()

Diese Datei wird aus dem contrib/completionVerzeichnis installiert , und der Pfad kann je nach Paketmanager variieren. Wenn Sie Homebrew unter macOS installiert haben, befindet es sich in /usr/local/Cellar/git/2.10.2/share/zsh/site-functions.


Der Fehler __git_aliased_commandliegt darin, dass das Freigabe-Verzeichnis den Namen in git-core geändert hat (zumindest unter FreeBSD), was dazu führt, dass es nicht gefunden wird git-completion.bash. Wenn Sie den ersten Speicherort in Zeile 33 in einen Hardcode ändern /usr/local/share/git-core/contrib/completion/git-completion.bash, funktioniert dies wieder.
Melvyn

echoDiese Datei enthält eine Datei direkt über diesen Funktionsdefinitionen, und das Fehlen einer solchen Datei in meiner Shell (und einiger benachbarter Codes beim Testen) lässt vermuten, dass diese Vervollständigungen nicht einmal verwendet werden:if [[ -n ${ZSH_VERSION-} ]]; then echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
cbowns

1
Dies funktionierte bei mir (git 2.18, zsh 5.4.2 osx), als ich änderte compadd -Q-> compaddfür alle Instanzen in _gitund git-completion.bashim Ordner /usr/local/Cellar/git/2.18.0/share/zsh/site-functions/meiner Installation von brew git. Vielen Dank!!!
Merlin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.