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
?键盘上有一些特殊的键吗?