Jak skonfigurować eshell do używania bluszczu do uzupełniania tabulatorów?

16

Bardzo przepadam ivyza ukończeniem i uwielbiam to, że proste (ivy-mode 1)wystarczy, aby dostać się ivyprawie wszędzie, gdzie Emacs używa pewnego rodzaju uzupełnienia (to completeing-read, jak sądzę , osiąga się przez zastąpienie ). Ale nie można eshelltego użyć ivydo uzupełniania tabulatorów. Podoba mi się eshelllista kandydatów do ukończenia, ale wolę wybrać ivyinterfejs użytkownika spośród nich. Czy jest jakiś sposób na ponowne wykorzystanie tego, co eshellrobi, aby wyprodukować kandydatów do ukończenia i przekazać to do `bluszczu?

Omar
źródło

Odpowiedzi:

11

To powinno działać dobrze:

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

Nie wiem, dlaczego powyższe nie jest domyślne. Ale używam tylko shell-modei term-modetak.

abo-abo
źródło
3
Prawdopodobnie powinieneś dodać, że (add-hook 'eshell-mode-hook '(lambda ()należy go owinąć.
Timm,
Dzięki, to trochę fajniejsze niż to, co miałem. Powodem, dla którego nie jest to ustawienie domyślne, jest prawdopodobnie fakt, że ktoś w przeszłości preferował pcompletestandardowy interfejs użytkownika uzupełniania.
Omar,
6

Znalazłem coś, co wydaje się działać poprawnie po początkowych testach: zasadniczo powiąż <tab>ponownie pcomplete-std-complete, ale ponieważ ta funkcja nie jest interaktywna z jakiegoś powodu, musisz ją zawinąć:

(define-key eshell-mode-map (kbd "<tab>")
  (lambda () (interactive) (pcomplete-std-complete)))

W pcompete-std-completepróbuje użyć uzupełnienia napisanych dla pcompleteze standardowym interfejsie zakończenia, które ivydomyślnie będą stałe (z bardzo niedawnej aktualizacji, pojawiają się one w prawej ładny nakładki w eshell bufor niedaleko punktu!).

Komentarze w kodzie źródłowym pcomplete-completions-at-point(w pcomplete-std-completezależności od) wspominają kilka potencjalnych problemów:

;; 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.

Myślę, że pierwszy nie wpłynie na mnie, ponieważ wydaje mi się, że nigdy nie naciskam, <tab>chyba że na końcu linii wejściowej. Do tej pory nie widziałem też drugiego problemu.

EDYCJA: Dla tych, którzy nie są zaznajomieni z dziwactwami eshell (jest to eufemizm), może powinienem dodać to, aby ponownie powiązać klucz eshell, jak sugerowano powyżej, należy umieścić to w pliku init:

(add-hook 'eshell-mode-hook
  (lambda () 
    (define-key eshell-mode-map (kbd "<tab>")
      (lambda () (interactive) (pcomplete-std-complete)))))

Zanim zaczniesz na mnie krzyczeć za marnotrawstwo antipatternu w skrótach klawiszowych, pozwól mi wyjaśnić, że eshell deklaruje swoją mapę klawiszy, (defvar eshell-mode-map nil)a następnie robi to w (setq-local eshell-mode-map (sparse-keymap))środku eshell-mode! (Kod jest pomocny ;; FIXME: What the hell!?.) Oznacza to, że nie można ponownie powiązać kluczy, dopóki nie zostaną eshell-modeuruchomione! Stąd hak.

Omar
źródło
Ponadto nie przetestowałem go, ale zgaduję, że jeśli helmnie uda mu się już wcisnąć klawisza do eshelluzupełnienia tabulacji, ta poprawka dotyczy również helm.
Omar
To jest całkiem fajne :) Dzięki za podpowiedź
Chakravarthy Raghunandan
Ten komentarz „Co on będzie !?” sprawił, że mój dzień :) Chciałbym również zauważyć, że powinno to również działać w przypadku innych struktur ukończenia, takich jak ster.
GergelyPolonkai