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 zsh
dan git
telah diinstal melalui homebrew. (Output versi lengkap ada di bagian bawah posting.)
git
Penyelesaian nama file tidak memasukkan spasi seperti yang saya harapkan. Ketika saya mengetik nama file dengan spasi di namanya, shell memasukkan nama file tanpa spasi. zsh
Selesai built-in tidak melakukan ini, tetapi git
itu.
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 add
dengan 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.3
dan dotfiles saya dari tahun lalu, ketika saya hampir yakin ini bekerja. Anehnya, pengaturan ini masih rusak.
Saya telah mempersempitnya ke _git
file 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 $FPATH
sebelum .zshrc
menjalankan compinit
(atau cukup menghapus /usr/local/share/zsh/site-functions/_git
tautan simbolik), maka penyelesaian kembali ke zsh
dan berfungsi seperti yang diharapkan.
The zsh
selesai 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.bash
tautan, 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 _git
penyelesaian yang bagus karena mereka lebih sadar daripada zsh
yang, 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 _git
dan git-completion.bash
file: git-completion.bash dan _git (diubah namanya _git.sh
jadi CloudApp akan membuatnya dapat dilihat di browser.)
sumber
_git
. Panggilan untukcompadd -Q
terlihat aneh:-Q
berarti "jangan mengutip karakter khusus". Coba hapus-Q
daricompadd
panggilan.zsh
perilaku default dari hasil substitusi perintah pemisahan kata. Sebenarnya -\bs
pelarian tidak perlu - atau sia-sia, tergantung pada bagaimana Anda melihatnya. Set"SH_WORD_SPLIT"
zsh.sourceforge.net/FAQ/zshfaq03.html${=$(completion)}
atau apa pun yang mereka kembalikan.Jawaban:
Bug ini disebutkan di milis .
Cara mengatasinya adalah mengedit file
git-completion.zsh
dan menghapus-Q
opsi daricompadd
, di__gitcomp_file
.File ini diinstal dari
contrib/completion
direktori, 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
.sumber
__git_aliased_command
adalah karena direktori berbagi mengubah nama menjadi git-core (setidaknya pada FreeBSD), yang menyebabkannya tidak dapat ditemukangit-completion.bash
. Jika Anda mengubah lokasi pertama pada baris 33 ke hardcode,/usr/local/share/git-core/contrib/completion/git-completion.bash
itu berfungsi lagi.echo
dalam 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
compadd -Q
->compadd
untuk semua instance di_git
dangit-completion.bash
di folder/usr/local/Cellar/git/2.18.0/share/zsh/site-functions/
instalasi brit git saya. Terima kasih!!!