zsh ile git tamamlama: boşluklu dosya adları düzgün bir şekilde kaçmıyor


20

Git tamamlama:

Git'in dosya adı otomatik tamamlama sistemiyle ilgili sorun yaşıyorum. OS X (10.9.3) üzerinde (1.9.3) zshile (5.0.5) kullanıyorum git. Her ikisi de zshve githomebrew ile kuruldu. (Tam sürüm çıktısı yazının altındadır.)

gitadlı kişinin dosya adı tamamlaması beklediğim gibi boşluk eklemiyor. Adında boşluk bulunan bir dosyanın adını yazdığımda, kabuk boşluk bırakmadan dosya adını ekler. zsh'ın yerleşik tamamlanması bunu yapmaz, ama gityapar.

İşte gördüğüm şeyin bir örneği.

Adlarında boşluk bulunan birkaç dosya içeren bir havuzum var.

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

Kabuk ters eğik çizgi, dosya adını eklemek için sekme tamamlamayı kullandığımda dosya adlarından beklendiği gibi kaçıyor.

% echo "testing" >> test<tab>

sekmeye üç kez vurduktan sonra bunu otomatik olarak tamamlar.

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

git status bu dosya adlarını tırnak içinde gösterir (ne olduğunu tamamen anlar):

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

ancak git addsekme otomatik tamamlama ile denediğimde , yanlara doğru gider.

% git add test<tab>

sekmeye üç kez vurduktan sonra bununla sonuçlanır:

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

Bu biraz gerileme denedim: denedim yani benim dotfiles, sürüm kontrolü bulunmaktadır zsh 4.3.15, git 1.8.3neredeyse eminim ne zaman ve bir yıl önce benim dotfiles, bu çalıştı. Tuhaf bir şekilde, bu kurulum hala kırılmıştı.

Ben var aşağı Buna daralmış _gitkaynaklı ediliyor tamamlama dosyası /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

El ile değiştirirseniz $FPATHbenim önce .zshrcishal compinit(veya basitçe kaldırmak /usr/local/share/zsh/site-functions/_gitsimgesel bağlantı), sonra tamamlamalar geri düşmesi zshbeklendiği gibi ve çalışma.

zshTamamlanmadan _git:

% git add test<tab>

sekmeye üç kez basmak doğru sonuçlar verir:

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

Yan not: git-completion.bashBağlantıyı kaldırmayı denedim ve sadece tamamen kopuyor:

% git add test<tab>

bu baskınlığı üretir:

% 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                

Ben gerçekten geri kalanı: Bu düzgün çalışmıyor almak istiyorum _gitdaha Repo-farkında daha çünkü tamamlama harika zsholanlar, ancak boşluk veya diğer özel karakterler ile dosya adları düzgün kaçtı gerekmektedir.


Yazılım sürümleri:

% 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

_gitVe git-completion.bashdosyalarını yükledim : git-completion.bash ve _git ( _git.shCloudApp'ın tarayıcıda görüntülenebilir olmasını sağlayacak şekilde yeniden adlandırıldı .)


2
Kitlenizdeki OSX dışı kullanıcılar için git paketinizle birlikte gönderilen tamamlamaları indirebileceğimiz bir yere bağlanabilir misiniz?
Gilles 'SO- kötü olmayı kes'

2
: Elbette: (CloudApp için _git.sh olarak yeniden adlandırıldı) _git cl.ly/code/423e0i1X1p29 : ve git-completion.bash cl.ly/code/153v2t142i2G
cbowns

3
Bir bakışım vardı _git. compadd -QTuhaf görünmek için yapılan çağrılar : -Q“özel karakter alıntılama” anlamına gelir. Kaldırmayı deneyin -Qgelen compaddçağrılar.
Gilles 'SO- kötü olmayı bırak'

3
Sorunun, zshkelime bölme komut değiştirme sonuçlarının varsayılan davranışı nedeniyle oldukça eminim . Aslında - \bskaçış gerekli değildir - ya da ona nasıl baktığınıza bağlı olarak boştur. Set "SH_WORD_SPLIT" zsh.sourceforge.net/FAQ/zshfaq03.html
mikeserv

4
Alternatif olarak, bash tamamlama işlevlerini ${=$(completion)}, döndükleri gibi veya ne olursa olsun çıktı almak için düzenleyin .
mikeserv

Yanıtlar:


5

Bu hata posta listesinde belirtilmiştir .

Düzeltme dosyasını düzenlemektir git-completion.zshve kaldırmak -Qseçeneğini compaddin, __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 ()

Bu dosya dizinden yüklenir contrib/completionve yolu paket yöneticinize göre değişebilir. MacOS'a homebrew ile yüklediyseniz, içinde bulunur /usr/local/Cellar/git/2.10.2/share/zsh/site-functions.


Hakkında hata __git_aliased_command, paylaşım dizininin adını git-core (en azından FreeBSD'de) olarak değiştirmiş olması, bu da bulunmamasına neden olmasıdır git-completion.bash. 33 satırındaki ilk konumu bir sabit kodla değiştirirseniz /usr/local/share/git-core/contrib/completion/git-completion.bashtekrar çalışır.
Melvyn

Orada bir var echosadece bu fonksiyon tanımları yukarıda bu dosyada, ve benim kabuğunda bunun görünüm eksikliği (ve test bazı komşu kodu) bu tamamlamalar bile kullanılmaz öneriyor:if [[ -n ${ZSH_VERSION-} ]]; then echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
cbowns

1
Benim için çalıştı Bu benim değişince (git 2.18, 5.4.2 osx zsh) compadd -Q> - compaddtüm örnekler için _gitve git-completion.bashklasördeki /usr/local/Cellar/git/2.18.0/share/zsh/site-functions/benim demlemek git tesisatının. Teşekkür ederim!!!
Merlin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.