git selesai dengan zsh: nama file dengan spasi tidak bisa diloloskan dengan benar


20

Penyelesaian Git:

Saya mengalami kesulitan dengan pelengkapan otomatis nama file git di sistem saya. Saya menggunakan zsh(5.0.5) dengan git(1.9.3) di OS X (10.9.3). Keduanya zshdan gittelah diinstal melalui homebrew. (Output versi lengkap ada di bagian bawah posting.)

gitPenyelesaian nama file tidak memasukkan spasi seperti yang saya harapkan. Ketika saya mengetik nama file dengan spasi di namanya, shell memasukkan nama file tanpa spasi. zshSelesai built-in tidak melakukan ini, tetapi gititu.

Ini contoh dari apa yang saya lihat.

Saya memiliki repositori dengan beberapa file dengan spasi di namanya.

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

Shell backslash lolos dari nama file seperti yang diharapkan ketika saya menggunakan tab completion untuk memasukkan nama file.

% echo "testing" >> test<tab>

lengkapi ini secara otomatis setelah menekan tab tiga kali.

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

git status menunjukkan nama file ini dalam tanda kutip (itu benar-benar mengerti apa yang terjadi):

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

tetapi ketika saya mencoba git adddengan pelengkapan otomatis tab, ia pergi ke samping.

% git add test<tab>

menghasilkan ini setelah menekan tab tiga kali:

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

Saya sudah mencoba regresi ini sedikit: dotfiles saya di kontrol versi, jadi saya sudah mencoba zsh 4.3.15, git 1.8.3dan dotfiles saya dari tahun lalu, ketika saya hampir yakin ini bekerja. Anehnya, pengaturan ini masih rusak.

Saya telah mempersempitnya ke _gitfile penyelesaian yang bersumber dari /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

Jika saya mengubah secara manual $FPATHsebelum .zshrcmenjalankan compinit(atau cukup menghapus /usr/local/share/zsh/site-functions/_gittautan simbolik), maka penyelesaian kembali ke zshdan berfungsi seperti yang diharapkan.

The zshselesai tanpa _git:

% git add test<tab>

tab memukul tiga kali menghasilkan hasil yang benar:

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

Catatan: Saya sudah mencoba menghapus git-completion.bashtautan, dan itu benar-benar merusak:

% git add test<tab>

menghasilkan ini rusak:

% 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                

Saya benar - benar ingin ini berfungsi dengan baik: sisa dari _gitpenyelesaian yang bagus karena mereka lebih sadar daripada zshyang, tapi saya perlu nama file dengan spasi atau karakter khusus lainnya untuk melarikan diri dengan benar.


Versi perangkat lunak:

% 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

Saya telah mengunggah _gitdan git-completion.bashfile: git-completion.bash dan _git (diubah namanya _git.shjadi CloudApp akan membuatnya dapat dilihat di browser.)


2
Untuk pengguna non-OSX di audiens, bisakah Anda menautkan ke suatu tempat di mana kami dapat mengunduh penyelesaian yang dikirimkan bersama paket git Anda?
Gilles 'SO- stop being evil'

2
Tentu: _git (diubah namanya menjadi _git.sh untuk CloudApp): cl.ly/code/423e0i1X1p29 dan git-completion.bash: cl.ly/code/153v2t142i2G
cbowns

3
Saya melihat sekilas _git. Panggilan untuk compadd -Qterlihat aneh: -Qberarti "jangan mengutip karakter khusus". Coba hapus -Qdari compaddpanggilan.
Gilles 'SO- stop being evil'

3
Saya cukup yakin masalahnya adalah karena zshperilaku default dari hasil substitusi perintah pemisahan kata. Sebenarnya - \bspelarian tidak perlu - atau sia-sia, tergantung pada bagaimana Anda melihatnya. Set"SH_WORD_SPLIT" zsh.sourceforge.net/FAQ/zshfaq03.html
mikeserv

4
Sebagai alternatif, edit fungsi penyelesaian bash ke output seperti ${=$(completion)}atau apa pun yang mereka kembalikan.
mikeserv

Jawaban:


5

Bug ini disebutkan di milis .

Cara mengatasinya adalah mengedit file git-completion.zshdan menghapus -Qopsi dari compadd, di __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 ()

File ini diinstal dari contrib/completiondirektori, dan jalurnya dapat bervariasi dengan manajer paket Anda. Jika Anda menginstal dengan homebrew di macOS, itu terletak di /usr/local/Cellar/git/2.10.2/share/zsh/site-functions.


Kesalahannya __git_aliased_commandadalah karena direktori berbagi mengubah nama menjadi git-core (setidaknya pada FreeBSD), yang menyebabkannya tidak dapat ditemukan git-completion.bash. Jika Anda mengubah lokasi pertama pada baris 33 ke hardcode, /usr/local/share/git-core/contrib/completion/git-completion.bashitu berfungsi lagi.
Melvyn

Ada di echodalam file itu tepat di atas definisi fungsi ini, dan kurangnya penampilan di dalam shell saya (dan beberapa kode yang berdekatan saat pengujian) menunjukkan pelengkapan ini bahkan tidak digunakan:if [[ -n ${ZSH_VERSION-} ]]; then echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
cbowns

1
Ini bekerja untuk saya (git 2.18, zsh 5.4.2 osx) ketika saya mengubah compadd -Q-> compadduntuk semua instance di _gitdan git-completion.bashdi folder /usr/local/Cellar/git/2.18.0/share/zsh/site-functions/instalasi brit git saya. Terima kasih!!!
Merlin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.