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-complete
próbuje użyć uzupełnienia napisanych dla pcomplete
ze standardowym interfejsie zakończenia, które ivy
domyś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-complete
zależ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-mode
uruchomione! Stąd hak.
(add-hook 'eshell-mode-hook '(lambda ()
należy go owinąć.