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

Vim 如何在 insert 状态下高效移动光标到括号外

  •  
  •   yiningyang1228 · 2019-10-12 05:43:01 +08:00 · 7369 次点击
    这是一个创建于 1629 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 Vim 之后感觉是非常爽,但是有个地方一只觉得挺麻烦,就是在打括号的时候,如果需要跳到括号外,需要很复杂的操作。

    举例说明:

    if (a == b) return c;
    

    当输入 if 语句时,我是先打 if, 再打左括号(,这时候自动补全出右括号,光标自动出现在括号中间。再输入括号内的内容a==b, 这时候需要从右括号中跳出。 我现在的操作是:Cmd+[ 回到命令模式,l光标向右移一次, a到括号外,并进入 insert 模式,输入之后的内容。

    但是感觉这么做贼麻烦,请问各位有什么比较简单的做法么?谢谢大家!

    52 条回复    2020-10-12 06:40:12 +08:00
    Jirajine
        1
    Jirajine  
       2019-10-12 05:54:12 +08:00 via Android
    一般文本编辑器自动补全关闭括号的时候还有一个操作:
    当你手动输入右括号时会自动将光标移到括号外面。

    不知道你 vim 怎么配置的,我一般在其他编辑器中使用 vim 输入模式,在 insert 下与一般编辑器无异。
    reus
        2
    reus  
       2019-10-12 05:54:57 +08:00
    A 可以少一次移动

    或者直接输入 )
    binux
        3
    binux  
       2019-10-12 06:07:38 +08:00
    不用自动补全
    binux
        4
    binux  
       2019-10-12 06:10:43 +08:00
    @binux #3 讲真我是用 60% 键盘的 fn+' 移动光标的
    rykka
        5
    rykka  
       2019-10-12 06:19:13 +08:00 via Android
    esc+A
    weixiangzhe
        6
    weixiangzhe  
       2019-10-12 06:48:09 +08:00 via Android
    单行用 ctrl b f 移动
    jessun1990
        7
    jessun1990  
       2019-10-12 07:13:44 +08:00
    我的方法是,先输入 if (), 再退到命令模式,h 移动到括号处,插入模式,输入 a == b,退到命令模式,再 A 到行尾巴继续操作。
    看上有些复杂了。形成这样习惯的原因是,有时候输入 if ( 时候,右括号没有自动补齐,而整个文件的 syntax highlight 这时出现错误,Ale 插件也会报错。
    我是把我的 linux 和 mac 下的 capslock 按键替换成 esc 键,使用小拇指来控制模式切换。对我来说,较大幅度降低了 esc 模式切换的时间成本。
    yiningyang1228
        8
    yiningyang1228  
    OP
       2019-10-12 07:16:00 +08:00
    @Jirajine 我之前也是这样配置的,但是感觉有些麻烦😂
    yiningyang1228
        9
    yiningyang1228  
    OP
       2019-10-12 07:16:10 +08:00
    @reus 学到了,感谢!
    yiningyang1228
        10
    yiningyang1228  
    OP
       2019-10-12 07:17:48 +08:00
    @jessun1990 感谢您的回复!我是把 Capslock 和 left-control 换了,这样的话按和 Control 的快捷键方便一些。
    yiningyang1228
        11
    yiningyang1228  
    OP
       2019-10-12 07:19:39 +08:00
    @weixiangzhe 嗯嗯,我之前也是 imap 的方向键映射成了 ctrl b f n p,但是后来感觉这么做还得配置😂有点麻烦。要不我再去弄回来吧,感谢回复!
    DiamondbacK
        12
    DiamondbacK  
       2019-10-12 07:44:57 +08:00   ❤️ 1
    你一定是用了自动补全括号的插件,而这个插件又没有同时考虑到这个问题。
    我一直是用的自己写的括号补全,而在打闭括号时,如果右方是相同的闭括号,则自动变成移出。
    gayhub: Ace-Who/vim-AutoPair
    DiamondbacK
        13
    DiamondbacK  
       2019-10-12 07:51:06 +08:00
    另外,insert mode 下将 jk 映射为 Esc。
    hanxiV2EX
        14
    hanxiV2EX  
       2019-10-12 07:55:26 +08:00 via Android
    w 我按的最多
    pkookp8
        15
    pkookp8  
       2019-10-12 07:56:07 +08:00 via Android
    不用括号补全😂
    jessun1990
        16
    jessun1990  
       2019-10-12 07:56:59 +08:00
    @yiningyang1228 请教一下,我的使用感受是:ctrl 按键使用频率较低。请问兄台把 ctrl 放在 capslock 的原因是??
    xml123
        17
    xml123  
       2019-10-12 08:01:10 +08:00
    你可以用方向键啊
    IsaacYoung
        18
    IsaacYoung  
       2019-10-12 08:10:23 +08:00
    shift + a 在本行最后插入
    shift + i 在本行开头插入
    xiulu
        19
    xiulu  
       2019-10-12 08:13:35 +08:00 via Android
    @xml123 用了 vim 后,就忘记了什么是方向键。即使方向键只要一次操作,而且命令需要两次操作( ESC,和 A )。但还是会选择后者,因为总感觉伸手到右下角找方向键有种奇怪的感觉,会打断那种流畅感。
    最起码在我看来,是这样的。
    Sainnhepark
        20
    Sainnhepark  
       2019-10-12 08:16:00 +08:00 via Android
    我记得是 auto pairs 有这样一个功能,当插入模式下位于括号内的时候,再按一次右括号就可以跳转到右括号的位置
    wweir
        21
    wweir  
       2019-10-12 08:17:39 +08:00 via Android
    alt+hjkl,另外还有:
    alt+oO,另起新行
    Ctrl+l,选中整行
    alt+[],在跳转中前进后退

    PS: 我用的编辑器、IDE 全部都配置了这套快捷键。
    PPS: 这套快捷键唯一的问题是 Windows 上,部分编辑器不好配置,alt 被 Windows 窗口管理器拦截了
    Sparetire
        22
    Sparetire  
       2019-10-12 08:21:01 +08:00 via Android
    ctrl+o 然后 l
    Yggdroot
        23
    Yggdroot  
       2019-10-12 08:24:27 +08:00 via Android
    可以自己定义一些 imap,原生功能 Ctrl-right 可以实现你想要的。
    另外,可以使用 snips 插件,一路按 tab 就可以了。
    janus77
        24
    janus77  
       2019-10-12 08:27:57 +08:00 via iPhone
    end 键
    gimp
        25
    gimp  
       2019-10-12 08:39:46 +08:00
    我特意观察了下,我没用括号自动补全的插件,但是打'('会同时打')',Esc, i 回到括号输入内容,Esc, l, a, 空格继续写代码,习惯了的话挺快的,找自己喜欢的方式形成肌肉记忆就行,最重要的是操作流畅就好
    ysn2233
        26
    ysn2233  
       2019-10-12 08:43:39 +08:00
    我是把 ctrl+A 和 ctrl+E 在插入模式下 map 为 home 和 end (就是 emacs 模式的跳转到行首和尾部,和终端一样),这样打完直接 ctrl + e
    guog
        27
    guog  
       2019-10-12 08:45:40 +08:00 via Android
    @jessun1990 命令行快捷键用 Ctrl 用的多
    +a 行首
    +e 行尾,自动补全
    +c /+d 取消
    guog
        28
    guog  
       2019-10-12 08:46:30 +08:00 via Android
    @guog vim 块编辑+v
    guonaihong
        29
    guonaihong  
       2019-10-12 09:01:15 +08:00
    %a 或者
    %%a
    fangquanquan
        30
    fangquanquan  
       2019-10-12 09:10:16 +08:00
    inoremap <C-h> <Left>
    inoremap <C-j> <Down>
    inoremap <C-k> <Up>
    inoremap <C-l> <Right>

    我的配置,尽可能让 i 模式下的操作习惯和普通模式一样。 另外我也把 Capslock 和 left-control 换了,按<C+l>非常方便。
    TheWalkingDead
        31
    TheWalkingDead  
       2019-10-12 09:13:54 +08:00
    if (a == b) return c;

    我一般操作习惯看你要跳转的这个地方的位置,如果)正好在最后一个,我可能直接 ctrl+4 直接到行末尾,然后 i/a/A。

    如果括号在中间,我一般是 f 查找然后),然后 i/a/A。

    其实习惯了各个键的话,哪种都差不多,没有感觉很累赘。
    joshua7v
        32
    joshua7v  
       2019-10-12 09:14:43 +08:00 via iPhone
    在系统级别 map 上下左右
    因为在非 vim 中很多时候也需要
    chengyiqun
        33
    chengyiqun  
       2019-10-12 09:15:30 +08:00
    idea 飘过, ctrl + shift + enter.
    可能是姿势问题, 我用 vim 并没感觉效率提升多少.
    ScepterZ
        34
    ScepterZ  
       2019-10-12 09:16:23 +08:00
    可以配置 caps+esdf 来控制上下左右,之前这样用了很长时间,非常舒适,只是需要键盘支持,或者 win 上可以用 ahk
    jdhao
        35
    jdhao  
       2019-10-12 09:26:10 +08:00 via Android
    原生 vim 没有自动补全括号的功能,可能是你装了插件,使用 verbose imap ( 可以查看是哪个地方设置了这个映射。

    我现在用的是 auto-pairs 这个插件,可以自动补全各种括号或者 quotation,输入左括号,自动补全右括号,括号里面输入完毕,再按一次右括号,光标自动移动到右括号的后面,可以继续输入,还是比较方便的,不会打断编辑的工作流
    weishu
        36
    weishu  
       2019-10-12 09:29:58 +08:00
    ctrl + o, A 路过

    > ctrl + o: 再插入模式下执行一个命令,然后回到插入模式。
    zeny620
        37
    zeny620  
       2019-10-12 09:30:15 +08:00
    如果用的 ‘ Plug 'jiangmiao/auto-pairs' 括号补全插件,内置 alt+n 跳出括号
    ilaipi
        38
    ilaipi  
       2019-10-12 09:42:15 +08:00
    我基本上是 kj 退出 insert 然后 按 e 或者 w

    kj 在 insert 模式映射到了 esc
    uyhyygyug1234
        39
    uyhyygyug1234  
       2019-10-12 09:50:52 +08:00
    直接输入 ) 就会跳出了啊
    darksword21
        40
    darksword21  
       2019-10-12 10:04:21 +08:00
    直接 ) +1
    laumm1314
        41
    laumm1314  
       2019-10-12 10:06:19 +08:00
    我用这个插件很方便 Plug 'jiangmiao/auto-pairs'
    wuhuaji
        42
    wuhuaji  
       2019-10-12 10:20:44 +08:00
    这个情况我也考虑过。和上面很多朋友类似,都是先切换回普通模式,然后再跳转到需要编辑的地方插入。

    这里通常是需要跳转到行末,所以 ESC(或者其他自定义普通模式键) + A 即可。

    然而这个按键组合还是有点麻烦,我是自定义了一个:
    imap aa <ESC>A

    编辑模式下,直接 aa 就可跳到行末去编辑。
    yiningyang1228
        43
    yiningyang1228  
    OP
       2019-10-12 10:21:09 +08:00
    @DiamondbacK 我其实是在 Intellij 里面用了 Vim 插件,所以遇到了这个问题😂,好像没有自动移出的功能。
    kindjeff
        44
    kindjeff  
       2019-10-12 10:21:20 +08:00
    想了半天为什么我没遇到过,最后发现我是用上下左右
    yiningyang1228
        45
    yiningyang1228  
    OP
       2019-10-12 10:22:46 +08:00
    @jessun1990 因为 mac 系统自带的全局快捷键一般都是和 Ctrl 绑定的,比如往左是 ctrl+b,往右是 ctrl+f, 到行首是 ctrl+a, 当行末是 ctrl+e, 往上是 ctrl+p,往下是 ctrl+n,等等,所以把大小写改成了 ctrl 这样子方便很多。
    yiningyang1228
        46
    yiningyang1228  
    OP
       2019-10-12 10:23:19 +08:00
    @xiulu 对对对我也觉得,收放在主键盘区就很舒服
    yiningyang1228
        47
    yiningyang1228  
    OP
       2019-10-12 10:25:20 +08:00
    @wuhuaji 这个做法有点赞👍
    MaxTan
        48
    MaxTan  
       2019-10-12 10:52:42 +08:00
    切回 Normal 模式然后 A 就直接插入到行尾了

    esc 绑定到 Caps Lock 上,习惯性小拇指狂按 Caps Lock,非编辑状态下一直保持 Normal 模式,Normal 模式下用 jkeb 再配合 aAoOiI 快速定位插入内容

    vim 用好的窍门就是狂按 Caps Lock,也就是狂切 Normal 模式, 有事没事都抽风狂按那种,啥时候能练出帕金森的小拇指就差不多了
    yiningyang1228
        49
    yiningyang1228  
    OP
       2019-10-12 11:41:56 +08:00
    @MaxTan 哈哈哈太真实了
    Xbluer
        50
    Xbluer  
       2019-10-12 17:32:55 +08:00
    我一直是这样的
    imap (d ()<Esc>i
    插入模式下输入 (d 自动不齐括号,并且光标也在中间。
    james122333
        51
    james122333  
       2019-10-12 20:57:47 +08:00
    imap 加上判断是否在括号内阿
    zuorn
        52
    zuorn  
       2020-10-12 06:40:12 +08:00
    我绑定了 option + hjkl 为方向键,所以按下 option + l 就好了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2701 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 15:36 · PVG 23:36 · LAX 08:36 · JFK 11:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.