Eu encontrei algo que parece funcionar bem em testes iniciais: essencialmente religar <tab>
para pcomplete-std-complete
, mas desde que a função não é interativo, por algum motivo, você precisa envolvê-la:
(define-key eshell-mode-map (kbd "<tab>")
(lambda () (interactive) (pcomplete-std-complete)))
As pcompete-std-complete
tentativas de usar as conclusões escritas pcomplete
com a interface de usuário de conclusão padrão, que ivy
por padrão substituirá (com a atualização muito recente, elas aparecerão em uma boa sobreposição no ponto eshell do buffer próximo!).
Os comentários no código-fonte de pcomplete-completions-at-point
(que pcomplete-std-complete
dependem) mencionam alguns problemas em potencial:
;; 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.
Acho que o primeiro não vai me afetar, pois acho que nunca pressiono, <tab>
exceto no final da linha de entrada. Também não vi a segunda superfície do problema, até agora.
EDIT: Para aqueles que não estão familiarizados com as peculiaridades do eshell (isso é um eufemismo), talvez eu deva adicionar isso para religar a chave do eshell como sugerido acima, você deve colocar isso no seu arquivo init:
(add-hook 'eshell-mode-hook
(lambda ()
(define-key eshell-mode-map (kbd "<tab>")
(lambda () (interactive) (pcomplete-std-complete)))))
Antes de você gritar comigo pelo desperdiçador antipadrão de atalhos de teclado, deixe-me explicar que a eshell declara seu mapa de teclas com (defvar eshell-mode-map nil)
e depois faz (setq-local eshell-mode-map (sparse-keymap))
dentro eshell-mode
! (O código é útil ;; FIXME: What the hell!?
.) Isso significa que você não pode religar as chaves até depois da eshell-mode
execução! Daí o gancho.
(add-hook 'eshell-mode-hook '(lambda ()
precisa ser contornado.