Comment puis-je configurer eshell pour utiliser ivy pour la complétion des onglets?

16

J'aime beaucoup l' ivyachèvement et j'adore le fait qu'un simple (ivy-mode 1)suffit pour obtenir ivypresque partout qu'Emacs utilise une sorte d'achèvement (qui est accompli en remplaçant completeing-read, je crois). Mais cela ne configure pas eshellà utiliser ivypour l'achèvement de l'onglet. J'aime eshellla liste des candidats à l'achèvement, mais je préférerais que l' ivyinterface utilisateur les choisisse. Existe-t-il un moyen de réutiliser quoi eshellque ce soit pour produire des candidats à l'achèvement et de les remettre au lierre?

Omar
la source

Réponses:

11

Cela devrait fonctionner correctement:

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

Je ne sais pas pourquoi ce qui précède n'est pas la valeur par défaut. Mais j'utilise seulement shell-modeet de term-modetoute façon.

abo-abo
la source
3
Vous devriez probablement ajouter ce qui (add-hook 'eshell-mode-hook '(lambda ()doit être enroulé autour de lui.
Timm
Merci, c'est un peu plus net que ce que j'avais. La raison pour laquelle ce n'est pas la valeur par défaut est probablement que quelqu'un à un moment donné dans le passé a préféré pcompletel'interface utilisateur d'achèvement standard.
Omar
6

J'ai trouvé quelque chose qui semble fonctionner correctement lors des tests initiaux: essentiellement relier <tab>à pcomplete-std-complete, mais comme cette fonction n'est pas interactive pour une raison quelconque, vous devez l'encapsuler:

(define-key eshell-mode-map (kbd "<tab>")
  (lambda () (interactive) (pcomplete-std-complete)))

Le pcompete-std-completetente d'utiliser les compléments écrits pcompleteavec l'interface utilisateur de complétion standard, qui ivypar défaut prévaudra (avec la mise à jour très récente, ils apparaissent dans une belle superposition directement dans le tampon eshell près du point!).

Les commentaires dans le code source de pcomplete-completions-at-point(qui pcomplete-std-completedépend de) mentionnent quelques problèmes potentiels:

;; 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.

Je pense que le premier ne m'affectera pas, car je ne pense pas que j'appuie jamais <tab>sauf à la fin de la ligne d'entrée. Pour l'instant, je n'ai pas vu le deuxième problème.

EDIT: Pour ceux qui ne connaissent pas les bizarreries d'Eshell (c'est un euphémisme), je devrais peut-être ajouter que pour relier la clé d'Eshell comme suggéré ci-dessus, vous devriez mettre ceci dans votre fichier init:

(add-hook 'eshell-mode-hook
  (lambda () 
    (define-key eshell-mode-map (kbd "<tab>")
      (lambda () (interactive) (pcomplete-std-complete)))))

Avant de me crier dessus pour l'antipattern gaspillage des raccourcis clavier, laissez-moi vous expliquer que eshell déclare son clavier avec (defvar eshell-mode-map nil)puis le fait à l' (setq-local eshell-mode-map (sparse-keymap))intérieur eshell-mode! (Le code a une ;; FIXME: What the hell!?utilité.) Cela signifie que vous ne pouvez pas relier les clés avant la fin des eshell-modeexécutions! D'où le crochet.

Omar
la source
De plus, je ne l'ai pas testé, mais je suppose que si ce helmn'est pas déjà insinué dans l' eshellachèvement de l'onglet, ce correctif s'applique également à helm.
Omar
C'est plutôt bien :) Merci pour le conseil
Chakravarthy Raghunandan
Ce commentaire «Que va-t-il faire?
GergelyPolonkai