TL; DR
Bash有一个类似的功能zsh的bindkey通过bind,但它并没有几个vi模式,如zsh。完成后set -o vi:
bind '"jk":vi-movement-mode'
等于zsh的bindkey -M <all vi modes> jk vi-movement-mode
该vi-movement-mode函数来自inputrc(见/etc/inputrc他们的列表)。
全文
正如史蒂芬·哈里斯(Stephen Harris)在评论中指出的那样:
几个发行版附带一个.bash_profile骨架,看起来如下:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
这是一个很好的内容,.bash_profile因为您可以简单地忘记它的存在。
现在,映射jk到Esc在shell会话,这是不是真的有可能。当您这样做时:
inoremap jk <esc>
在Vim中,键入之后j,Vim知道需要稍等一下以查看是否键入knext,它应该调用映射(或者键入另一个键,并且不应触发该映射)。作为补充,这由:set timeoutlen=<miliseconds>Vim 控制(请参阅参考资料:h timeoutlen)。
几个shell或X11没有此类超时控制,并且不允许多个字符映射。仅允许单个键的映射(但请参阅下面的支持说明。)。
set -o vi
不读取.vimrc,它仅模仿可以在shell中使用的某些vi(甚至不是vim)按键组合。可以说同样的话-o emacs,它并不具有强大的能力emacs。
zsh支持
zsh实际上支持地图超时。您可以使用以下内容映射jk到<esc>:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(那将需要去~/.zshrc不~/.bashrc)
但是,我建议不要这样做。我使用vim和zsh大部分的时间。我有inoremap jk <esc>,我vimrc确实尝试过使用bindkey以上组合。 zsh等待太久才能j使用它打印,这让我很烦。
bash支持
bash支持readline bind。我相信bash可以在不进行编译的情况下进行编译,readilne因此可能会有一些罕见的系统具有不支持的bash bind(请注意)。要映射jk到<esc>in,bash您需要执行以下操作:
set -o vi
bind '"jk":"\e"'
(是的,这是双重报价,这是必需的)
同样,这使键入j变得很烦人。但是,某种程度上,它比zsh我的机器上的解决方案烦人(默认超时时间更短)。
解决方法(针对非bash和非zsh shell)
重新映射Esc键的原因是它在键盘上的位置很远,并且键入它需要花费时间。可以从emacs家伙那里借来的一个窍门是重新映射,CapsLock因为无论如何它都是无用的钥匙。 emacs伙计们Ctrl将其重新映射到,但我们将其重新映射到Esc。
让我们使用xev -event keyboard来检查键码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
并检查以下功能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
很好,CapsLock是键码66,其Esc功能称为“转义”。现在我们可以做:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
以上必须按此顺序进行。现在,每次敲击CapsLock它就像一把Esc钥匙。
棘手的部分是在哪里设置。~/.Xmodmap具有以下内容的文件:
remove lock = Caps_Lock
keycode 66 = Escape
大多数发行版都应该尊重发行版(实际上是显示管理器,但我说的发行版是为了简单起见),但是我看到那些不尊重多个~/X*文件的发行版。对于此类发行版,您可以尝试类似的操作:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
在你的.bashrc。
(从理论上讲,这会更好,~/.xinitrc但是如果显示经理不尊重.Xmodmap它,那么绝对不会尊重~/.xnintrc。)
附加说明:这仅在X11会话中重新映射CapsLock到Esc,因此该映射仅在终端仿真器中有效。实际tty的不会看到地图。
参考资料和额外阅读:
jk?键盘上有一些特殊的键吗?