Làm thế nào zsh có thể được cấu hình để tự động hoàn thành tên thư mục với khớp camelcase?


9

Eclipse và Resharper có một cách tốt để điều hướng các tệp.

Nếu tôi có các thư mục (hoặc tệp) sau trong thư mục hiện tại của mình

MyReallyLongName
MyReallyLongAndFunName
MyReallyLongAndNotReallyFunName

Trong nhật thực tôi có thể điều hướng đến chúng bằng cách chỉ sử dụng các chữ cái viết hoa. Tương ứng trong zsh tôi muốn có thể gõ:

cd MRLAFN (Tab) (Enter)

Để vào MyReallyLongAndFunNametrong một bước

Nếu tôi muốn làm điều đó với zsh ngay bây giờ, tôi phải gõ My(Tab)Fun(Tab)(Enter)

Câu trả lời:


6

Điều này làm việc cho tôi:

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

Sau đó tôi có thể làm điều này trong một thư mục thử nghiệm:

touch MyReallyLongName MyReallyLongAndFunName MyReallyLongAndNotReallyFunName
ls MRLANRFN<TAB>
ls MyReallyLongAndNotReallyFunName

Tôi đã tổng hợp nó từ các mẹo trong Hướng dẫn sử dụng của Zshell .


Bạn có thể vui lòng mô tả nơi tôi phải đặt tiện ích mở rộng này (tệp, thư mục) không? Bạn cũng có thể quan tâm đến việc thêm nó vào dự án zsh-hoàn thành .
JJD

thêm nó vào ~ / .zshrc
Cody

Điều này không hoàn toàn hoạt động như mong đợi, với AbcAde AdFg HlAkAd, ls AA<TAB>hoàn thành Ad, trong khi tôi mong đợi AbcAde.
arekolek

@arekolek "Quảng cáo" là một phần hoàn thành. Nếu bạn nhấn TAB lần nữa (tùy thuộc vào cấu hình zsh của bạn), bạn sẽ thấy tất cả các tệp khớp. Nó nên bao gồm cả ba tập tin. Sau đó, bạn có thể chọn một với lựa chọn menu hoặc bằng cách nhập thêm một số tên tệp để hướng dẫn trình hoàn thành.
phord

@arekolek Xin lỗi - Tôi đọc nhầm. Tôi không chắc chắn làm thế nào bạn có được Ad từ đó. Tôi nghĩ rằng đó là một trận đấu mơ hồ một phần, nhưng thật khó để nói từ ví dụ của bạn. TAB thứ 2 có tạo ra kết quả nào nữa không?
phord

2

Tôi đã làm điều này để hoạt động "khá tốt" bằng cách thêm một tệp _camel_casevào cá nhân của tôi ~/.zsh/functions folder(lấy bất kỳ thư mục nào trong $fpathbiến của bạn ) với nội dung sau:

#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

Sau đó, tôi đã thêm dòng sau vào ~ / .zshrc

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

Lưu ý rằng đây có lẽ không phải là một giải pháp "tốt" vì tôi không có quá nhiều kiến ​​thức về hệ thống hoàn thành của zsh (chỉ có vài người thực sự có, tôi đoán vậy), nhưng nó thực hiện chính xác những gì bạn mô tả trong câu hỏi của bạn.


Điều này chỉ phần nào hoạt động .. mkdir AaBbCcDd cd ABCD (tab) => cd ./ tức là. Tự động hoàn thành thất bại
Rohit Manokaran
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.