Wie kann ich eshell so einrichten, dass Efeu zum Ausfüllen von Registerkarten verwendet wird?


16

Ich bin sehr angetan von ivyVollendung und von der Liebe, dass ein einfaches Verfahren (ivy-mode 1)ausreicht, um ivyfast überall dort anzukommen, wo Emacs eine Art Vollendung verwendet (die durch Überschreiben completeing-read, glaube ich, vollendet wird ). Dies ist jedoch nicht eshellfür die Verwendung ivyzum Vervollständigen von Registerkarten geeignet . Ich mag eshelldie Liste der Abschlusskandidaten, würde aber die ivyBenutzeroberfläche vorziehen , um unter ihnen auszuwählen. Gibt es eine Möglichkeit, was eshellauch immer verwendet wird, um Abschlusskandidaten zu produzieren und diese an "Efeu" weiterzugeben?

Antworten:


11

Dies sollte gut funktionieren:

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

Ich weiß nicht, warum dies nicht die Standardeinstellung ist. Aber ich benutze nur shell-modeund term-modetrotzdem.


3
Sie sollten wahrscheinlich hinzufügen, dass es (add-hook 'eshell-mode-hook '(lambda ()darum gewickelt werden muss.
Timm

Danke, das ist ein bisschen ordentlicher als das, was ich hatte. Der Grund dafür, dass dies nicht die Standardeinstellung ist, ist wahrscheinlich, dass irgendwann in der Vergangenheit jemand pcompleteder Standardabschluss-Benutzeroberfläche den Vorzug gab .
Omar

6

Ich habe etwas gefunden, das beim ersten Testen in Ordnung <tab>zu sein scheint: Im Wesentlichen neu binden an pcomplete-std-complete, aber da diese Funktion aus irgendeinem Grund nicht interaktiv ist, müssen Sie sie umbrechen :

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

Die pcompete-std-completeVersuche, die Vervollständigungen zu verwenden, die für pcompletedie Standard-Vervollständigungs-Benutzeroberfläche geschrieben wurden, ivywerden standardmäßig außer Kraft gesetzt (mit dem jüngsten Update werden sie in einem netten Overlay direkt im eshell-Puffer in der Nähe von point angezeigt!).

Die Kommentare im Quellcode von pcomplete-completions-at-point(was pcomplete-std-completedavon abhängt) erwähnen einige potenzielle Probleme:

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

Ich denke, der erste hat keinen Einfluss auf mich, da ich glaube, dass ich <tab>nur am Ende der Eingabezeile drücke . Das zweite Problem habe ich auch noch nicht gesehen.

BEARBEITEN: Für diejenigen, die mit den Macken von eshell nicht vertraut sind (dies ist ein Euphemismus), sollte ich vielleicht Folgendes hinzufügen, um den Schlüssel von eshell wie oben vorgeschlagen neu zu binden:

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

Bevor Sie mich wegen des verschwenderischen Keybindings-in-a-Hook Antipatterns anschreien, lassen Sie mich erklären, dass eshell seine Keymap mit deklariert (defvar eshell-mode-map nil)und dies dann im (setq-local eshell-mode-map (sparse-keymap))Inneren tut eshell-mode! (Der Code hat eine hilfreiche ;; FIXME: What the hell!?.) Das bedeutet, dass Sie Schlüssel erst nach dem Ausführen neu binden können eshell-mode! Daher der Haken.


Ich habe es auch nicht getestet, aber ich würde vermuten, dass dieses Update auch gilt , wenn helmes nicht bereits in die eshellTab-Vervollständigung eingeht helm.
Omar

Das ist ziemlich ordentlich :) Danke für den Tipp
Chakravarthy Raghunandan

Dieser Kommentar zu „What the he'll !?“ hat meinen Tag geprägt.
GergelyPolonkai
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.