V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jdhao
V2EX  ›  Vim

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

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

    经常使用 vim 的人,有可能使用下面的 mapping 回到 normal 模式:

    inoremap jk <esc>
    

    唯一不爽的是,每次按 j 的时候,vim 都会等待最多 timeoutlen 毫秒(默认是 1000 ms ),来判断用户是想输入 j 还是想输入 jk 跳出 insert 模式,所以输入 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   ·   实用小工具   ·   2945 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 14:35 · PVG 22:35 · LAX 06:35 · JFK 09:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.