Sie können die von einer Taste ausgegebene Zeichenfolge bestimmen, indem Sie Ctrl- vin der Befehlszeile drücken und dann die Taste drücken, an der Sie interessiert sind. Auf meinem System für F12bekomme ich ^[[24~
. Das ^[
repräsentiert Esc. Verschiedene Arten von Terminals oder Terminalemulatoren können unterschiedliche Codes für denselben Schlüssel ausgeben.
An einer Bash-Eingabeaufforderung können Sie einen Befehl wie diesen eingeben, um das Schlüsselmakro zu aktivieren und es auszuprobieren.
bind '"\e[24~":"foobar"'
Wenn Sie jetzt drücken F12, wird in der Befehlszeile "foobar" zur weiteren Bearbeitung angezeigt. Wenn Sie möchten, dass ein Tastendruck sofort einen Befehl eingibt, können Sie eine neue Zeile hinzufügen:
bind '"\e[24~":"pwd\n"'
Wenn Sie jetzt drücken F12, wird das aktuelle Verzeichnis angezeigt, ohne drücken zu müssen Enter. Was ist, wenn Sie bereits etwas in die Zeile eingegeben haben und dieses verwenden, das automatisch ausgeführt wird? Es könnte chaotisch werden. Sie können die Zeile jedoch als Teil Ihres Makros löschen:
bind '"\e[24~":"\C-k \C-upwd\n"'
Das Leerzeichen stellt sicher, dass das Ctrl- uetwas zu löschen hat, damit die Glocke nicht läutet.
Sobald das Makro wie gewünscht funktioniert, können Sie es dauerhaft machen, indem Sie es Ihrer ~/.inputrc
Datei hinzufügen . Der bind
Befehl oder die äußeren einfachen Anführungszeichen sind nicht erforderlich :
"\e[24~":"\C-k \C-upwd\n"
Bearbeiten:
Sie können auch eine Schlüsselbindung erstellen, die etwas ausführt, ohne die aktuelle Befehlszeile zu stören.
bind -x '"\eW":"who"'
Während Sie dann einen Befehl eingeben, für den beispielsweise ein Benutzername erforderlich ist, und die Namen der angemeldeten Benutzer kennen müssen, können Sie Alt- Shift- drücken. WDie Ausgabe von who
wird angezeigt und die Eingabeaufforderung wird erneut ausgegeben mit intaktem Teilbefehl und dem Cursor an der gleichen Position in der Zeile.
Leider funktioniert dies nicht richtig für Tasten, F12die mehr als zwei Zeichen ausgeben. In einigen Fällen kann dies umgangen werden.
Der Befehl ( who
in diesem Fall) kann eine beliebige ausführbare Datei sein - ein Programm, ein Skript oder eine Funktion.
bind '"\C-q": menu-complete'
zum Beispiel (oder in Ihrem~/.inputrc
:"\C-q": menu-complete
). Möglicherweise müssenstty -ixon
Sie~/.bashrc
auch die Flusskontrolle deaktivieren und ^ S und ^ Q verfügbar machen.^[
repräsentiertesc
und dann scheinen Sie es\e
in Ihrem Beispiel zu ersetzen . Können Sie bitte erklären, warum?^[
ist die Ausgabedarstellung. Dies\e
ist eine Möglichkeit, es einzugeben (^[
funktioniert dafür nicht).Sie können Bash-Schlüsselbindungen in
~/.inputrc
(Konfigurationsdatei für die GNU Readline-Bibliothek) definieren. Die Syntax lautet<Keysym oder Schlüsselname>: Makro
beispielsweise:
erstellt ein Makro, das beim Drücken "> output" einfügt ControlO
erstellt ein Makro, das beim Drücken "echo foobar" einfügt F1... Ich weiß nicht, wofür das Keysym nicht verfügbar F11ist.
Bearbeiten:
.inputrc
versteht die\n
Escape-Sequenz für Linefeed, so dass Sie verwenden könnenDies drückt effektiv die Eingabetaste, nachdem der Befehl ausgegeben wurde.
quelle
Alt
Verwendung\e
, zum Beispiel"\eo": "> output"
..inputrc
Sie unter hackaday.com/2018/01/19/linux-fu-custom-bash-command-completionDiese Lösung ist spezifisch für X11-Umgebungen und hat nichts mit Bash zu tun, sondern fügt Ihren .Xmodmaps Folgendes hinzu
sendet die Zeichenfolge "foobar" an das Terminal, wenn F12 gedrückt wird.
quelle
Ich wollte mich
Ctrl+B
an einen Befehl binden . Inspiriert von einer Antwort oben, versuchte ich zu verwendenbind
, konnte aber nicht herausfinden, in welche Reihe von kryptischen Schnörkeln (\e[24~
?) Übersetzt werdenCtrl+B
.Gehen Sie auf einem Mac zu Einstellungen der Terminal-App, Profile -> Tastatur ->
+
und drücken Sie die Tastenkombination, nach der Sie suchen. Für michCtrl+B
ergab sich,\002
dass ich erfolgreich an Befehl gebunden habebind '"\002":"echo command"'
Wenn Sie möchten, dass der Befehl sofort ausgeführt wird (und nicht nur in die Eingabeaufforderung eingefügt wird), können Sie die Eingabetaste am Ende Ihres Befehls wie folgt hinzufügen:
bind '"\002":"echo command\015"'
quelle