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?

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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.