TL; DR
Bash hat eine ähnliche Funktionalität wie zsh
's bindkey
through' bind
, aber es gibt nicht mehrere vi
Modi wie zsh
. Nachdem set -o vi
Sie tun können:
bind '"jk":vi-movement-mode'
das ist das Äquivalent von zsh
'sbindkey -M <all vi modes> jk vi-movement-mode
Die vi-movement-mode
Funktionen kommen von inputrc
(siehe /etc/inputrc
für eine Liste von ihnen).
Voller Text
Wie Stephen Harris in seinem Kommentar betont:
Einige Distributionen haben ein .bash_profile
Skelett, das wie folgt aussieht:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
Welches ist ein guter Inhalt für, .bash_profile
da Sie einfach vergessen können, dass es existiert.
Nun zur Karte jkzu Escin der Shell - Sitzung, die nicht wirklich möglich ist. Wenn Sie das tun:
inoremap jk <esc>
In Vim jweiß Vim nach der Eingabe, dass es ein wenig warten muss, um zu sehen, ob Sie als knächstes eingeben, und es sollte die Zuordnung aufrufen (oder dass Sie einen anderen Schlüssel eingeben und die Zuordnung nicht ausgelöst werden sollte). Als Nachtrag wird dies von :set timeoutlen=<miliseconds>
in Vim kontrolliert (siehe :h timeoutlen
).
Einige Shells oder X11 haben keine solche Zeitüberschreitungssteuerung und erlauben keine Zuordnung mehrerer Zeichen. Es ist nur eine Zuordnung eines einzelnen Schlüssels zulässig (siehe jedoch die folgenden Support-Hinweise).
set -o vi
Liest nicht .vimrc
, es ahmt nur einige vi
(nicht einmal vim
) Tastenkombinationen nach, die in der Shell verwendet werden können. Das gleiche kann gesagt werden -o emacs
, es kommt nicht mit der vollen Kraft von emacs
.
zsh Unterstützung
zsh
unterstützt tatsächlich das Karten-Timeout. Und Sie können die folgende verwenden , um Karte jk
zu <esc>
:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(Das muss ~/.zshrc
nicht gehen ~/.bashrc
)
Ich rate jedoch davon ab. Ich benutze vim
und die zsh
meiste Zeit. Ich habe inoremap jk <esc>
in meinem vimrc
und ich habe versucht, die bindkey
obige Kombination zu verwenden. zsh
wartet zu lange, um zu drucken, j
wenn ich es benutze, und das hat mich sehr geärgert.
Bash-Unterstützung
bash
unterstützt readline
bind
. Ich glaube, dass bash
dies kompiliert werden kann, ohne readilne
dass es einige seltene Systeme gibt, die Bash haben, die nicht unterstützt werden bind
(seien Sie wachsam). Zur Karte jk
zu <esc>
in was bash
Sie tun müssen:
set -o vi
bind '"jk":"\e"'
(Ja, das ist eine doppelte Zitierstufe, es wird benötigt)
Auch dies macht das Tippen j
ziemlich nervig. Aber irgendwie weniger nervig als die zsh
Lösung auf meinem Computer (wahrscheinlich ist das Standard-Timeout kürzer).
Problemumgehung (für Nicht-Bash- und Nicht-Zsh-Shells)
Der Grund für die Neuzuordnung der EscTaste liegt darin, dass sie ziemlich weit entfernt auf der Tastatur liegt und das Eingeben einige Zeit in Anspruch nimmt. Ein Trick, der von den emacs
Jungs ausgeliehen werden kann, ist die Neuzuordnung, CapsLockda es sich sowieso um einen nutzlosen Schlüssel handelt. emacs
Jungs ordnen es neu zu, Ctrlaber wir werden es neu zuordnen Esc.
Lassen Sie uns xev -event keyboard
den Schlüsselcode von überprüfen CapsLock:
KeyPress event, serial 25, synthetic NO, window 0x1c00001,
root 0x496, subw 0x0, time 8609026, (764,557), root:(765,576),
state 0x0, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
Und um die Funktion von zu überprüfen Esc:
KeyPress event, serial 25, synthetic NO, window 0x1c00001,
root 0x496, subw 0x0, time 9488531, (571,525), root:(572,544),
state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
XLookupString gives 1 bytes: (1b) "
XmbLookupString gives 1 bytes: (1b) "
XFilterEvent returns: False
Sehr gut, CapsLockist der Schlüsselcode 66 und Escdie Funktion heißt "Escape". Jetzt können wir tun:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
Das Obige muss in dieser Reihenfolge erfolgen. Jetzt CapsLockfunktioniert es jedes Mal, wenn Sie es Escdrücken, wie eine Taste.
Der schwierige Teil ist, wo dies eingestellt werden soll. Eine Datei ~/.Xmodmap
mit dem Inhalt:
remove lock = Caps_Lock
keycode 66 = Escape
Sollte von den meisten Distributionen respektiert werden (eigentlich Display-Manager, aber ich sage der Einfachheit halber Distributionen), aber ich habe solche gesehen, die mehrere ~/X*
Dateien nicht respektieren . Für solche Distributionen können Sie Folgendes ausprobieren:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
In deinem .bashrc
.
(Theoretisch wäre das besser, ~/.xinitrc
aber wenn ein Display-Manager dies nicht respektiert .Xmodmap
, wird er es definitiv nicht respektieren ~/.xnintrc
.)
Zusätzliche Anmerkung: Diese remaps nur CapsLockauf Escin einer X11 - Sitzung, damit die Karte funktioniert nur in Terminal - Emulatoren. Tatsächlich tty
wird die Karte nicht angezeigt.
Referenzen und zusätzliche Lektüre:
jk
? Ist das eine spezielle Taste auf Ihrer Tastatur?