Як я можу налаштувати 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>окрім кінця рядка введення. Я ще не бачив другої проблемної поверхні.

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запуску! Звідси гачок.


Крім того, я не перевіряв його, але я б припустив, що якщо helmвін ще не придумає свій шлях до eshellзаповнення вкладки, це виправлення також стосується helm.
Омар

Це досить охайно :) Дякую за підказку
Chakravarthy Raghunandan

Цей коментар "Що він буде!" Зробив у мене в день :) Крім того, я хотів би зазначити, що це також повинно працювати для інших систем завершення, наприклад, керма.
GergelyPolonkai
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.