ฉันพบบางสิ่งที่ดูเหมือนว่าจะทำงานได้ดีเมื่อทำการทดสอบเริ่มต้น: โดยหลักแล้ว<tab>
จะย้อนกลับpcomplete-std-complete
แต่เนื่องจากฟังก์ชั่นนั้นไม่ได้มีการโต้ตอบด้วยเหตุผลบางอย่างคุณต้องปิดมัน:
(define-key eshell-mode-map (kbd "<tab>")
(lambda () (interactive) (pcomplete-std-complete)))
ความpcompete-std-complete
พยายามที่จะใช้ความสำเร็จที่เขียนpcomplete
ด้วย UI ความสมบูรณ์มาตรฐานซึ่งivy
โดยค่าเริ่มต้นจะแทนที่ (ด้วยการอัปเดตล่าสุดพวกเขาจะปรากฏในการซ้อนทับที่ดีในบัฟเฟอร์ eshell ใกล้กับจุด!)
ความคิดเห็นในซอร์สโค้ดของpcomplete-completions-at-point
(ซึ่งpcomplete-std-complete
ขึ้นอยู่กับ) พูดถึงปัญหาที่อาจเกิดขึ้นสองสามประการ:
;; FIXME: it only completes the text before point, whereas the
;; standard UI may also consider text after point.
;; FIXME: the `pcomplete' UI may be used internally during
;; pcomplete-completions and then throw to `pcompleted', thus
;; imposing the pcomplete UI over the standard UI.
ฉันคิดว่าคนแรกจะไม่ส่งผลกระทบต่อฉันเนื่องจากฉันไม่คิดว่าฉันจะกด<tab>
ยกเว้นที่ส่วนท้ายของบรรทัดอินพุต ฉันไม่ได้เห็นพื้นผิวปัญหาที่สองเช่นกันจนถึงตอนนี้
แก้ไข: สำหรับผู้ที่ไม่คุ้นเคยกับนิสัยใจคอของ eshell (นี่คือถ้อยคำที่ไพเราะ) บางทีฉันควรจะเพิ่มสิ่งนั้นลงในการตีกุญแจของ eshell ตามที่แนะนำข้างต้นคุณควรใส่มันลงในไฟล์ init ของคุณ:
(add-hook 'eshell-mode-hook
(lambda ()
(define-key eshell-mode-map (kbd "<tab>")
(lambda () (interactive) (pcomplete-std-complete)))))
ก่อนที่คุณจะตะโกนใส่ฉันสำหรับสิ่งกีดขวางปุ่มลัดที่สิ้นเปลืองขอให้ฉันอธิบายว่า eshell ประกาศ keymap ด้วย(defvar eshell-mode-map nil)
แล้วทำ(setq-local eshell-mode-map (sparse-keymap))
ข้างในeshell-mode
! (รหัสมีประโยชน์;; FIXME: What the hell!?
) หมายความว่าคุณไม่สามารถเชื่อมโยงคีย์ใหม่ได้จนกว่าจะeshell-mode
ทำงานเสร็จ! ดังนั้นเบ็ด
(add-hook 'eshell-mode-hook '(lambda ()
จำเป็นต้องล้อมรอบมัน