Im GNOME-Terminal führt Bash eine intelligente automatische Vervollständigung durch. Beispielsweise
apt-get in<TAB>
wird
apt-get install
Im Emacs-Shell-Modus funktioniert diese automatische Vervollständigung nicht, selbst nachdem ich explizit eine Quelle erstellt habe /etc/bash_completion
. Das obige Beispiel bleibt in
bei einem Dateinamen im aktuellen Verzeichnis oder wird automatisch mit diesem vervollständigt, anstatt einer gültigen apt-get
Befehlsoption. Vermutlich liegt dies daran, dass Emacs das Drücken der Tabulatortaste abfängt. Wie aktiviere ich die intelligente automatische Vervollständigung in shell-mode
?
bash
shell
emacs
autocomplete
Chris Conway
quelle
quelle
eshell-mode
das hat Tab-Vervollständigung. Weitere Infos hier: masteringemacs.org/articles/2010/11/01/…Antworten:
Ich weiß, dass diese Frage drei Jahre alt ist, aber ich war auch daran interessiert, sie zu lösen. Eine Websuche führte mich zu einem Stück Elisp, das Emacs dazu bringt, Bash für den Abschluss im Shell-Modus zu verwenden. Es funktioniert auf jeden Fall bei mir.
Überprüfen Sie es unter https://github.com/szermatt/emacs-bash-completion .
quelle
M-x package-list-packages
, aber am Ende hat es bei mir nicht funktioniert, ich weiß nicht warum, es können meine Emacs (24.3.1) oder sein Bash (4.3.30) Version. In der Dokumentation heißt es "bash-vervollständigung.el reagiert sehr empfindlich auf die Betriebssystem- und BASH-Version ...". Dann gibt es eine Liste, in der meine Versionen fehlen.In der Emacs-Shell werden Emacs automatisch vervollständigt und nicht geschlagen. Wenn die Shell und die Emacs nicht synchron sind (z. B. mithilfe von pushd, popd oder einer Bash-Benutzerfunktion, die das aktuelle Verzeichnis der Shell ändert), funktioniert die automatische Vervollständigung nicht mehr.
Um dies zu beheben, geben Sie einfach 'dirs' in die Shell ein und die Dinge werden wieder synchronisiert.
Ich habe auch Folgendes in meinen .emacs:
Durch einfaches Drücken von Esc-Return wird die automatische Vervollständigung erneut synchronisiert.
quelle
Ich kenne die Antwort darauf nicht. Der Grund dafür, dass es nicht wie erwartet funktioniert, liegt wahrscheinlich darin, dass die Vervollständigung in Emacs-Shells von Emacs intern (von der Funktion comint-dynamic-complete) verwaltet wird und diese intelligenten Vervollständigungsfunktionen nicht integriert sind.
Ich fürchte, es ist nicht einfach, das Problem zu beheben.
Edit: njsfs Vorschlag, den Term-Modus zu verwenden, ist wahrscheinlich so gut wie es nur geht. Beginnen Sie mit
Es ist in der Standard-Emacs-Distribution enthalten (und zumindest in emacs21-common oder emacs22-common unter Ubuntu und Debian).quelle
M-x term
.Wie Matli sagte, ist es keine leichte Aufgabe, da Bash mit --noediting gestartet wird und TAB an comint-dynamic-complete gebunden ist.
Man könnte TAB möglicherweise mit dem Local-Set-Key wieder an den Self-Insert-Befehl im Shell-Comand-Hook binden und den Shell-Modus nicht mit --noediting by Mx anpassen - Variable RET explizit-bash-args, aber ich vermute das es wird nicht gut mit allen anderen Bearbeitungen zusammenpassen.
Vielleicht möchten Sie den Term-Modus ausprobieren, aber es gibt noch andere Probleme, da einige der anderen regulären Tastenkombinationen vom Term-Modus überholt werden.
BEARBEITEN: Mit anderen regulären Keybidings, die vom Term-Modus überholt werden, meine ich alle außer Cc, was zur Flucht wird, um Puffer wechseln zu können. Anstelle von Cx k müssten Sie also Cx Cx k verwenden, um den Puffer zu töten. Oder um zu einem anderen Puffer 'Cc Cx o' oder 'Cc Cx 2' zu wechseln
quelle
Bitte
M-x term
denken Sie an einen anderen Modus , wie ich ihn 2011 bei einem Trefferproblem gemacht habe. Ich habe versucht, alle Anstrengungen über Inet zu sammeln, damit die Shell mit der Bash-Vervollständigung funktioniert, einschließlich dieser Frage. Aber seitterm-mode
ich angesichts dessen eine Alternative entdeckt habe, möchte ich es nicht einmal versucheneshell
.Es ist ein vollständiger Terminalemulator, sodass Sie ein interaktives Programm wie Midnight Commander ausführen können. Oder wechseln Sie zum
zsh
Abschluss, damit Sie bei der Emacs-Konfiguration keine Zeit verlieren.Sie erhalten die TAB-Vervollständigung in Bash kostenlos. Wichtiger ist jedoch, dass Sie die volle Readline-Leistung erhalten, z. B. inkrementelle oder vorangestellte Befehlssuche . Um dieses Setup bequemer zu gestalten, überprüfen Sie meine .inputrc , .bashrc , .emacs .
Wesentlicher Bestandteil von
.inputrc
:.bashrc
(JA! Es gibt Dabbrev in Bash von jedem Wort in~/.bash_history
):.emacs
um die Navigation im Term Buffer komfortabel zu gestalten:Wie alle üblichen Befehle,
C-x o
die im Terminalemulationsmodus nicht funktionieren, habe ich die Keymap erweitert mit:Beachten Sie, dass ich
super
Schlüssel verwende, damitterm-raw-map
möglicherweise keine andere Keymap mit meinen Tastenkombinationen in Konflikt steht. Um einensuper
Schlüssel aus dem linkenWin
Schlüssel zu machen, benutze ich.xmodmaprc
:Sie sollten sich nur zwei Befehle merken:
C-c C-j
- um in den normalen Emacs-Bearbeitungsmodus zu wechseln (zum Kopieren oder Greifen in Puffertext),C-c C-k
- um zum Terminalemulationsmodus zurückzukehren.Mausauswahl und
Shift-Insert
Arbeit wie inxterm
.quelle
.inputrc
teil!Ich benutze Prelude und wenn ich Meta + Tab drücke, ist es für mich abgeschlossen.
Auch Strg + i scheint dasselbe zu tun.
quelle
Ich weiß, dass dieser Beitrag jetzt über 11 Jahre alt ist. Aber ich habe eine Funktion erstellt, um die native Shell in Emacs zu vervollständigen. Es sendet lediglich eine Tabulatortaste an den zugrunde liegenden Prozess und fängt die Ausgabe ab, sodass sie genau so ist, wie Sie sie in der Shell selbst erhalten würden.
https://github.com/CeleritasCelery/emacs-native-shell-complete
quelle
Ich benutze den Steuermodus. Es hat diese Funktionalität (nach Drücken von "TAB"):
quelle
Ich behaupte nicht, ein Emacs-Experte zu sein, aber dies sollte Ihr Problem lösen:
Erstellen Sie: ~ / .emacs
Fügen Sie hinzu:
(erfordert 'Shell-Befehl) (Shell-Befehl-Abschluss-Modus)
Emacs übernimmt die Shell, damit die BASH-Einstellungen nicht übernommen werden. Dadurch wird die automatische Vervollständigung für EMACS selbst festgelegt.
quelle