Como posso configurar o eshell para usar o ivy na conclusão da guia?

16

Gosto muito de ivyconcluir e adoro que um simples (ivy-mode 1)seja suficiente para chegar a ivyquase todos os lugares onde o Emacs usa algum tipo de conclusão (que é realizada pela substituição completeing-read, acredito). Mas isso não é configurado eshellpara ser usado ivyna conclusão da guia. Gosto da eshelllista de candidatos a conclusão, mas preferiria que a ivyinterface do usuário escolhesse entre eles. Existe alguma maneira de reutilizar o que eshellfaz para produzir candidatos à conclusão e entregá-lo à `` hera ''?

Omar
fonte

Respostas:

11

Isso deve funcionar bem:

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

Não sei por que o acima não é o padrão. Mas eu uso apenas shell-modee de term-modequalquer maneira.

abo-abo
fonte
3
Você provavelmente deve adicionar o que (add-hook 'eshell-mode-hook '(lambda ()precisa ser contornado.
Timm
Obrigado, isso é um pouco mais limpo do que eu tinha. O motivo pelo qual esse não é o padrão provavelmente é que alguém em algum momento no passado preferiu pcompletea interface do usuário de conclusão padrão.
Omar
6

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-completetentativas de usar as conclusões escritas pcompletecom a interface de usuário de conclusão padrão, que ivypor 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-completedependem) 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-modeexecução! Daí o gancho.

Omar
fonte
Além disso, ainda não o testei, mas acho que, se helmainda não insinuamos a eshellconclusão da guia, essa correção também se aplica helm.
Omar
Este é bastante puro :) Obrigado pela dica
Chakravarthy Raghunandan
O comentário “O que ele vai !?” fez o meu dia :) Além disso, gostaria de observar que isso também deve funcionar para outras estruturas de conclusão, como o leme.
GergelyPolonkai