Auto-Vervollständigung für häufig verwendete Kommandozeilenbefehle?

15

Für einige Projekte gebe ich oft ein paar Befehle ein, wie zum Beispiel:

cd an/extremely/long/path/in/which/I/have/some/kinda/project

und

./runmyproject --with some --command line --options set

Da ich ziemlich faul bin, versuche ich zu vermeiden, diese Befehle immer wieder vollständig einzugeben. Natürlich kann ich die Aufwärtstaste häufig verwenden, um diese Befehle wiederzufinden, aber oft habe ich auch so viele Befehle dazwischen, dass das Suchen noch mehr Zeit in Anspruch nimmt als nur das Eingeben.

Ich frage mich jetzt, ob es eine Art Dienstprogramm gibt, das einen vollständigen Befehl vorschlägt, den ich häufig verwende, wenn ich noch nicht alles eingegeben habe. Damit ich zum Beispiel 'cd an /' eingeben kann und dass es bereits den Rest des Pfades andeutet, weil ich ihn im letzten Monat so oft benutzt habe.

Ich habe etwas namens Bash Smart Complete gefunden. Aber das ist ein bisschen "dumm", weil es nicht auf die Befehle eingeht, die ich vorher verwendet habe. Ich habe gerade auch diese SO-Antwort gefunden , die vorschlägt, die Befehle, die ich häufig verwende, in eine Datei zu schreiben. Dies ist jedoch nicht ausreichend, da ich jedes Mal, wenn ich neue Projekte starte oder Ordner oder Programmargumente ändere, eine neue Datei dafür erstellen müsste.

Kennt jemand einen anderen Nutzen oder einen anderen Weg, um dies zu erreichen? Oder würde jemand wissen, wie ich den Bash Smart Complete so ändern kann, dass er die Befehle anzeigt, die ich im letzten Monat verwendet habe, und den Befehl ausführt, der im letzten Monat am besten passt und am häufigsten verwendet wurde?

[EDIT] Nachfolgend finden Sie einige wirklich gute Antworten. Ich habe noch keine als endgültige Antwort markiert. Nicht weil mir die Antworten nicht gefallen, sondern weil keiner von ihnen ein absoluter Gewinner ist. Ich denke, das Finalterm ist ein großartiges Projekt. Leider ist es immer noch ziemlich rau an den Rändern. Beispielsweise; Copy-Paste wird noch nicht unterstützt. Ich würde dieses Projekt jedoch im Auge behalten, denn wenn es reif wird, wird es meiner Meinung nach eine großartige Terminal-App. Was die anderen Antworten betrifft; Entweder schlugen sie vor, einen Alias ​​zu erstellen, was ich nicht tun möchte, weil es zusätzliche Arbeit schafft, anstatt Arbeit wegzunehmen, oder sie verwendeten Strg + R, was brillant ist (ich wusste nichts davon!). Ein paar Leute schlugen die Verwendung von Strg + R vor, sodass ich eine Antwort nicht wirklich über die andere heben kann.

Im Moment benutze ich also definitiv Strg + R und in Zukunft vielleicht Finalterm.

Danke für all die tollen Antworten, Leute!

kramer65
quelle
2
Du solltest es wirklich versuchen zsh. Es bietet alles, was Sie sich wünschen und vieles mehr.
Wechsel
Laut BASH-Manpage ist die Funktion in BASH auch als "dynamic-complete-history" vorhanden. Standardmäßig ist es an Alt + Tab gebunden, was es unbrauchbar macht, aber man kann die Bindung mit "bind" ändern.
Boris Bukh
1
@BasharatSial was macht zsh konkret, um dabei zu helfen?
Poolie

Antworten:

16

Wenn die Befehle häufig verwendet werden, werden sie in den Befehlsverlaufs-Bash-Spuren in aufgezeichnet .bash_history.

Jetzt der Trick: Sie können diesen Verlauf umkehren, um Befehle erneut auszuführen, indem Sie STRG-R drücken .

Im inversen Verlaufssuchmodus zeigt bash während der Eingabe den aktuellsten Befehl im Verlauf, der mit Ihrer Eingabe beginnt. Drücken Sie anschließend die Eingabetaste, um den vorgeschlagenen Befehl zu akzeptieren und auszuführen. Halten Sie STRG-R gedrückt, um zu älteren Befehlen mit demselben Präfix zu wechseln.

Dies ist in bash integriert, ohne dass Skripte angepasst oder Software installiert werden müssen :) Dies ist eine der nützlichsten Funktionen von bash, imho.

catchmeifyoutry
quelle
3
Verwenden Sie [ STRG-g ], um den Verlaufssuchmodus zu verlassen, wenn Sie keinen Befehl ausführen (z. B. wenn Sie den gewünschten nicht gefunden haben).
MountainX für Monica Cellio
8

Fügen Sie (Strg-Umschalt-V) Folgendes in ein Terminalfenster ein:

echo '"\e[A": history-search-backward' > ~/.inputrc
echo '"\e[B": history-search-forward' >> ~/.inputrc
echo 'set show-all-if-ambiguous on' >> ~/.inputrc
echo 'set completion-ignore-case on' >> ~/.inputrc

Verlassen Sie den Terminal-Bildschirm (Strg-D) und öffnen Sie das Terminal erneut.

Jetzt können Sie nur die ersten Zeichen eingeben und dann mit Auf oder Ab durch die gefilterte Liste scrollen

Scott May
quelle
3
Dies ist die einfachste Antwort, die den Job erledigt!
cxrodgers
8

Endgültige Amtszeit

Es gibt diese vielversprechende Terminal-App namens Final Term . Unter seinen zahlreichen Funktionen verfügt es auch über einen Verlauf von Remebering-Befehlen, sodass Sie diese anschließend auswählen können. Hier sind einige weitere Funktionen:

Endgültige Amtszeit

Sie können mehr darüber in diesem Artikel lesen .

Hier ist die Website der Schöpfer. http://finalterm.org/

Um es zu installieren

sudo add-apt-repository ppa:versable/finalterm-daily
sudo apt-get update
sudo apt-get install finalterm

Warnung

Ich habe gesagt, dass es vielversprechend ist. Das einzige Problem ist, dass es sich um Version 0.1 handelt. Also manche Dinge mögen vimund nanofunktionieren noch nicht gut. Mir ist auch aufgefallen, dass Drag & Drop sowie Kopieren und Einfügen noch nicht unterstützt werden. Aber es hat die Funktion, die Sie anfordern. Wenn die Software ausgereift ist, wird sie zu einem der besten Terminals für den Desktop.

Bildschirmfoto

Hier ist die Funktion in Aktion:

 Funktion in Aktion

Hoffe das hilft.

* Ich bin auf Saucy, deshalb habe ich einen Salamander-Hintergrund :)

Max Tither
quelle
Danke für den Tipp! Ich habe es endgültig ausgecheckt und es sieht gut aus. Leider scheint es das Kopieren und Einfügen noch nicht zu unterstützen. Ich habe Strg + V, Strg + Umschalt + V und Rechtsklick ausprobiert, aber keiner davon scheint zu funktionieren. Also werde ich dieses für die Zukunft im Hinterkopf behalten!
kramer65
Das ist der größte Nachteil, den ich gesehen habe. Das Projekt ist jedoch noch jung und ich hoffe, dass es bald hinzugefügt wird. Ich kann eine Terminal-App ohne Copy-Paste-Unterstützung sehen.
Max Tither
7

Verwenden Sie ein aliasfür Ihren gesamten Befehl, oder fügen Sie das Verzeichnis zu Ihrem hinzu$PATH . Außerdem müssen Sie die Verzeichnisse nicht dahin ändern, wo Ihre ausführbare Datei (oder Ihr Skript oder was auch immer) ausgeführt werden soll, sodass es ziemlich einfach ist. Bei beiden Methoden müssen Sie das verwendete Terminal neu starten, damit die Änderungen wirksam werden.

So erstellen Sie eine bash aliasfür Ihr Beispiel (fügen Sie Ihrer ~/.bashrcDatei die folgende Zeile hinzu ):

alias runmyproject='an/extremely/long/path/in/which/I/have/some/kinda/project/runmyproject --with some --command line --options set'

Auf diese Weise müssen Sie nur noch etwas eingeben runmyproject in das Terminal eingeben, ohne Optionen / Argumente angeben zu müssen.

Alternativ können Sie Ihren Projektpfad zu Ihrer $PATHUmgebungsvariablen hinzufügen . Fügen Sie dazu die folgenden Zeilen in Ihre ~/.bashrcDatei ein:

PATH=an/extremely/long/path/in/which/I/have/some/kinda/project:$PATH
export PATH

In diesem Fall müssen Sie weiterhin Ihre Optionen / Argumente für Ihre ausführbare Datei angeben, wenn Sie sie ausführen.

Oaskamay
quelle
1
Die Sache ist, dass ich möchte, dass das Terminal auf meine Verwendung reagiert. Daher muss ich den Alias ​​jedes Mal ändern, wenn ich an neuen Projekten arbeite oder wenn ich die Verzeichnisstruktur meines Projekts ändere. Der Hauptteil meiner Frage ist, dass ich möchte, dass es von dem lernt, was ich benutze, anstatt mir zu sagen, was zu tun ist.
kramer65
Ah ich sehe. Dann sollte die aktuell bestbewertete Antwort den Trick machen. Oder zumindest eng.
Oaskamay
4

Wenn ich häufig in ein Verzeichnis wie dieses wechseln muss:

cd an/extremely/long/path/in/which/I/have/some/kinda/project

Ich würde das nur einmal machen:

ln -s an/extremely/long/path/in/which/I/have/some/kinda/project ~/project

Und von da an verwenden Sie:

cd ~/pr[tab]

Wenn es darum geht:

./runmyproject --with some --command line --options set

Ich würde die Bash-History-Suche verwenden. Drücken Sie an der Eingabeaufforderung einfach Strg-R und geben Sie "runmy" ein. Voila, der gesamte Befehl mit allen Optionen, wie er zuletzt eingegeben wurde, ist genau dort, um erneut eingegeben zu werden. Wenn mir die Optionen, die ich das letzte Mal verwendet habe und die früheren Befehle anzeigen wollte, nicht gefallen, würde ich Strg-R gedrückt halten, um alle vorherigen Befehle zu durchlaufen, die "runmy" enthielten.

Die Ctrl-R-Verlaufssuche kann auch beim Befehl 'cd' hilfreich sein, wenn Sie die Symlink-Idee nicht mögen. [Strg-R] / proj wird wahrscheinlich den letzten Befehl zurückbringen, den Sie für die CD in dieses Verzeichnis verwendet haben.

Anstatt einen Alias ​​hinzuzufügen oder zu einer speziellen Shell zu wechseln, ziehe ich es immer vor, zu lernen, die Bash-Funktionen zu verwenden, die bei solchen Dingen hilfreich sind. Auf diese Weise kann ich die gleichen Funktionen auf Remote-Computern verwenden oder mich an das Terminal eines Kollegen setzen.

Steven K
quelle
Danke für Ihren Vorschlag. Die Sache ist, dass ich keine andere Sache einstellen möchte, um die ich mich kümmern muss, wenn sich zum Beispiel der Projektordner ändert oder ich ein neues Projekt starte. Die Sache ist, dass ich möchte, dass das Terminal auf meine Verwendung reagiert. Der Hauptteil meiner Frage ist, dass ich möchte, dass es von dem lernt, was ich benutze, anstatt mir zu sagen, was zu tun ist. Ich mag die Ctrl-R-Funktion sehr. Danke dafür!
kramer65
4

Drücken Sie die Tastenkombination Strg + R auf Ihrer Tastatur - Sie werden in den Reverse-History-Modus versetzt, und Sie können den Teil eingeben, den Sie kennen. Der gesamte Befehl wird angezeigt

Es gibt andere Möglichkeiten, die hier aufgelistet sind

http://www.talug.org/events/20030709/cmdline_history.html

Ich benutze allerdings meistens die Kontrolle R

exussum
quelle
2

Versuchen Sie dies ... Dies funktioniert für alle Befehle in Ihrer Verlaufsdatei ... ist dasselbe wie Ctrl+ R, aber ich denke, das ist intuitiver :)

  1. bearbeiten /etc/inputrc

    sudo vim /etc/inputrc
  2. Kommentar entfernen oder diese zwei Zeilen hinzufügen

    "\e[5~": history-search-backward
    
    "\e[6~": history-search-forward
  3. abmelden Anmelden


Versuchen Sie dann, einen Befehl zu schreiben, der im Verlauf aufgeführt ist ...

mögen...

ls -lah

schreiben

ls

und drücke

Page Upoder um Page Dnin Ihrer Verlaufsdatei nach Befehlen zu suchen, die mit "ls" beginnen

Wenn Sie alles richtig gemacht haben, sollte es Ihren Befehl automatisch vervollständigen ...

Wolfy
quelle