[插件分享] better-escape.vim:无痛跳出 Vim insert 模式。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jdhao
V2EX    Vim

[插件分享] better-escape.vim:无痛跳出 Vim insert 模式。

  •  
  •   jdhao 2020-12-28 17:19:19 +08:00 3973 次点击
    这是一个创建于 1747 天前的主题,其中的信息可能已经有所发展或是发生改变。

    经常使用 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 可以试用。

    22 条回复    2021-02-26 14:55:16 +08:00
    seyoatda
        1
    seyoatda  
       2020-12-28 18:16:46 +08:00
    所以你的方案实现的思路是怎样的呢?可以简单说说吗?
    jdhao
        2
    jdhao  
    OP
       2020-12-28 18:21:15 +08:00 via Android
    @seyoatda 按下 k 的时候,检测少一个字符是否是 j,并且判断两者按下时间之差,小于阈值就认为是 esc,大于阈值认为用户想输入 jk 。
    jdhao
        3
    jdhao  
    OP
       2020-12-28 18:21:41 +08:00 via Android
    @jdhao 少一个 --> 前一个
    Les1ie
        4
    Les1ie  
       2020-12-28 19:13:32 +08:00
    如果我从系统剪切板粘贴一个字符串进去,比如 asdfghjkl 到 vim 中 这里的 jk 会被识别为想要退出么?
    fps23dot9999
        5
    fps23dot9999  
       2020-12-28 19:17:15 +08:00
    应该用脚踏板
    jdhao
        6
    jdhao  
    OP
       2020-12-28 20:15:37 +08:00
    @Les1ie 不会触发退出,粘贴字符,和用户输入行为不一样。
    jdhao
        7
    jdhao  
    OP
       2020-12-28 20:16:06 +08:00
    @fps23dot9999 脚踏板也不错,或者一个可以锤的按键作为 esc 也不错。
    vision1900
        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 的解释
    wd
        9
    wd  
       2020-12-28 20:45:17 +08:00 via iPhone
    我直接用右 shift 退出
    billlee
        10
    billlee  
       2020-12-28 21:38:16 +08:00
    我直接把 caps lock 和 esc 对换了
    jdhao
        11
    jdhao  
    OP
       2020-12-28 21:44:04 +08:00 via Android
    @billlee 也可以,但是需要第三方工具,不方便维护,我想要跨平台的通用方案,最好不要每个平台都配置一遍。
    weifengzi2009
        12
    weifengzi2009  
       2020-12-28 22:38:05 +08:00
    我都是直接用 Ctrl + [代替 Esc 。。不需任何设置
    JJstyle
        13
    JJstyle  
       2020-12-28 22:55:11 +08:00 via iPhone
    纯疑问,本来按一个 esc 键就能退出,为啥要按两个键 jk 呢?
    IgniteWhite
        14
    IgniteWhite  
       2020-12-28 22:58:29 +08:00 via iPhone
    @JJstyle 这样做的理由显然是手指不用离开默认行。
    jdhao
        15
    jdhao  
    OP
       2020-12-28 23:04:17 +08:00 via Android
    @weifengzi2009 嗯,每个人习惯不同,对于我来说,ctrl-[ 不便敲击,我的手需要厉害基准键去敲击 ctrl-[,jk 正好就在手指下面,敲击更加方便迅速。
    jdhao
        16
    jdhao  
    OP
       2020-12-28 23:06:45 +08:00 via Android
    @JJstyle 按 esc 左手要离开键盘,反而不方便
    lancelock
        17
    lancelock  
       2020-12-29 11:03:25 +08:00 via iPhone
    一般用 ctrl o
    jdhao
        18
    jdhao  
    OP
       2020-12-29 11:14:05 +08:00
    @lancelock 把 ctrl-o 映射为 esc? ctrl-o 本身在 insert 模式也是有作用的。
    dragondove
        19
    dragondove  
       2020-12-29 13:47:06 +08:00
    @jdhao 跨平台确实艰难,win 下可以用 autohotkey 或者 powertoys 来替换 esc 和 cpas 。linux 下比较麻烦,一般都是在 X11 环境下 xmodmap 来改,我为了通用性直接改 scancode 到 keycode 的映射。更加好的方案是直接改键盘本身,但是我对硬件一窍不通,没法玩。
    jdhao
        20
    jdhao  
    OP
       2020-12-29 14:20:47 +08:00 via Android
    @dragondove 机械键盘有的可以编程更改按键功能,macOS 下有 Karabiner 也可以更改按键功能,不需要太多硬件知识。
    weifengzi2009
        21
    weifengzi2009  
       2020-12-30 11:52:42 +08:00
    @jdhao #15 嗯嗯,感觉用 jk 的人还挺多的。
    atomduanvex
        22
    atomduanvex  
       2021-02-26 14:55:16 +08:00
    拍 ESC 是使用 vi 的灵魂所在
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     892 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 20:54 PVG 04:54 LAX 13:54 JFK 16:54
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86