Я нашел то , что , кажется, работает нормально при первоначальном тестировании: по существу Пересвяжите <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, как предложено выше, вы должны поместить это в файл инициализации:
(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 ()
нужно обернуть вокруг него.