สร้างดัชนีการทำให้สมบูรณ์อัตโนมัติ (หรือสิ่งที่เรียกว่า) และไบนารีในแคช $ PATH ใน zsh


75

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

ฉันลองด้วยcompinitแต่ก็ไม่ได้ช่วย นอกจากนี้ยังมีวิธีที่ไม่ขึ้นกับเชลล์หรือไม่? ยินดีที่มีวิธีตรวจสอบคำตอบด้วย (ยกเว้นสำหรับการถอนการติดตั้งบางสิ่งและติดตั้งใหม่)

สิ่งที่ฉันหมายถึงคือหลังจากพิมพ์อักขระสองสามตัวของชื่อคำสั่งฉันสามารถกดTabและzshควรใช้ส่วนที่เหลือเพื่อดึงชื่อเต็ม


1
การเติมข้อมูลอัตโนมัติมีสองประเภทที่คุณอาจหมายถึงเมื่อคุณพูดว่าเชลล์ที่มีอยู่“ ไม่สามารถสร้างการเติมอัตโนมัติสำหรับ [คำสั่งใหม่]”:“ การเสร็จสิ้นคำสั่ง” - พยายามรับเชลล์เพื่อแนะนำชื่อคำสั่งใหม่เมื่อทำเสร็จ ในตำแหน่งคำสั่งและ“ การทำให้อาร์กิวเมนต์เสร็จสมบูรณ์” - พยายามรับเชลล์เพื่อแนะนำตัวเลือก / อาร์กิวเมนต์สำหรับคำสั่งใหม่เมื่อคุณพิมพ์ชื่อของมันแล้ว สิ่งใดที่ทำให้คุณมีปัญหา?
Chris Johnsen

1
คำถามที่ดี! ฉันแค่คิดเสมอว่ามันไม่สามารถทำได้ฉันไม่คิดว่าจะตรวจสอบ
Michael Mrozek

1
offtopic - ผู้คนไม่แน่นอน 4 คนได้รับความนิยม แต่เพียง 2 upvote ... ฉันคิดว่ามันแปลก ๆ ว่ามีเพียงไม่กี่คนที่สนับสนุนสิ่งต่างๆ
xenoterracide

@Chris ฉันหมายถึงหลังจากพิมพ์อักขระสองสามตัวของชื่อคำสั่งและแท็บกด zsh ควรทำส่วนที่เหลือและดึงชื่อเต็ม
phunehehe

@xeno ฉันก็สังเกตเห็นเช่นกัน มันค่อนข้างแปลกสำหรับบางสิ่งบางอย่างที่ชื่นชอบ แต่ไม่โหวตมัน
Michael Mrozek

คำตอบ:


76

ที่จะสร้างแคชของคำสั่งปฏิบัติการใช้หรือrehashhash -rf

ตรวจสอบให้แน่ใจว่าคุณไม่ได้ยกเลิกการตั้งค่าhash_list_allตัวเลือก (ทำให้การเข้าถึงดิสก์น้อยลง แต่ทำให้การอัพเดทแคชน้อยลง)

หากคุณไม่ต้องการพิมพ์คำสั่งคุณสามารถบอกให้ zsh ไม่ไว้วางใจแคชเมื่อดำเนินการเสร็จโดยใส่บรรทัดต่อไปนี้ใน~/.zshrc¹ ของคุณ:

zstyle ":completion:*:commands" rehash 1

มีค่าประสิทธิภาพ แต่ก็เล็กน้อยสำหรับการตั้งค่าเดสก์ท็อปทั่วไปในปัจจุบัน (ไม่ใช่ถ้าคุณมี$PATHใน NFS หรือระบบที่ติดดาวแรม)

zstyleคำสั่งตัวเองจะถูกบันทึกไว้ในzshmoduleหน้าคน ค่าสไตล์มีการบันทึกไว้ในzshcompsysและzshcompwidหน้าคนหรือคุณสามารถอ่านแหล่งที่มา (ที่นี่ของ_command_namesฟังก์ชั่น) หากคุณต้องการเอกสารที่สามารถอ่านได้…หากคุณพบบางอย่างแจ้งให้เราทราบ!

¹ ต้องการzsh≥4.3.3ขอบคุณChris Johnsen


3
คาถา rehash อย่างใดอย่างหนึ่งควรเปิดใช้งานคำสั่งชื่อ "คำสั่งใหม่" ในเปลือกที่ก่อนหน้านี้ถูกแฮชอย่างสมบูรณ์ การตั้งค่า PATH (หรือพา ธ ) จะทำให้เกิดการทำซ้ำ ดังนั้น PATH="$PATH"ก็จะทำงาน HASH_LIST_ALLแสดงเป็นค่าเริ่มต้นในเอกสารของฉัน
Chris Johnsen

นั่นคือคำตอบสำหรับฉัน
BaiJiFeiLong

13

หากคุณกำลังมีปัญหาในการรับ“ การเสร็จสิ้นการโต้แย้ง” ที่ทำงานให้กับคำสั่งใหม่การคำนวณอาจเป็นคำสั่งที่คุณต้องการอย่างไรก็ตามมันมีกลไกการแคชที่อาจทำให้เกิดปัญหาของคุณ

เอกสารประกอบสำหรับเวอร์ชันของฉัน (4.3.10) บอกว่าcompinitใช้แคชไฟล์ "ดัมพ์" .zcompdumpเพื่อจัดเก็บฟังก์ชั่นเสร็จสิ้นการคอมไพล์เพื่อเร่งการเรียกใช้ครั้งต่อไป ซึ่งจะยกเลิกการใช้งานไฟล์ดัมพ์เฉพาะเมื่อแจ้งการเปลี่ยนแปลงจำนวนไฟล์ที่เสร็จสมบูรณ์ ( fpathไฟล์องค์ประกอบที่ขึ้นต้นด้วย#compdef …หรือ#autoload …) การติดตั้งซอฟต์แวร์ใหม่น่าจะเปลี่ยนจำนวนไฟล์ที่เสร็จสมบูรณ์ (สมมติว่ามันยังติดตั้งไฟล์zsh auto-complete ในตำแหน่งที่ถูกต้อง) ดังนั้นฉันคาดว่าธรรมดาcompinitจะทำงาน หากคุณอยู่ในสถานการณ์ที่ไม่สามารถใช้งานได้คุณอาจต้องข้ามหรือทำให้แฟ้มการถ่ายโอนข้อมูลเป็นโมฆะด้วยตนเอง

หากต้องการข้ามโดยใช้ไฟล์ดัมพ์ให้ใช้compinit -D; สิ่งนี้จะมีผลกับเชลล์ปัจจุบันเท่านั้น

หากต้องการสร้างไฟล์ดัมพ์อีกครั้งให้ลบออกแล้วรันใหม่อีกครั้งcompinit:

rm -i ${ZDOTDIR:-${HOME:?No ZDOTDIR or HOME}}/.zcompdump &&
compinit

สิ่งนี้จะส่งผลกระทบต่อเชลล์ปัจจุบัน, เชลล์ที่มีอยู่ซึ่งรันแบบธรรมดาcompinitและเชลล์ใด ๆ ในอนาคต


เฟรมเวิร์ก zsh บางตัวzimอนุญาตให้ใช้ไฟล์ดัมพ์ต่อโฮสต์ ในกรณีที่ยังเอาร่วมกับ$zcompdump_file .zcompdump
เซบาสเตียน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.