Vim 如何在 insert 状态下高效移动光标到括号外 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
yiningyang1228
V2EX    程序员

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

  •  < href="Javascript:" Onclick="downVoteTopic(608443);" class="vote">
  •   yiningyang1228 2019-10-12 05:43:01 +08:00 8594 次点击
    这是一个创建于 2193 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 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 移动
        7
    jessun1990  
       2019-10-12 07:13:44 +08:00
    我的方法是,先输入 if (), 再退到命令模式,h 移动到括号处,插入模式,输入 a == b,退到命令模式,再 A 到行尾巴继续操作。
    看上有些复杂了。形成这样习惯的原因是,有时候输入 if ( 时候,右括号没有自动补齐,而整个文件的 syntax highlight 这时出现错误,Ale 插件也会报错。
    我是把我的 linux 和 mac 下的 capslock 按键替换成 esc 键,使用小拇指来控制模式切换。对我来说,较大幅度降低了 esc 模式切换的时间成本。
    jessun1990
    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 就可以了。
    rb6221
        24
    rb6221  
       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 中很多时候也需要
    C02TobNClov1Dz56
        33
    C02TobNClov1Dz56  
       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  
    PRO
       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     Solana     1001 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 19:07 PVG 03:07 LAX 12:07 JFK 15:07
    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