TL; DR
Bash benzer işlevsellik vardır zsh
's bindkey
aracılığıyla bind
, ancak birkaç yok vi
gibi modları zsh
. Sonra set -o vi
yapabilirsin:
bind '"jk":vi-movement-mode'
ki zsh
'nin eşdeğeribindkey -M <all vi modes> jk vi-movement-mode
vi-movement-mode
Fonksiyonlar geliyor inputrc
(Bkz /etc/inputrc
bunların listesi için).
Tam metin
Stephen Harris'in yorumunda belirttiği gibi:
Birkaç dağıtım .bash_profile
aşağıdaki gibi görünen bir iskeletle gelir:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
Bu .bash_profile
sadece 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 vim
kabukta kullanılabilir) tuş kombinasyonları. Aynı şey söylenebilir -o emacs
, tam gücü ile gelmez emacs
.
zsh desteği
zsh
aslında harita zaman aşımını destekler. Ve aşağıdakileri eşlemek jk
için aşağıdakileri kullanabilirsiniz <esc>
:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(Yani gitmek gerekir ~/.zshrc
değil ~/.bashrc
)
Yine de buna karşı tavsiyede bulunuyorum. Kullandığım vim
ve zsh
çoğu zaman. Ben inoremap jk <esc>
benim, vimrc
ve ben kullanmayı deneyin vermedi bindkey
yukarıdaki kombinasyonu. kullanırken zsh
yazdırmak için çok uzun süre bekler j
ve bu beni çok rahatsız etti.
bash desteği
bash
destekler readline
bind
. Bunun bash
olmadan derlenebileceğine inanıyorum, readilne
bash'ı desteklemeyen bind
(dikkatli olun) bazı nadir sistemler olabilir . Eşleştirmek için jk
hiç <esc>
de bash
yapmanız gereken:
set -o vi
bind '"jk":"\e"'
(evet, bu iki kat tekliflidir, gereklidir)
Yine, bu yazmayı j
oldukça can sıkıcı hale getirir . Ancak bir şekilde zsh
makinemdeki çö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 emacs
olduğ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 keyboard
kodları 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, ~/.xinitrc
ancak bir ekran yöneticisi saygı .Xmodmap
duymazsa 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 tty
harita görmeyecek.
Kaynaklar ve ek okuma:
jk
? Klavyenizdeki özel bir tuş mu bu?