¿Cómo puedo configurar eshell para usar ivy para completar pestañas?


16

Soy muy aficionado ivya la finalización y me encanta que un simple (ivy-mode 1)sea ​​suficiente para llegar a ivycasi todas partes donde Emacs usa algún tipo de finalización (creo que se logra anulando completeing-read). Pero esto no está configurado eshellpara usarse ivypara completar la pestaña. Me gusta eshellla lista de candidatos de finalización, pero preferiría que la ivyUI escogiera entre ellos. ¿Hay alguna manera de reutilizar lo eshellque sea ​​que se haga para producir candidatos para completar y pasar eso a 'hiedra'?

Respuestas:


11

Esto debería funcionar bien:

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

No sé por qué lo anterior no es el predeterminado. Pero yo uso solo shell-modey de term-modetodos modos.


3
Probablemente deberías agregar que (add-hook 'eshell-mode-hook '(lambda ()es necesario envolverlo.
Timm

Gracias, eso es un poco más ordenado que lo que tenía. La razón por la que no es el valor predeterminado es probablemente que alguien en algún momento en el pasado prefirió pcompletela IU de finalización estándar.
Omar

6

Encontré algo que parece funcionar bien en la prueba inicial: esencialmente volver <tab>a vincular pcomplete-std-complete, pero dado que esa función no es interactiva por alguna razón, debe envolverla:

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

Los pcompete-std-completeintentos de utilizar las terminaciones escritas para pcompletela interfaz de usuario de terminación estándar, que ivypor defecto anulará (con la muy reciente actualización, que aparecen en un derecho de superposición agradable en el punto cercano ESHELL amortiguar!).

Los comentarios en el código fuente de pcomplete-completions-at-point(que pcomplete-std-completedepende de) mencionan un par de posibles problemas:

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

Creo que el primero no me afectará, ya que no creo que presione nunca <tab>excepto al final de la línea de entrada. Tampoco he visto la superficie del segundo problema, hasta ahora.

EDITAR: Para aquellos que no están familiarizados con las peculiaridades de eshell (esto es un eufemismo), tal vez debería agregar eso para volver a vincular la clave de eshell como se sugirió anteriormente, debe poner esto en su archivo de inicio:

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

Antes de que me grites por el antipatrón derrochador de ataduras de teclas, déjame explicarte que eshell declara su mapa de teclas (defvar eshell-mode-map nil)y luego lo hace (setq-local eshell-mode-map (sparse-keymap))dentro eshell-mode. (El código es útil ;; FIXME: What the hell!?.) ¡Eso significa que no puede volver a vincular las claves hasta después de las eshell-modeejecuciones! De ahí el anzuelo.


Además, no lo he probado, pero supongo que si helmaún no se insinúa en la eshellfinalización de la pestaña, esta corrección también se aplica helm.
Omar

Esto es bastante bueno :) Gracias por el consejo
Chakravarthy Raghunandan

Ese comentario "¡¿Qué demonios ?!" me alegró el día :) Además, me gustaría señalar que esto también debería funcionar para otros marcos de finalización, como helm.
GergelyPolonkai
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.