zsh เสร็จสมบูรณ์สำหรับ executables ทั้งหมดในเส้นทาง


0

ฉันได้เขียนสคริปต์ที่ตัวเองใช้เป็นอาร์กิวเมนต์ใด ๆ ที่ปฏิบัติการโดยพลการใน $ PATH ของฉัน มีวิธีการสร้างฟังก์ชั่นเสร็จสมบูรณ์ของ zsh (หรือ bash) ที่ฉันจะพิมพ์ myFunc to[Tab] และมันก็จะสมบูรณ์ myFunc top ตัวอย่างเช่น? การเลือกเฉพาะไฟล์ที่มีสิทธิ์อนุญาตให้ใช้งานจะดีกว่า แต่การมีไฟล์ใด ๆ และทุกไฟล์ใน $ PATH จะมีประโยชน์มากกว่า

ฉันไม่สามารถจินตนาการได้ว่าระบบจะมีความสำคัญ แต่จะทำงานบน Linux, BSD และ Mac

ขอบคุณ!

คำตอบ:


2

zsh มีฟังก์ชั่นที่สมบูรณ์สำหรับคำสั่งใน PATH ชื่อ _path_commands. คุณสามารถกำหนดค่าความสมบูรณ์ที่จะใช้สำหรับ myFunc โดยวิ่ง:

compdef _path_commands myFunc

บันทึก: สิ่งนี้ต้องการให้ ระบบเสร็จสิ้น zsh ที่จะเริ่มต้น โดยปกติ (ตามที่ตั้งค่าโดย compinstall ) สิ่งนี้เกิดขึ้นในของคุณ ~/.zshrc กับ

# some zstyle configurations

autoload -Uz compinit
compinit

มีสายเข้า compdef ต้องทำหลังจาก compinit. หากคุณได้รับข้อผิดพลาด "ไม่พบคำสั่ง" เมื่อเรียกใช้ compdefฉันขอแนะนำให้ติดตั้งระบบเสร็จ compinstall.

บันทึก: เพื่อความปลอดภัย zsh จะโยนข้อผิดพลาดหากไดเรกทอรีใน $ path ของคุณเขียนได้ทั่วโลก หากคุณได้รับข้อผิดพลาด:

zsh compinit: ไดเรกทอรีที่ไม่ปลอดภัยรัน compaudit เพื่อดูรายการ ไม่สนใจ   ไดเรกทอรีที่ไม่ปลอดภัยและดำเนินการต่อ [y] หรือยกเลิก compinit [n]?

อย่าเพียงแค่กด y แต่กด n แล้วลอง compaudit | xargs chmod g-w ตามที่แนะนำไว้ที่ https://stackoverflow.com/questions/13762280/zsh-compinit-insecure-directories


ที่ดี! ขอบคุณ! มันทำงานได้อย่างสมบูรณ์แบบ ฉันเห็นด้วยเช่นกันว่าบางคนใช้ไดเรกทอรี "ความสำเร็จ" เพื่อจัดเก็บการวิเคราะห์พฤติกรรมที่สมบูรณ์ สิ่งนี้เข้ากันได้กับกระบวนทัศน์นั้นหรือไม่? หากมีการเพิ่มความสำเร็จที่ซับซ้อนมากขึ้นพวกเขามักจะออกจาก. zshrc ขอบคุณอีกครั้ง!
ebrious

ฉันลบแท็กคำตอบที่ยอมรับเพราะใน linux (แต่อยากรู้อยากเห็นไม่พอบน Mac) พยายามทำฟังก์ชั่นที่ไม่ใช่ myFunc ให้ผลข้อผิดพลาด "_complete: 96: นิพจน์ทางคณิตศาสตร์ไม่ดี: ตัวถูกดำเนินการที่คาดไว้ที่` '" ls [Tab] จะให้ข้อผิดพลาดนี้
ebrious

ฉันทดสอบบน Linux อูบุนตู 14.04 กับ zsh 5.0.5, Arch Linux กับ zsh 5.0.6 และตอนนี้ได้ TomatoUSB กับ zsh 4.3.17 (เฟิร์มแวร์เราเตอร์สำรองที่มี ddwrt optware จาก nslu2) ด้วยการกำหนดค่าของฉันเองเช่นเดียวกับไม่มีการกำหนดค่า ( zsh -f ) มันทำงานได้ดีในทุกกรณีโดยไม่ทำลายความสำเร็จอื่น ๆ ฉันขอแนะนำว่ามีบางอย่างผิดปกติ zsh บนเครื่อง Linux ของคุณทั้งการกำหนดค่าหรือในแพ็คเกจที่ติดตั้ง ทุกอย่างทำงานบน Linux ของคุณหรือไม่ถ้าคุณเพิ่งออกไป compdef _path_commands myFunc?
Adaephon

ฉันจะยอมรับคำตอบของคุณอีกครั้งเมื่อพบการเปลี่ยนแปลงที่จำเป็นเพื่อให้มันทำงานได้ การตั้งค่า zsh เฉพาะของฉันมีบางไดเรกทอรีใน fpath ที่มีสิทธิ์ในการเขียนซึ่งส่งผลให้เกิดข้อผิดพลาด: "zsh compinit: ไดเรกทอรีที่ไม่ปลอดภัยเรียกใช้การตรวจสอบรายการ เพียงกดปุ่มผลลัพธ์ 'y' ในปัญหาที่ฉันมีกับคำตอบของคุณ เรียกใช้ "compaudit | xargs chmod g-w" ตามที่แนะนำโดย stackoverflow.com/questions/13762280/solved ปัญหา. ฉันขอแนะนำให้แก้ไขคำตอบของคุณให้มีความเป็นไปได้ / วิธีแก้ปัญหานี้หรือ
ebrious
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.