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-complete
tente d'utiliser les compléments écrits pcomplete
avec l'interface utilisateur de complétion standard, qui ivy
par 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-complete
dé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-mode
exécutions! D'où le crochet.
(add-hook 'eshell-mode-hook '(lambda ()
doit être enroulé autour de lui.