Benutzerdefinierte Tastenkombinationen für den vi-Shell-Modus, dh "set -o vi"?

18

Ich habe gerade die Wunder von set -o vientdeckt und bin gespannt, ob es möglich ist, diesen vi-Shell-Modus auf die gleiche Weise anzupassen, wie Sie es mit vi oder vim tun können.

Erstellen Sie beispielsweise eine benutzerdefinierte Schlüsselbindung, um einen bequemeren Schlüssel oder eine bequemere Tastenkombination zuzuordnen esc.

Wenn es derzeit nicht unterstützt wird, wie schwierig wäre es, den Quellcode des Programms und den Hardcode in einigen Anpassungen zu ändern, oder wäre das eine schlechte Idee?

Jona
quelle

Antworten:

17

Ja, Sie können die Tastenzuordnungen (entweder für den vi- oder den emacs-ähnlichen Modus) mit der integrierten Funktion bindändern. Dies ist eigentlich eine Readline-Funktion (so dass Sie in allen Readline-Programmen vi-ähnliche Bindungen haben können, nicht nur Bash).

Der gesuchte Schlüssel wird aufgerufen vi-movement-modeund ist standardmäßig \e(Escape). Sie könnten es auch so binden (und das ist ziemlich albern). In der zweiten Zeile wird die Bindung entfernt, um zu entkommen:

$ bind "=":vi-movement-mode 
$ bind -r "\e"

Beim Ausführen bind -pwerden Ihnen alle Schlüssel angezeigt, die Sie binden können, sowie deren aktuelle Bindungen (falls vorhanden).

Sie können bindBefehle in Ihr einfügen .bashrcoder bearbeiten ~/.inputrc, damit sie auf alle von Ihnen ausgeführten Readline-Programme angewendet werden . Die Readline-Dokumente enthalten alle Details.

derobert
quelle
1
Das ist fantastisch. Vielen Dank. Ich konnte herausfinden, wie man Tastenkombinationen wie bindet bind "Control-Space":vi-movement-mode- das funktioniert gut. Aber zum Beispiel habe ich in vim zwei Zeichen hintereinander als Auslöser für eingegeben esc, dh, wenn Sie eingeben , jjkehren Sie zum normalen Modus zurück. Das hat nicht funktioniert, als ich es mit bind ausprobiert habe. Gibt es eine spezielle Möglichkeit, es zum Laufen zu bringen?
Jonah
@Jonah nicht, dass ich von off-hand weiß, aber ich habe die readline docs in letzter Zeit nicht durchgesehen ...
derobert
@chishaku Sie müssen Jonahs Namen ein at-Zeichen voranstellen ( @), sonst erhält er keine Benachrichtigung.
Derobert
2
@Jonah Ich habe gerade versucht, das Gleiche zu tun. Hast du das jemals herausgefunden?
Chishaku
1
unix.stackexchange.com/questions/303282/… Sie brauchen aus irgendeinem Grund Zitatebind '"jk":vi-movement-mode'
Hielke Walinga