ฉันจะตั้งค่า eshell ให้ใช้ ivy เพื่อให้แท็บสมบูรณ์ได้อย่างไร


16

ผมชอบมากivyสำหรับความสำเร็จและความรักที่เรียบง่าย(ivy-mode 1)พอที่จะได้รับivyเกือบทุกที่ที่ Emacs ใช้การเรียงลำดับของความสำเร็จบางคน (ที่ acomplished โดยเอาชนะcompleteing-readผมเชื่อว่า) แต่นี่ไม่ได้ตั้งค่าeshellเพื่อใช้ivyสำหรับการเติมแท็บให้สมบูรณ์ ฉันชอบeshellรายการผู้สมัครที่สำเร็จ แต่ต้องการให้ivyUI เลือกจากพวกเขา มีวิธีที่จะนำสิ่งที่eshellทำไปใช้เพื่อผลิตตัวเลือกที่สมบูรณ์และส่งมอบให้กับ 'ivy' หรือไม่?

คำตอบ:


11

สิ่งนี้จะทำงานได้ดี:

(define-key eshell-mode-map (kbd "<tab>") 'completion-at-point)

ฉันไม่รู้ว่าทำไมข้างต้นไม่ใช่ค่าเริ่มต้น แต่ฉันใช้เท่านั้นshell-modeและterm-modeต่อไป


3
คุณควรเพิ่มที่(add-hook 'eshell-mode-hook '(lambda ()จำเป็นต้องล้อมรอบมัน
Timm

ขอบคุณนั่นเป็นเรื่องเล็กน้อยกว่าสิ่งที่ฉันมี เหตุผลที่ไม่ใช่ค่าเริ่มต้นอาจเป็นเพราะบางคนในอดีตชอบpcompleteมากกว่า UI ที่สมบูรณ์แบบมาตรฐาน
โอมาร์

6

ฉันพบบางสิ่งที่ดูเหมือนว่าจะทำงานได้ดีเมื่อทำการทดสอบเริ่มต้น: โดยหลักแล้ว<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ทำงานเสร็จ! ดังนั้นเบ็ด


นอกจากนี้ฉันยังไม่ได้ทดสอบ แต่ฉันเดาว่าถ้าhelmยังไม่ได้บอกวิธีeshellแก้ไขปัญหาให้กับแท็บการแก้ไขนี้ก็มีผลhelmเช่นกัน
โอมาร์

มันค่อนข้างเรียบร้อย :) ขอบคุณสำหรับคำแนะนำ
Chakravarthy Raghunandan

นั่น“ สิ่งที่เขาจะทำ!?” ความคิดเห็นทำให้วันของฉัน :) นอกจากนี้ฉันต้องการที่จะทราบว่าสิ่งนี้ควรใช้กับกรอบการทำงานอื่น ๆ เช่นหางเสือ
GergelyPolonkai
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.