Pelengkapan tab Zsh tidak berfungsi seperti yang diinginkan untuk jalur parsial

17

Saya ingin kasus-sensitif selesai kabur untuk file dan direktori di zsh. Setelah membaca manual selama beberapa jam, inilah yang saya dapatkan:

zstyle ':completion:*:*:*:*:globbed-files' matcher 'r:|?=** m:{a-z\-}={A-Z\_}'
zstyle ':completion:*:*:*:*:local-directories' matcher 'r:|?=** m:{a-z\-}={A-Z\_}'
zstyle ':completion:*:*:*:*:directories' matcher 'r:|?=** m:{a-z\-}={A-Z\_}'

Selain itu, saya ingin menekan TABsekali untuk menampilkan kemungkinan penyelesaian, hanya memodifikasi apa yang telah saya ketik jika ada satu penyelesaian. Kemudian menekan TABkedua kalinya harus menempatkan saya ke mode "penyelesaian menu". Berdasarkan manual, saya datang dengan ini:

zstyle ':completion:*' menu select

Sekarang semuanya berjalan sebagaimana mestinya kecuali dalam satu keadaan. Saya memiliki dua folder Desktopdan .rstudio-desktopdi direktori home saya. Karena sudah setopt globdots, saya berharap mengetik yang berikut ini:

$ cd ~/dktop<TAB>

untuk meninggalkan perintah saya seperti yang dimasukkan, dan ditampilkan sebagai kandidat penyelesaian Desktopdan .rstudio-desktop. Alih-alih, itu dihapus dktop , meninggalkan saya dengan yang berikut:

$ cd ~/

Saya telah melihat semua manual, panduan, pertanyaan Stack Exchange yang relevan, dan berbagai sumber lainnya. Tapi apa pun yang saya lakukan, saya tidak bisa membuat ini berhasil.

Menariknya, jika saya berada di direktori home dan ketik yang berikut ini maka semuanya berfungsi seperti yang diharapkan:

$ cd dktop<TAB>

Artinya, ini hanya masalah dengan segmen jalur yang tidak mengarah (dan Anda dapat melihat C-x hbahwa ini terkait dengan directoriestag daripada local-directoriestag yang digunakan).

Untuk kemudahan reproduksi, berikut adalah ~/.zshrcyang akan mereproduksi situasi dan perilaku yang dijelaskan di atas (diuji pada mesin virtual El Capitan dengan zshdari Homebrew).

Radon Rosborough
sumber
Tidak dapat mereproduksi zsh 5.3.1pada Arch Linux. cd ~/dktop<tab>hasil panen cd ~/Desktop.
PythonNut
@PythonNut Dengan zsh 5.3.1pada OS X masalah tidak mereproduksi. Sangat menarik bahwa ada perbedaan antara sistem operasi.
Radon Rosborough
1
@PythonNut Sebenarnya, saya bertaruh ini karena Linux peka huruf besar kecil dan macOS peka huruf besar kecil.
Radon Rosborough
Sama seperti pengingat ramah tidak semua Mac / macOS adalah case-insensitive tergantung pada apakah disk Anda diformat case-insensitive atau tidak.
konqui

Jawaban:

1

Salah satu solusi yang mungkin dilakukan adalah:

bindkey "^I" expand-word

Ini akan menyebabkan tab meluas ~/ke jalur absolut.

Ninja Sembelit
sumber
Mungkin saya melewatkan sesuatu, tapi saya tidak melihat bagaimana ini berhubungan dengan penyelesaian tab fuzzy, atau untuk memecahkan masalah yang diuraikan di atas. Jika saya melakukan apa yang Anda sarankan, maka menekan TAB akan memberi saya cd /Users/raxod502/dktop, dan penyelesaian dinonaktifkan.
Radon Rosborough
@RadonRosborough Harapannya adalah dengan memperluas ~/ke jalur absolutnya, penyelesaian fuzzy akan mulai bekerja. Rasanya seperti salah satu kasus di mana masalahnya adalah ia mengevaluasi sekali, tetapi Anda benar-benar membutuhkannya untuk mengevaluasi dua kali untuk bekerja, sehingga memiliki jalur absolut alih-alih ~/berarti kembali ke hanya membutuhkan satu evaluasi. Tapi omong kosong, aku minta maaf, aku lupa bahwa bindkey menggantikan bindings yang lama, dan aku tidak dapat menemukan apa pun yang mengatakan jika bahkan memungkinkan untuk mengikat dua fungsi menjadi satu kunci. Tanpa bindkey saya, apakah penyelesaian Anda berfungsi sebagaimana dimaksud saat diberikan jalur absolut?
ConstipatedNinja
Tidak. Tidak ada bedanya apakah jalur inputnya ~/dktopatau /Users/raxod502/dktop; hasilnya adalah sama, yaitu bahwa dktopdihapus ketika saya menekan TAB.
Radon Rosborough