Come posso configurare eshell per usare edera per il completamento delle schede?


16

Sono molto affezionato ivyal completamento e adoro il fatto che un semplice (ivy-mode 1)sia sufficiente per ottenere ivyquasi ovunque che Emacs usi una sorta di completamento (che è realizzato con l'override completeing-read, credo). Ma questo non è impostato eshellper l'uso ivyper il completamento della scheda. Mi piace eshellla lista dei candidati per il completamento, ma preferirei che l' ivyIU scelga tra loro. Esiste un modo per riutilizzare qualsiasi eshellcosa produca candidati per il completamento e consegnarlo all'edera?

Risposte:


11

Questo dovrebbe funzionare bene:

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

Non so perché quanto sopra non sia l'impostazione predefinita. Ma io uso solo shell-modee term-modecomunque.


3
Probabilmente dovresti aggiungere che (add-hook 'eshell-mode-hook '(lambda ()deve essere avvolto attorno ad esso.
Timm,

Grazie, è un po 'più ordinato di quello che avevo. Il motivo per cui non è l'impostazione predefinita è probabilmente solo che qualcuno ad un certo punto in passato preferiva pcompletel'interfaccia utente standard di completamento.
Omar,

6

Ho trovato qualcosa che sembra funzionare bene su test iniziale: in sostanza associare nuovamente <tab>a pcomplete-std-complete, ma dal momento che la funzione non è interattivo, per qualche motivo, è necessario avvolgerlo:

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

Il pcompete-std-completetentativo di utilizzare i completamenti scritti pcompletecon l'interfaccia utente di completamento standard, che ivyper impostazione predefinita avrà la precedenza (con l'aggiornamento molto recente, appaiono in un bel overlay proprio nel buffer eshell vicino al punto!).

I commenti nel codice sorgente di pcomplete-completions-at-point(che pcomplete-std-completedipende da) menzionano un paio di potenziali problemi:

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

Penso che il primo non mi influenzerà, dal momento che non credo di aver mai premuto <tab>se non alla fine della riga di input. Non ho ancora visto la seconda superficie del problema, finora.

EDIT: Per coloro che non hanno familiarità con le stranezze di eshell (questo è un eufemismo), forse dovrei aggiungere che per ricollegare la chiave di eshell come suggerito sopra, dovresti metterlo nel tuo file init:

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

Prima di gridarmi per l'antipasto inutile di legature di tasti, lasciami spiegare che eshell dichiara la sua mappa di chiavi (defvar eshell-mode-map nil)e poi fa (setq-local eshell-mode-map (sparse-keymap))dentro eshell-mode! (Il codice ha un utile ;; FIXME: What the hell!?.) Ciò significa che non è possibile ricollegare le chiavi fino a dopo l' eshell-modeesecuzione! Da qui l'amo.


Inoltre, non l'ho provato, ma immagino che se helmnon si insinua già nel eshellcompletamento della scheda, questa correzione si applica anche a helm.
Omar,

Questo è abbastanza pulito :) Grazie per la punta
Chakravarthy Raghunandan,

Quel commento "What the will will !?" ha reso la mia giornata :) Inoltre, vorrei notare che questo dovrebbe funzionare anche per altri framework di completamento, come helm.
GergelyPolonkai,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.