Я знайшов те , що , здається, працює нормально при первинному тестуванні: по суті Пересвяжіте <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>окрім кінця рядка введення. Я ще не бачив другої проблемної поверхні.
EDIT: Для тих, хто не знайомий з примхами eshell (це евфемізм), можливо, я повинен додати, що для повторного введення ключа eshell, як було запропоновано вище, ви повинні помістити це у свій файл init:
(add-hook 'eshell-mode-hook
(lambda ()
(define-key eshell-mode-map (kbd "<tab>")
(lambda () (interactive) (pcomplete-std-complete)))))
Перш ніж ви будете кричати на мене за марнотратну прив'язку клавіш у гачку, дозвольте мені пояснити, що eshell оголошує свою ключову карту, (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 ()його потрібно обернути навколо.