git uzupełnianie za pomocą zsh: nazwy plików ze spacjami nie są poprawnie zmieniane

20

Zakończenie Git:

Mam problem z autouzupełnianiem nazw plików git w moim systemie. Używam zsh(5.0.5) z git(1.9.3) na OS X (10.9.3). Zarówno zshi gitzostały zainstalowane poprzez homebrew. (Dane wyjściowe pełnej wersji znajdują się na dole posta).

gitUzupełnianie nazw plików nie wstawia spacji, jak się spodziewałem. Kiedy wpisuję nazwę pliku ze spacją w nazwie, powłoka wstawia nazwę pliku bez spacji. zshWbudowane zakończenie nie robi tego, ale gitrobi.

Oto przykład tego, co widzę.

Mam repozytorium z kilkoma plikami ze spacjami w nazwach.

% ls -la
test
test four - latest.txt
test three.txt
test two

Odwrotny ukośnik powłoki unika nazw plików zgodnie z oczekiwaniami, gdy wstawiam nazwę pliku za pomocą tabulacji.

% echo "testing" >> test<tab>

autouzupełnia się po trzykrotnym naciśnięciu klawisza.

% echo "testing" >> test\ four\ -\ latest.txt
––– file
test                       test\ four\ -\ latest.txt  test\ three.txt            test\ two                

git status pokazuje te nazwy plików w cudzysłowie (całkowicie rozumie co jest grane):

% git status --short
 M test
 M "test four - latest.txt"
 M "test three.txt"
 M "test two"

ale kiedy próbuję git addz autouzupełnianiem tabulacji, idzie to na boki.

% git add test<tab>

powoduje to po trzykrotnym naciśnięciu karty:

% git add test four - latest.txt
test                    test four - latest.txt  test three.txt          test two

Próbowałem cofa ten kawałek: my dotfiles są pod kontrolą wersji, więc próbowałem zsh 4.3.15, git 1.8.3i moje dotfiles z rok temu, kiedy jestem prawie pewien, że to działało. Co dziwne, ta konfiguracja wciąż była zepsuta.

I nie zmniejszyła go do _gitpliku, który jest ukończenia pochodzących od /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

Jeśli ręcznie zmienię $FPATHprzed .zshrcuruchomieniem compinit(lub po prostu usunę /usr/local/share/zsh/site-functions/_gitdowiązanie symboliczne), uzupełnienia wrócą zshi będą działać zgodnie z oczekiwaniami.

zshZakończenie bez _git:

% git add test<tab>

trzykrotne naciśnięcie karty daje prawidłowe wyniki:

% git add test\ four\ -\ latest.txt
––– modified file
test                       test\ four\ -\ latest.txt  test\ three.txt            test\ two                

Uwaga dodatkowa: Próbowałem usunąć git-completion.bashlink, a to po prostu całkowicie psuje rzeczy:

% git add test<tab>

wywołuje ten upadek:

% 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                

I naprawdę chcą dostać to działa prawidłowo: reszta _gitoddawanych były świetne, bo są bardziej świadome repo niż zshte, ale muszę nazwy plików ze spacjami lub innymi znakami specjalnymi być właściwie uciekł.


Wersje oprogramowania:

% 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

Przesłałem pliki _giti git-completion.bash: git- complete.bash i _git (przemianowane na _git.shtak, aby CloudApp sprawi, że będzie widoczny w przeglądarce).

cbowns
źródło
2
Czy w przypadku odbiorców spoza systemu OSX można podać link do jakiegoś miejsca, w którym możemy pobrać uzupełnienia dostarczane z pakietem git?
Gilles „SO- przestań być zły”
2
Pewnie: _git (przemianowany na _git.sh dla CloudApp): cl.ly/code/423e0i1X1p29 i git- complete.bash
cbowns
3
Rzuciłem okiem na _git. Wezwania, by compadd -Qwyglądać dziwnie: -Qoznaczają „nie cytuj znaków specjalnych”. Spróbuj usunąć -Qz compaddpołączeń.
Gilles „SO- przestań być zły”
3
Jestem całkiem pewien, że problem wynika z zshdomyślnego zachowania polegającego na niepodzielnym dzieleniu słów na wyniki podstawiania poleceń. W rzeczywistości - \bsucieczka nie jest konieczna - lub jest daremna, w zależności od tego, jak na nią spojrzysz. Ustaw "SH_WORD_SPLIT" zsh.sourceforge.net/FAQ/zshfaq03.html
mikeserv
4
Alternatywnie edytuj funkcje kończące bash, aby wyświetlały jak ${=$(completion)}lub cokolwiek, co zwracają.
mikeserv

Odpowiedzi:

5

Ten błąd jest wymieniony na liście adresowej .

Rozwiązaniem jest edycja pliku git-completion.zshi usunięcie -Qopcji z compadd, w __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 ()

Ten plik jest instalowany z contrib/completionkatalogu, a jego ścieżka może się różnić w zależności od menedżera pakietów. Jeśli zainstalowałeś z homebrew na macOS, znajduje się w /usr/local/Cellar/git/2.10.2/share/zsh/site-functions.

toasted_flakes
źródło
Błąd związany __git_aliased_commandjest z tym, że katalog udziału zmienił nazwę na git-core (przynajmniej na FreeBSD), co powoduje, że nie można go znaleźć git-completion.bash. Jeśli zmienisz pierwszą lokalizację w linii 33 na zakodowaną /usr/local/share/git-core/contrib/completion/git-completion.bash, działa to ponownie.
Melvyn
Tam jest echow tym pliku tuż powyżej tych definicji funkcji, a brak pojawienia się go w swojej skorupy (a niektóre sąsiadujące kodu podczas testowania) sugeruje Realizacje te nie są jeszcze stosowane:if [[ -n ${ZSH_VERSION-} ]]; then echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
cbowns
1
Ten pracował dla mnie (git 2.18 zsh 5.4.2 OSX), gdy zmieniłem compadd -Q-> compadddla wszystkich instancji w _giti git-completion.bashw folderze /usr/local/Cellar/git/2.18.0/share/zsh/site-functions/mojej instalacji napar git. Dziękuję Ci!!!
Merlin,