ฉันกำลังจะตอบคำถามเท่านั้น (1)
ปัญหาของคุณคือ KEYTIMEOUT ฉันพูดจาก zshzle (1):
เมื่อ ZLE กำลังอ่านคำสั่งจากเทอร์มินัลมันอาจอ่านลำดับที่ถูกผูกไว้กับบางคำสั่งและยังเป็นคำนำหน้าของสตริงที่ถูกผูกไว้อีกต่อไป ในกรณีนี้ ZLE จะรอสักครู่เพื่อดูว่ามีการพิมพ์อักขระเพิ่มเติมหรือไม่และ (หรือไม่ตรงกับสตริงอื่น ๆ ) จะดำเนินการเชื่อมโยง การหมดเวลานี้กำหนดโดยพารามิเตอร์ KEYTIMEOUT ค่าเริ่มต้นคือ 0.4 วินาที ไม่มีการหมดเวลาหากสตริงส่วนนำหน้าไม่ถูกผูกเข้ากับคำสั่ง
นั่นคือความล่าช้าที่คุณประสบหลังจากกดปุ่ม ESC 0.4 วินาที การแก้ไขคือการตั้งค่า KEYTIMEOUT ลงไปที่ 0.01s ในหนึ่งในไฟล์เริ่มต้นเชลล์:
export KEYTIMEOUT=1
น่าเสียดายที่สิ่งนี้มีผลกระทบแบบน็อคออน: สิ่งอื่น ๆ เริ่มผิดพลาด ...
ประการแรกตอนนี้มีปัญหาในโหมดคำสั่ง vi: การพิมพ์ ESC ทำให้เคอร์เซอร์ค้างและจากนั้นอักขระใดก็ตามที่คุณพิมพ์ต่อไปจะถูกกลืน นี่เป็นเพราะ ESC ไม่ได้ถูกผูกไว้กับสิ่งใดโดยปริยายในโหมดคำสั่ง vi แต่มีวิดเจ็ตหลายตัวที่ขึ้นต้นด้วย ESC (ปุ่มลูกศร!) ดังนั้นเมื่อคุณกดปุ่ม ESC ZLE จะรอตัวละครตัวต่อไปแล้วกินมัน
การแก้ไขคือการผูก ESC กับบางสิ่งในโหมดคำสั่งดังนั้นจึงมั่นใจได้ว่าสิ่งที่ได้รับผ่านไปยัง ZLE หลังจาก $ KEYTIMEOUT centiseconds ตอนนี้เราสามารถทำการผูกให้เริ่มต้นด้วย ESC ในโหมดคำสั่งโดยไม่มีผลกระทบที่เลวร้ายเหล่านี้ ฉันผูก ESC กับตัวละครระฆังซึ่งฉันคิดว่าน่ารำคาญน้อยกว่าการใส่ตัวเอง (และกระสุนของฉันเงียบ):
bindkey -sM vicmd '^[' '^G'
อัปเดต 2017:
ฉันได้พบวิธีที่ดียิ่งขึ้นสำหรับการผูก ESC - undefined-key
วิดเจ็ต ฉันไม่แน่ใจว่าวิดเจ็ตนี้มีให้ใน zsh หรือไม่เมื่อฉันเขียนคำตอบนี้
bindkey -M vicmd '^[' undefined-key
ปัญหาถัดไป: โดยปกติแล้ววิดเจ็ตสองปุ่มบางตัวจะเริ่มใน ^ X ในโหมดแทรก vi สิ่งเหล่านี้ใช้ไม่ได้หาก $ KEYTIMEOUT ตั้งค่าจนสุด สิ่งที่ฉันทำคือยกเลิกการผูก ^ X ในโหมดแทรก vi (มันแทรกตัวเองตามค่าเริ่มต้น); สิ่งนี้อนุญาตให้วิดเจ็ตสองคีย์เหล่านั้นทำงานต่อไปได้
bindkey -rM viins '^X'
คุณสูญเสียการผูกสำหรับการแทรกตัวเอง แต่คุณสามารถผูกไว้กับสิ่งอื่นได้แน่นอน (ฉันไม่ได้เนื่องจากฉันไม่ได้ใช้มัน)
ปัญหาล่าสุด (ฉันได้พบจนถึง): มีการผูกคีย์เริ่มต้นที่เหลืออยู่ที่เรา "เสีย" เนื่องจากการตั้งค่า $ KEYTIMEOUT ขวาลงเพื่อปัญญา: ผู้ที่เริ่มต้นด้วย ESC ในโหมดแทรก vi ซึ่งไม่ใช่ปุ่มเคอร์เซอร์ โดยส่วนตัวแล้วพวกเขาจะเริ่มต้นด้วย ^ X แทน:
bindkey -M viins '^X,' _history-complete-newer \
'^X/' _history-complete-older \
'^X`' _bash_complete-word
อัปเดต 2018:
ปรากฎว่าส่วนทั้งหมดข้างต้น (หลังจาก“ อัปเดต 2017”) ไม่จำเป็นต้องมี เป็นไปได้ที่จะตั้งค่าปุ่ม META ให้เทียบเท่ากับ ESC ในการจับคู่แป้นพิมพ์โดยใช้:
bindkey -mv
ดังนั้นจึงเป็นไปไม่ได้จะยกเลิกการผูก ^ X และเข้าถึงการเชื่อมโยงคีย์ที่เริ่มต้นใน ESC โดยการกด META ในฐานะผู้นำแทน (ALT หรือ OPT บนแป้นพิมพ์ที่ทันสมัย)
หากคุณมีสิทธิ์เข้าถึงหนังสือจาก Bash ถึง Z Shellโดย Kiddle et al. ความสมดุลของ ESC และ META ใน keybindings ถูกกล่าวถึงในบทที่ 4 แถบด้านข้างในหน้า 78–79
i
สองครั้งเพื่อกลับไปที่โหมดแทรกฉันจะขอแนะนำการแก้ไขนี้ !