Automatische Vervollständigung von Wörtern aus dem Terminalpuffer

8

In Editoren wie vimund emacskönnen Hotkeys wie C-p(vim) oder M-/(emacs) verwendet werden, um die automatische Vervollständigung des aktuellen Wortes mit anderen Wörtern im selben Puffer durchzuführen.

Ist es möglich, die gleiche Funktionalität innerhalb einer Shell zu erreichen? Wenn in der Ausgabe eines vorherigen Befehls ein Wort angezeigt wird und ich es beim Eingeben eines anderen Befehls schnell automatisch vervollständigen möchte.

Um ganz klar zu sein, ein Beispiel:

$ ls
Desktop/  Mail/  music/  osx@  something_with_a_pretty_long_name

$ someth

Von hier aus möchte ich in der Lage sein, einen Hotkey zu drücken und ihn automatisch vervollständigen zu lassen, was ich schreibe something_with_a_pretty_long_name.

EDIT: Schießen. Die Verwendung eines Dateinamens war ein schlechtes Beispiel für das, wonach ich suche. Betrachten Sie das folgende zweite Beispiel:

$ cat /var/log/something.log
[19:30] Service started
[19:35] Something else happened

$ happ

Wo ich "Happ" zu "Happied" automatisch vervollständigen konnte, nur weil es in meinem Terminalpuffer erschien. Ich hoffe das klärt was ich will.

noffle
quelle
Keine Antwort (weil es ein bisschen frech ist): Wie wäre es, wenn Sie die Shell in Emacs ( M-X shell) ausführen ? M-/funktioniert wie immer und <kbd> Tab </ kbd> funktioniert nur für Dateinamen / Befehle.
Alexios
Ich mache das tatsächlich manchmal! Dort bekam ich den Drang, diese Funktionalität in jedem Terminal zu haben. =)
noffle
Ich fühle deinen Schmerz. Ich mag die zusätzlichen Funktionen in den Emacs shell, aber es nervt mich zu sehr, um sie für längere Zeit zu verwenden. Emacs implementiert dies natürlich auf Terminalebene, und dort möchten Sie wahrscheinlich danach suchen. Und ich fürchte, du brauchst einen Patch. Ich habe noch kein Mainstream- (oder Nischen-) Terminal gesehen, das diese Funktionalität bietet.
Alexios

Antworten:

3

Kurze Antwort: Nein, nicht bei klassischen Shells wie zshoder bashwie üblich sind Shell und Terminal unterschiedliche Einheiten.

Lange Antwort: Vielleicht. Was typisch geschieht , ist ein Befehl und drücken Sie die Eingabetaste Enter- jetzt Ihre Shell Gabeln und führt den angegebenen Befehl aus . Dann hat die Shell keine Ahnung, was passiert, die Shell weiß nicht, was in das Terminal geschrieben wird oder was das ausgeführte Programm getan hat, wenn es andere Programme gestartet, in Ihr Terminal geschrieben hat oder irgendetwas.

Es gibt zwei mögliche Lösungen für Ihr Problem:

  1. Erfassen Sie die gesamte Ausgabe Ihrer ausgeführten Befehle und verwenden Sie sie irgendwie zum Abschluss (kann ausgeführt werden, sollte aber wahrscheinlich nicht ausgeführt werden).
  2. Verwenden Sie ein anderes Terminal, das das "Abschließen" Ihres "Shell-Puffers" unterstützt.

Eine Lösung für 2 besteht zum Beispiel darin, Emacs zu verwenden und multi-termeinfach zu verwenden M- /wie Sie es normalerweise tun würden, um Dinge vom Terminal aus zu erledigen. Andere Terminals bieten möglicherweise eine ähnliche Lösung.

Aber brauchen Sie diese Art der Fertigstellung wirklich? Die Shell-Vervollständigung kann heutzutage Manpages, Befehle, Pids, Sockets, Befehlsoptionen, Dateipfade von entfernten Systemen und vieles mehr vervollständigen. Dies ist möglicherweise bereits für Ihren Anwendungsfall ausreichend oder kann für Ihr spezifisches Problem erweitert werden.

Ulrich Dangel
quelle
Obwohl enttäuschend, war dies so ziemlich die Antwort, die ich erwartet hatte. Vielen Dank für die Erklärung, die Sie bezüglich der Trennung zwischen der Shell, die einen Befehl ausführt, und den Dingen, die im Hintergrund ablaufen, ohne dass dies bekannt ist, gegeben haben.
Noffle
2

http://www.iterm2.com/#/section/features/autocomplete

iterm2 hat genau das, was Sie brauchen. Schlimm, dass es für Mac ist.

Aber da es Terminal ist, können Sie ssh zu Linux / Unix und es funktioniert immer noch.

Wang Wei
quelle
Danke für die Empfehlung; Ich wusste nicht, dass iTerm2 dies tun kann.
Noffle
1

Sie können dies mit extrakto tun, das tmux verwendet, um die Ausgabe zu erfassen, und Sie können mit fzf fuzzy auswählen:

extrakto

Laktak
quelle
0

Dies ist wahrscheinlich nicht die Antwort, die Sie erwarten würden, aber sie kann einige Ihrer Bedürfnisse erfüllen.

Sie können TAB verwenden, um den Befehl im $ PATH (oder in den internen Befehlen) automatisch zu vervollständigen. Wenn Ihr Dateiname also eine ausführbare Datei und im $ PATH ist, wird er automatisch vervollständigt.

Wenn Sie den Dateinamen, der nicht ausführbar ist, automatisch .vervollständigen möchten, können Sie " " -dot, dann Leerzeichen (oder was auch immer anstelle von Punkt) und dann den Teil von Dateiname und TAB eingeben. Auf diese Weise täuschen Sie die Shell vor, dass Sie einen Befehl ausführen und dem Befehl den Dateinamen als Argument geben. Durch Drücken der Tabulatortaste wird der Dateiname automatisch vervollständigt, aber Sie müssen möglicherweise den Punkt + das Leerzeichen davor entfernen.

Eine andere Möglichkeit ist die Verwendung der BASH-Vervollständigungsfunktion . Dies kann mehr als nur Dateinamen automatisch vervollständigen.

0xAF
quelle
Vielen Dank, dass Sie sich die Zeit genommen haben, um zu helfen, aber das ist nicht das, wonach ich suche. Ich kenne bereits die Tab-Vervollständigung in meiner Shell (und verwende sie häufig). Was ich suche, ist eine Möglichkeit, die Fertigstellung eines beliebigen Terminalausgangs zu erreichen. Ich habe meinen Beitrag aktualisiert, um dies besser zu beschreiben.
Noffle