zsh สามารถกำหนดค่าให้เป็นชื่อไดเรกทอรีเติมข้อความอัตโนมัติด้วยการจับคู่ camelcase ได้อย่างไร?


9

Eclipse และ Resharper มีวิธีการนำทางไฟล์ที่ดี

หากฉันมีโฟลเดอร์ (หรือไฟล์) ต่อไปนี้ในไดเรกทอรีปัจจุบันของฉัน

MyReallyLongName
MyReallyLongAndFunName
MyReallyLongAndNotReallyFunName

ใน eclipse ฉันสามารถนำทางไปยังพวกเขาโดยใช้ตัวอักษรตัวพิมพ์ใหญ่เท่านั้น ตามลําดับใน zsh ฉันต้องการที่จะพิมพ์:

cd MRLAFN (แท็บ) (Enter)

เพื่อเข้าสู่MyReallyLongAndFunNameขั้นตอนเดียว

ถ้าฉันต้องการทำกับ zsh ตอนนี้ฉันต้องพิมพ์ My(Tab)Fun(Tab)(Enter)

คำตอบ:


6

สิ่งนี้ใช้ได้กับฉัน:

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

จากนั้นฉันสามารถทำได้ในไดเรกทอรีทดสอบ:

touch MyReallyLongName MyReallyLongAndFunName MyReallyLongAndNotReallyFunName
ls MRLANRFN<TAB>
ls MyReallyLongAndNotReallyFunName

ผมปูด้วยหินมันเข้าด้วยกันจากเคล็ดลับในคู่มือการใช้งานของ Zshell


คุณช่วยอธิบายได้ไหมว่าฉันต้องวางส่วนขยายนี้ไว้ที่ใด (ไฟล์, โฟลเดอร์)? คุณอาจสนใจเพิ่มเข้าไปในโครงการzsh-completions
JJD

เพิ่มลงใน ~ / .zshrc ของคุณ
Cody

นี้ไม่ได้ค่อนข้างทำงานตามที่คาดด้วยAbcAde AdFg HlAkAd, ls AA<TAB>เสร็จสมบูรณ์ไปAdในขณะที่ผมคาดหวัง AbcAde
arekolek

@arekolek "Ad" เสร็จสมบูรณ์บางส่วน หากคุณกด TAB อีกครั้ง (ขึ้นอยู่กับการกำหนดค่า zsh ของคุณ) คุณจะเห็นไฟล์ทั้งหมดที่ตรงกัน ควรรวมทั้งสามไฟล์ จากนั้นคุณสามารถเลือกหนึ่งรายการด้วยการเลือกเมนูหรือโดยพิมพ์ชื่อไฟล์เพิ่มเติมเพื่อเป็นแนวทางในการคอมไพล์เตอร์
phord

@arekolek ขอโทษ - ฉันอ่านผิดนะ ฉันไม่แน่ใจว่าคุณได้รับโฆษณาจากที่นั่นได้อย่างไร ฉันคิดว่ามันเป็นการจับคู่ที่ไม่ชัดเจน แต่ก็ยากที่จะบอกจากตัวอย่างของคุณ แท็บที่ 2 ให้ผลลัพธ์มากกว่านี้หรือไม่
phord

2

ฉันได้รับการทำงาน "ค่อนข้างดี" โดยการเพิ่มไฟล์_camel_caseในส่วนบุคคลของฉัน~/.zsh/functions folder(ใช้โฟลเดอร์ใด ๆ ที่อยู่ใน$fpathตัวแปรของคุณ) ด้วยเนื้อหาต่อไปนี้:

#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

จากนั้นฉันเพิ่มบรรทัดต่อไปนี้ใน ~ / .zshrc

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

โปรดทราบว่านี่อาจไม่ใช่วิธีที่ "ดี" เนื่องจากฉันไม่มีความรู้มากเกินไปเกี่ยวกับระบบการเติมเต็มของ zsh (มีเพียงไม่กี่คนเท่านั้นที่ฉันคาดเดา) แต่มันทำสิ่งที่คุณอธิบายไว้ในคำถามของคุณ


มันใช้งานได้ค่อนข้างดี .. mkdir AaBbCcDd cd ABCD (แท็บ) => cd ./ ie การเติมข้อความอัตโนมัติล้มเหลว
Rohit Manokaran
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.