Как настроить eshell для использования плюща для завершения вкладки?

16

Я очень люблю ivyдополнения и люблю, что простого (ivy-mode 1)достаточно, чтобы получить ivyпочти везде, где Emacs использует какое-то завершение ( completeing-readя полагаю, что это достигается путем переопределения ). Но это не настройка eshellдля использования ivyдля завершения вкладки. Мне нравится eshellсписок кандидатов на завершение, но я бы предпочел, чтобы ivyпользовательский интерфейс выбирал среди них. Есть ли какой-то способ повторно использовать все, что eshellнужно для получения кандидатов на завершение и передачи их «плющу»?

Омар
источник

Ответы:

11

Это должно работать нормально:

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

Я не знаю, почему выше не по умолчанию. Но я пользуюсь только shell-modeи в term-modeлюбом случае.

Або-або
источник
3
Вы, вероятно, должны добавить, что его (add-hook 'eshell-mode-hook '(lambda ()нужно обернуть вокруг него.
Тим
Спасибо, это немного аккуратнее, чем у меня было. Вероятно, причина этого не в том, что кто-то в прошлом предпочитал pcompleteстандартный интерфейс завершения.
Омар
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, как предложено выше, вы должны поместить это в файл инициализации:

(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запустите! Отсюда и крюк.

Омар
источник
Кроме того, я не проверял это, но я предполагаю, что, если он helmеще не указывает на eshellзавершение табуляции, это исправление также применимо к helm.
Омар
Это довольно аккуратно :) Спасибо за совет
Chakravarthy Raghunandan
Этот комментарий «Что он будет !?» сделал мой день :) Кроме того, я хотел бы отметить, что это должно работать и для других фреймворков завершения, таких как helm.
GergelyPolonkai