V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
jdhao
V2EX  ›  Vim

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

  •  
  •   jdhao · Dec 28, 2020 · 4416 views
    This topic created in 1952 days ago, the information mentioned may be changed or developed.

    经常使用 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 replies    2021-02-26 14:55:16 +08:00
    seyoatda
        1
    seyoatda  
       Dec 28, 2020
    所以你的方案实现的思路是怎样的呢?可以简单说说吗?
    jdhao
        2
    jdhao  
    OP
       Dec 28, 2020 via Android
    @seyoatda 按下 k 的时候,检测少一个字符是否是 j,并且判断两者按下时间之差,小于阈值就认为是 esc,大于阈值认为用户想输入 jk 。
    jdhao
        3
    jdhao  
    OP
       Dec 28, 2020 via Android
    @jdhao 少一个 --> 前一个
    Les1ie
        4
    Les1ie  
       Dec 28, 2020
    如果我从系统剪切板粘贴一个字符串进去,比如 asdfghjkl 到 vim 中 这里的 jk 会被识别为想要退出么?
    fps23dot9999
        5
    fps23dot9999  
       Dec 28, 2020
    应该用脚踏板
    jdhao
        6
    jdhao  
    OP
       Dec 28, 2020
    @Les1ie 不会触发退出,粘贴字符,和用户输入行为不一样。
    jdhao
        7
    jdhao  
    OP
       Dec 28, 2020
    @fps23dot9999 脚踏板也不错,或者一个可以锤的按键作为 esc 也不错。
    vision1900
        8
    vision1900  
       Dec 28, 2020
    The abbreviation JK stands for joshi kōsei (女子高生) and means "female high school student".
    - 维基百科对 JK 的解释
    wd
        9
    wd  
       Dec 28, 2020 via iPhone
    我直接用右 shift 退出
    billlee
        10
    billlee  
       Dec 28, 2020
    我直接把 caps lock 和 esc 对换了
    jdhao
        11
    jdhao  
    OP
       Dec 28, 2020 via Android
    @billlee 也可以,但是需要第三方工具,不方便维护,我想要跨平台的通用方案,最好不要每个平台都配置一遍。
    weifengzi2009
        12
    weifengzi2009  
       Dec 28, 2020
    我都是直接用 Ctrl + [代替 Esc 。。不需任何设置
    JJstyle
        13
    JJstyle  
       Dec 28, 2020 via iPhone
    纯疑问,本来按一个 esc 键就能退出,为啥要按两个键 jk 呢?
    FurN1
        14
    FurN1  
       Dec 28, 2020 via iPhone
    @JJstyle 这样做的理由显然是手指不用离开默认行。
    jdhao
        15
    jdhao  
    OP
       Dec 28, 2020 via Android
    @weifengzi2009 嗯,每个人习惯不同,对于我来说,ctrl-[ 不便敲击,我的手需要厉害基准键去敲击 ctrl-[,jk 正好就在手指下面,敲击更加方便迅速。
    jdhao
        16
    jdhao  
    OP
       Dec 28, 2020 via Android
    @JJstyle 按 esc 左手要离开键盘,反而不方便
    lancelock
        17
    lancelock  
       Dec 29, 2020 via iPhone
    一般用 ctrl o
    jdhao
        18
    jdhao  
    OP
       Dec 29, 2020
    @lancelock 把 ctrl-o 映射为 esc? ctrl-o 本身在 insert 模式也是有作用的。
    dragondove
        19
    dragondove  
       Dec 29, 2020
    @jdhao 跨平台确实艰难,win 下可以用 autohotkey 或者 powertoys 来替换 esc 和 cpas 。linux 下比较麻烦,一般都是在 X11 环境下 xmodmap 来改,我为了通用性直接改 scancode 到 keycode 的映射。更加好的方案是直接改键盘本身,但是我对硬件一窍不通,没法玩。
    jdhao
        20
    jdhao  
    OP
       Dec 29, 2020 via Android
    @dragondove 机械键盘有的可以编程更改按键功能,macOS 下有 Karabiner 也可以更改按键功能,不需要太多硬件知识。
    weifengzi2009
        21
    weifengzi2009  
       Dec 30, 2020
    @jdhao #15 嗯嗯,感觉用 jk 的人还挺多的。
    atomduanvex
        22
    atomduanvex  
       Feb 26, 2021
    拍 ESC 是使用 vi 的灵魂所在
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2411 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 01:46 · PVG 09:46 · LAX 18:46 · JFK 21:46
    ♥ Do have faith in what you're doing.