Bagaimana zsh dapat dikonfigurasi untuk nama direktori pelengkapan otomatis dengan pencocokan camelcase?

9

Eclipse dan Resharper memiliki cara yang baik untuk menavigasi file.

Jika saya memiliki folder (atau file) berikut di direktori saya saat ini

MyReallyLongName
MyReallyLongAndFunName
MyReallyLongAndNotReallyFunName

Dalam gerhana saya dapat menavigasi ke mereka dengan hanya menggunakan huruf kapital. Sejalan di zsh saya ingin dapat mengetik:

cd MRLAFN (Tab) (Enter)

Untuk masuk ke MyReallyLongAndFunNamedalam satu langkah

Jika saya ingin melakukannya dengan zsh sekarang, saya harus mengetik My(Tab)Fun(Tab)(Enter)

Rohit Manokaran
sumber

Jawaban:

6

Ini bekerja untuk saya:

zstyle ':completion:*' matcher-list 'r:[^A-Z0-9]||[A-Z0-9]=** r:|=*' 

Maka saya bisa melakukan ini di direktori tes:

touch MyReallyLongName MyReallyLongAndFunName MyReallyLongAndNotReallyFunName
ls MRLANRFN<TAB>
ls MyReallyLongAndNotReallyFunName

Saya menggabungkannya dari tips dalam Panduan Pengguna Zshell .

phord
sumber
Bisakah Anda jelaskan di mana saya harus meletakkan ekstensi ini (file, folder)? Anda mungkin juga tertarik untuk menambahkannya ke proyek penyelesaian zsh .
JJD
tambahkan ke ~ / .zshrc
Cody
Ini tidak bekerja seperti yang diharapkan, dengan AbcAde AdFg HlAkAd, ls AA<TAB>selesai Ad, sementara saya harapkan AbcAde.
arekolek
@arekolek "Iklan" adalah penyelesaian sebagian. Jika Anda menekan TAB lagi (tergantung pada konfigurasi zsh Anda), Anda akan melihat semua file yang cocok. Itu harus mencakup ketiga file. Kemudian Anda dapat memilih satu dengan pilihan menu atau dengan mengetik beberapa nama file lagi untuk memandu pelengkap.
phord
@arekolek Maaf - Saya salah baca. Saya tidak yakin bagaimana cara Anda mendapatkan Iklan dari sana. Saya pikir ini adalah pertandingan yang ambigu sebagian, tetapi sulit untuk mengatakannya dari contoh Anda. Apakah TAB ke-2 menghasilkan lebih banyak hasil?
phord
2

Saya mendapatkan ini berfungsi "cukup baik" dengan menambahkan file _camel_caseke pribadi saya ~/.zsh/functions folder(ambil folder apa pun yang ada dalam $fpathvariabel Anda ) dengan konten berikut:

#autoload

[[ -z "$PREFIX" ]] && return 1

relpath=$(dirname $PREFIX)

[[ -e $relpath ]] || return 1

files=$(ls $relpath)

regex=$(echo $(basename $PREFIX) | sed -e 's/\([A-Z][^A-Z]*\)/\1[^A-Z]+/g')

correctedfiles=($(echo $files | grep -P $regex | sed -e :a -e '$!N;s/\n/ /;ta'))

results=($(for file in $correctedfiles; do echo "$relpath/$file"; done))

compadd -U -f -- $results

Kemudian, saya menambahkan baris berikut ke ~ / .zshrc saya

zstyle ':completion:*' completer _complete _correct _path_files _camel_case

Perhatikan bahwa ini kemungkinan besar bukan solusi "baik" karena saya tidak memiliki terlalu banyak pengetahuan tentang sistem penyelesaian zsh (hanya beberapa orang yang benar-benar memilikinya, saya kira), tetapi ia melakukan persis seperti yang Anda jelaskan dalam pertanyaan Anda.

tobi_p
sumber
Ini hanya berfungsi .. mkdir AaBbCcDd cd ABCD (tab) => cd ./ ie. Autocomplete gagal
Rohit Manokaran