经常使用 vim 的人,有可能使用下面的 mapping 回到 normal 模式:
inoremap jk <esc>
唯一不爽的是,每次按 j 的时候,vim 都会等待最多 timeoutlen 毫秒(默认是 1000 ms ),来判断用户是想输入 j 还是想输入 jk 跳出 inert 模式,所以输入 j 的时候,会有延迟感,有点讨厌。当然可以通过降低 timeoutlen 的值来减少这种延迟,但是 timeoutlen 是一个全局选项,如果减少 timeoutlen 会导致有的组合键来不及按下。
我写一个插件 better-escape.vim,专门针对跳出 insert mode 这种场景,不需要更改 timeoutlen 选项即可实现按下 j 无延迟感,快速按下 jk 即可跳出 insert 模式,同时也支持多个离开 insert mode 的快捷键,有这种需求的 Vimmer 可以试用。
![]() | 1 seyoatda 2020-12-28 18:16:46 +08:00 所以你的方案实现的思路是怎样的呢?可以简单说说吗? |
![]() | 2 jdhao OP @seyoatda 按下 k 的时候,检测少一个字符是否是 j,并且判断两者按下时间之差,小于阈值就认为是 esc,大于阈值认为用户想输入 jk 。 |
![]() | 4 Les1ie 2020-12-28 19:13:32 +08:00 如果我从系统剪切板粘贴一个字符串进去,比如 asdfghjkl 到 vim 中 这里的 jk 会被识别为想要退出么? |
5 fps23dot9999 2020-12-28 19:17:15 +08:00 应该用脚踏板 |
![]() | 7 jdhao OP @fps23dot9999 脚踏板也不错,或者一个可以锤的按键作为 esc 也不错。 |
8 vision1900 2020-12-28 20:40:22 +08:00 The abbreviation JK stands for joshi kōsei (女子高生) and means "female high school student". - 维基百科对 JK 的解释 |
![]() | 9 wd 2020-12-28 20:45:17 +08:00 via iPhone 我直接用右 shift 退出 |
10 billlee 2020-12-28 21:38:16 +08:00 我直接把 caps lock 和 esc 对换了 |
![]() | 11 jdhao OP @billlee 也可以,但是需要第三方工具,不方便维护,我想要跨平台的通用方案,最好不要每个平台都配置一遍。 |
![]() | 12 weifengzi2009 2020-12-28 22:38:05 +08:00 我都是直接用 Ctrl + [代替 Esc 。。不需任何设置 |
![]() | 13 JJstyle 2020-12-28 22:55:11 +08:00 via iPhone 纯疑问,本来按一个 esc 键就能退出,为啥要按两个键 jk 呢? |
![]() | 14 IgniteWhite 2020-12-28 22:58:29 +08:00 via iPhone @JJstyle 这样做的理由显然是手指不用离开默认行。 |
![]() | 15 jdhao OP @weifengzi2009 嗯,每个人习惯不同,对于我来说,ctrl-[ 不便敲击,我的手需要厉害基准键去敲击 ctrl-[,jk 正好就在手指下面,敲击更加方便迅速。 |
![]() | 17 lancelock 2020-12-29 11:03:25 +08:00 via iPhone 一般用 ctrl o |
![]() | 19 dragondove 2020-12-29 13:47:06 +08:00 @jdhao 跨平台确实艰难,win 下可以用 autohotkey 或者 powertoys 来替换 esc 和 cpas 。linux 下比较麻烦,一般都是在 X11 环境下 xmodmap 来改,我为了通用性直接改 scancode 到 keycode 的映射。更加好的方案是直接改键盘本身,但是我对硬件一窍不通,没法玩。 |
![]() | 20 jdhao OP @dragondove 机械键盘有的可以编程更改按键功能,macOS 下有 Karabiner 也可以更改按键功能,不需要太多硬件知识。 |
![]() | 21 weifengzi2009 2020-12-30 11:52:42 +08:00 @jdhao #15 嗯嗯,感觉用 jk 的人还挺多的。 |
![]() | 22 atomduanvex 2021-02-26 14:55:16 +08:00 拍 ESC 是使用 vi 的灵魂所在 |