Bash History Tastaturkürzel für! *

8

In Bash gibt es einige praktische Operatoren, mit denen Sie Teile des letzten Befehls wiederholen können:

  • !^ erweitert sich auf das erste Argument des vorherigen Befehls, z.

    $ echo one "two three"
    one two three
    $ echo !^
    echo one
    one
  • !$ erweitert sich zum letzten Argument des vorherigen Befehls, z.

    $ echo one "two three"
    one two three
    $ echo !$
    echo "two three"
    two three
  • !* Erweitert sich auf alle Argumente des vorherigen Befehls, z.

    $ echo one "two three"
    one two three
    $ echo !*
    echo one "two three"
    one two three

(Soweit ich verstehe, sind diese syntaktischer Zucker für !!:^, !!:$und !!:*sind, wobei !!ein Ereignis Bezeichner , dass sich ausdehnt , um zum vorherigen Befehl, und ^, $und *Wortbezeich sind, finden Sie in der Bash - Referenzhandbuch oder man bash.)

Diese sind oft sehr praktisch. Mit Tastaturkürzeln wird es aber noch cooler:

  • Wenn Sie Alt+ .oder Alt+ drücken _, wird das letzte Argument des vorherigen Befehls in den aktuellen Befehl eingefügt, ähnlich als hätten Sie !$zu diesem Zeitpunkt geschrieben.

  • Sie können auch Alt+ Ctrl+ ydrücken, um das erste Argument des vorherigen Befehls einzufügen, als hätten Sie !^zu diesem Zeitpunkt geschrieben.

(Siehe die GNU Readline Library oder info readline.)

Ich bevorzuge die Tastaturkürzel gegenüber den Verlaufsoperatoren von Bash, da ich sehen kann, was ich einfüge, bevor ich den Befehl tatsächlich ausführe. Es scheint jedoch keine Verknüpfung zu geben, mit der ich alle Wörter des vorherigen Befehls einfügen kann, dh eines, das !*die Aufgabe erfüllt . Zumindest konnte ich es nicht finden.

Gibt es so eine Abkürzung? Wenn nicht, ist es möglich, die Readline-Bibliothek so zu konfigurieren, dass eine hinzugefügt wird, und wie?

Malte Skoruppa
quelle
AFAIK, Tastaturkürzel werden vom Terminalemulator verarbeitet. Ich nehme an, Sie verwenden das Gnome-Terminal?
Seth
1
In zshwenn Sie geben echo !*und drücken Sie dann TAB, haben Sie den gewünschten Effekt. Im Allgemeinen erweitert TAB in der Readline alle erweiterbaren Elemente. Sehr praktisch; wahrscheinlich wird bash eine Konfiguration mit dem gleichen Effekt haben? @ Seth, ich denke, dies ist die Readline in Bash, nicht der Terminal-Emulator - aber nicht sicher.
Rmano
2
@ Seth Nein, die Verknüpfungen aus dem Q werden von bash behandelt. Sie können nach "Befehle zum Manipulieren der Geschichte" in man bash(irgendwo in der Zeile 3030)
Radu Rădeanu
@ RaduRădeanu Oh interessant! Das wusste ich nicht. Meine schlechten für schlechte Annahmen.
Seth
1
\e.und \e_sind der Readline-Funktion zugeordnet yank-last-argund \e\C-ysind zugeordnet yank-nth-arg. Leider scheint es keinen (einzelnen) Befehl zu geben, der mehrere vorherige Argumente gleichzeitig hinzufügt.
Adaephon

Antworten:

5

Wenn Sie sich die Ausgabe des folgenden Befehls ansehen:

bind -l

oder besser:

bind -l | grep arg

Sie können sehen, dass für alle Argumente keine Readline-Funktion vorhanden ist, z. B. yank-last-argfür das letzte Argument, mit dem das letzte Argument in den vorherigen Befehl (das letzte Wort des vorherigen Verlaufseintrags) eingefügt werden kann. Wenn eine solche Funktion nicht vorhanden ist, gibt es höchstwahrscheinlich keine Verknüpfung, um das zu erreichen, was Sie wünschen.

Lassen Sie uns versuchen, eine Kiste zu erstellen, die Ihrer Anfrage entspricht ...

Schauen Sie sich zunächst beispielsweise die Ausgabe des folgenden Befehls an:

bind -p | grep yank-nth-arg

Die Ausgabe ist:

"\e\C-y": yank-nth-arg

und kann wie folgt übersetzt werden: yank-nth-arg(die das erste Argument in den vorherigen Befehl einfügen - mit einem Argument n das n-te Argument aus dem vorherigen Befehl einfügen) ist an Alt+ Ctrl+ gebunden y.

Auf die gleiche Weise kann jede Zeile aus der bind -pBefehlsausgabe interpretiert werden .

Achten Sie nun auf die folgenden Szenarien:

  • Wenn Sie die folgende Bindung festlegen:

    bind '"\ea": "\e2\e."'

    Alt+ Awird Alt+ 2Alt+ zugeordnet, .das zugeordnet wird, um das zweite Argument des vorherigen Befehls einzufügen. Wenn Sie also Alt+ drücken A, wird das zweite Argument des vorherigen Befehls in den aktuellen Befehl eingefügt.

  • Wenn Sie einstellen:

    bind '"\ea": "\e1\e. \e2\e."'

    Nach dem Drücken von Alt+ Awerden die ersten beiden Argumente des vorherigen Befehls in den aktuellen Befehl eingefügt. Wenn die Anzahl der Argumente aus dem vorherigen Befehl maximal 2 beträgt, wird natürlich der gesamte vorherige Befehl in den aktuellen Befehl eingefügt.

  • Wenn Sie einstellen:

    bind '"\ea": "\e1\e. \e2\e. \e3\e."'

    Nach dem Drücken von Alt+ Awerden die ersten drei Argumente des vorherigen Befehls in den aktuellen Befehl eingefügt. Wenn die Anzahl der Argumente aus dem vorherigen Befehl maximal 3 beträgt (wie in Ihrem Fall), wird natürlich der gesamte vorherige Befehl in den aktuellen Befehl eingefügt.

  • Und so weiter.

Für die ersten 10 Argumente können Sie Folgendes verwenden:

bind '"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."'

Und ich denke, dass dies lang genug ist, da ich nicht zu oft Befehle mit so vielen Argumenten verwende.

Fügen Sie Ihrer ~/.inputrcDatei die folgende Zeilenzeile hinzu, um sie dauerhaft zu machen :

"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."

In diesem Beispiel habe ich Alt+ gewählt A, um alle Argumente (wenn die Anzahl der Argumente nicht größer als 10 ist) des vorherigen Befehls einzufügen. Sie können jedoch eine beliebige andere Kombination auswählen, indem Sie die \eaZeichenfolge im vorherigen Befehl ersetzen .

Ressourcen:

Radu Rădeanu
quelle
Nun, es ist etwas hackisch und es wird nur für eine begrenzte Anzahl von Argumenten funktionieren, aber es scheint das nächste zu sein, das wir leicht bekommen können - ich nehme es an;) Eigentlich habe ich mir nur den Quellcode von readline angesehen. Auf den ersten Blick sieht es so aus, als ob funmap.cdie Funktion in der Datei yank-nth-argder C-Funktion zugeordnet ist rl_yank_nth_arg, die wiederum in definiert ist kill.c. Analog für yank-last-arg. Natürlich wäre es möglich, readline mit einer solchen Funktionalität zu erweitern, aber das möchte ich nicht. Ich bevorzuge, dass meine Readline von verwaltet wird apt, und diese Funktion ist nicht so wichtig;)
Malte Skoruppa