TL; DR
Bash benzer işlevsellik vardır zsh's bindkeyaracılığıyla bind, ancak birkaç yok vigibi modları zsh. Sonra set -o viyapabilirsin:
bind '"jk":vi-movement-mode'
ki zsh'nin eşdeğeribindkey -M <all vi modes> jk vi-movement-mode
vi-movement-modeFonksiyonlar geliyor inputrc(Bkz /etc/inputrcbunların listesi için).
Tam metin
Stephen Harris'in yorumunda belirttiği gibi:
Birkaç dağıtım .bash_profileaşağıdaki gibi görünen bir iskeletle gelir:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
Bu .bash_profilesadece var olduğunu unutabileceğiniz için iyi bir içerik .
Şimdi, kabuk oturumunda eşlemek jkiçin Esc, bu gerçekten mümkün değil. Yaptığınızda:
inoremap jk <esc>
Vim'de, yazdıktan sonra Vim, bir sonraki jyazıp yazmadığınızı görmek için biraz beklemesi gerektiğini bilir kve eşlemeyi çağırması gerekir (veya başka bir anahtar yazmanız ve eşlemenin tetiklenmemesi gerekir). Bir zeyilname olarak bu :set timeoutlen=<miliseconds>Vim tarafından kontrol edilir (bakınız :h timeoutlen).
Birçok kabuğun veya X11'in böyle bir zaman aşımı kontrolü yoktur ve çoklu karakter eşlemelerine izin vermez. Yalnızca tek bir anahtarın eşlenmesine izin verilir (Ancak aşağıdaki destek notlarına bakın.).
set -o vi
Okumuyor mu .vimrc, yalnızca bazı taklit vi(hatta vimkabukta kullanılabilir) tuş kombinasyonları. Aynı şey söylenebilir -o emacs, tam gücü ile gelmez emacs.
zsh desteği
zshaslında harita zaman aşımını destekler. Ve aşağıdakileri eşlemek jkiçin aşağıdakileri kullanabilirsiniz <esc>:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(Yani gitmek gerekir ~/.zshrcdeğil ~/.bashrc)
Yine de buna karşı tavsiyede bulunuyorum. Kullandığım vimve zshçoğu zaman. Ben inoremap jk <esc>benim, vimrcve ben kullanmayı deneyin vermedi bindkeyyukarıdaki kombinasyonu. kullanırken zshyazdırmak için çok uzun süre bekler jve bu beni çok rahatsız etti.
bash desteği
bashdestekler readline bind. Bunun basholmadan derlenebileceğine inanıyorum, readilnebash'ı desteklemeyen bind(dikkatli olun) bazı nadir sistemler olabilir . Eşleştirmek için jkhiç <esc>de bashyapmanız gereken:
set -o vi
bind '"jk":"\e"'
(evet, bu iki kat tekliflidir, gereklidir)
Yine, bu yazmayı joldukça can sıkıcı hale getirir . Ancak bir şekilde zshmakinemdeki çözümden daha az can sıkıcı (muhtemelen varsayılan zaman aşımı daha kısadır).
Geçici çözüm (bash olmayan ve zsh olmayan kabuklar için)
EscTuşun yeniden eşlenmesinin nedeni , klavyede oldukça uzakta olması ve yazmanın zaman almasıdır. Adamlardan ödünç alınabilecek bir hile, yine de işe yaramaz bir anahtar emacsolduğu için yeniden tanımlamaktır CapsLock. emacsçocuklar bunu yeniden eşleştireceğiz Ctrlama yeniden eşleştireceğiz Esc.
Şu xev -event keyboardkodları kontrol etmek için kullanalım 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
Ve işlevini kontrol etmek için 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
Çok iyi, CapsLock66 tuş kodudur ve Escişlevine "Escape" denir. Şimdi yapabiliriz:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
Yukarıda gerekir bu sırada yapılması. Şimdi her vurduğunuzda CapsLockbir Escanahtar gibi çalışıyor .
Zor kısmı bunu nereye ayarlayacağınız. ~/.Xmodmapİçeriği olan bir dosya :
remove lock = Caps_Lock
keycode 66 = Escape
Çoğu dağıtım tarafından saygı duyulmalıdır (aslında ekran yöneticileri, ancak basitlik için dağıtımlar söylüyorum), ancak birkaç ~/X*dosyaya saygı duymayanları gördüm . Bu tür dağıtımlar için aşağıdakileri deneyebilirsiniz:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
Sizin .bashrc.
(Teorik olarak daha iyi yerleştirilir, ~/.xinitrcancak bir ekran yöneticisi saygı .Xmodmapduymazsa kesinlikle saygı göstermez ~/.xnintrc.)
Ekstra not: Bu sadece remaps CapsLockiçin Esc, bir X11 oturumda dolayısıyla haritası olacak terminal emülatörlerine sadece eser. Güncel ttyharita görmeyecek.
Kaynaklar ve ek okuma:
jk? Klavyenizdeki özel bir tuş mu bu?