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

Vim 党 书写括号的正确方式是什么

  •  
  •   miaoxia · 2017-02-20 16:23:24 +08:00 · 3725 次点击
    这是一个创建于 970 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从开始写代码的时候,老师就教如果写括号,要先写括号,再写括号里面的内容

    例如下面的代码:

    • while((i >> 1) > 0)

    普通的 text 的书写顺序是:(<-代表左箭头,->代表右箭头)

    • while()<-()<-i >> 1-> > 0

    在 Vim 的书写顺序是什么呢? 这是我的写法 感觉好复杂- -

    • while()Esci()Escii >> 1Esclli > 0
    33 回复  |  直到 2017-02-21 20:05:53 +08:00
        1
    xss   2017-02-20 16:51:25 +08:00
    少年, 你需要插件 surround.vim
        2
    passion336699   2017-02-20 16:59:21 +08:00
    while
    左手小拇指按住 shift ,打();
    左手无名指按 ESC ,右手中指按 I ,打()里面的代码;
    ()里条件打完,同操作按 ESC ,左手小拇指按住 shift ,同时左手中指按$,同操作按 I ,再进行其他输入。。
    这个指法如何 @_@
        3
    daviswei   2017-02-20 16:59:26 +08:00
    别扮酷用 hjkl 来移动光标嘛。。。有专门的上下左右撒
        4
    lululau   2017-02-20 17:02:29 +08:00
    少年, 你需要插件 unimpaired.vim
        5
    xss   2017-02-20 17:03:30 +08:00
    @daviswei 专门的上下左右实在是鸡肋...hjkl 可以手指不用离开基础键就搞定移动. 否则手来回移来移去浪费时间.
        6
    lzhCoooder   2017-02-20 17:14:51 +08:00
    这种插件很多,我觉得你那样也不是很别扭比去按上下左右好多了
        7
    ltux   2017-02-20 17:15:36 +08:00
        8
    Tiande   2017-02-20 17:21:33 +08:00   ♥ 1
    善用各种 map 即可。

    譬如下面这个 map ,
    当你处于 i 模式输入 $t ,会插入书名号 <> ,且光标会移动到 <> 中间。(不需要 Esc 后调整光标位置)
    当你处于 v 模式输入 $t ,会用书名号 <> 立即包裹你选中的部分。
    ```
    vnoremap $t <esc>`>a><esc>`<i<<esc>
    inoremap $t <><esc>i
    ```

    括号同理。
        9
    kongse   2017-02-20 17:40:49 +08:00
    可以用 Autokey 自己编一个, WIn + 1 插入一对括号, Win + 2 插入两个括号, WIn + Shift + 1 插入<>等,插入后自动移动到中间位置。编好了每个编辑器都能通用。
        10
    majixian621   2017-02-20 18:28:39 +08:00
    配置自己的代码习惯吧, vim 里面默认$是行尾,但是$的位置确实有点尴尬,我自己就配置了两个快捷键, le,跳至行尾, lb 跳至行首,同时还可配置文本首尾的跳,还是比较方便的。 vimrc 如下,多练习就好了,我一直觉得码字的速度不是影响写代码的啊。。。。
    nmap lb ^
    nmap le $
    nmap lt H
    nmap ln L
    nmap lm M
        11
    wudanyang   2017-02-20 18:43:04 +08:00
    while () <c-[>isomething<c-[>Asomthing
        12
    woohaha   2017-02-20 18:48:47 +08:00
    先装 surround.vim,再定义^l 为右键
        13
    TerrenceSun   2017-02-20 19:31:49 +08:00
    可以试试 ctrl+o ,临时进可视模式
        14
    binux   2017-02-20 19:38:04 +08:00
    对的,我就是用那种最复杂的方式写括号,然后 ESC 移动再插入的。
    插件帮我闭合了我还不习惯!
        15
    loading   2017-02-20 19:38:38 +08:00 via Android
    难道不是按 (,然后直接出 (光标)

    现在连手机输入法都是直接出一对啦……
        16
    rrfeng   2017-02-20 19:53:20 +08:00
    不应该是各语言的自动 snippet 插件搞定吗?
        17
    DiamondbacK   2017-02-20 20:39:31 +08:00
    我自己没什么需求,全是手动打括号。
    ```
    inoremap jk <Esc>
    inoremap <Esc> <Nop>
    ```
    while ()jki<code-in>jkla<code-after>


    已经够简单了。如果非要搞一个 mapping 来省这么一点点力气,我这儿有个土法炮制刚出炉的:
    ```
    inoremap ( (<Esc>:call AutoParen(nr2char(getchar()))<CR>
    function! AutoParen(char)
    call feedkeys('a', a:char, 'n')
    if a:char != ')'
    call feedkeys(")\<Esc>i", 'n')
    endif
    endfunction
    ```

    这要智能一些,将连续输入 '()' 作为例外处理了。
    while (<code-in>jkla<code-after>
    少打 ')jki' 几个字。
        18
    loryyang   2017-02-20 20:46:46 +08:00
    “从开始写代码的时候,老师就教如果写括号,要先写括号,再写括号里面的内容”
    这个是怕你写错括号的匹配吗?感觉意义不大,我都是分开打的。一般括号里面的内容不多,都不会漏的。万一真漏了,编译( cpp )或者运行( python )时都会提醒的
    不过你那样写也没问题,并不是很麻烦
        19
    DiamondbacK   2017-02-20 20:46:51 +08:00
    typo:
    call feedkeys('a', a:char, 'n')
    correct:
    call feedkeys('a'. a:char, 'n')
        20
    klesh   2017-02-20 20:55:32 +08:00
        21
    TJT   2017-02-20 21:09:10 +08:00
    @loryyang 你可以试一下去写 Lisp :D
        22
    chemzqm   2017-02-20 21:50:00 +08:00
        23
    iRiven   2017-02-20 22:06:28 +08:00
    同问
        24
    noclyt   2017-02-20 23:21:58 +08:00
    天哪, VIM 打个括号竟然这么麻烦! Emacs 围观 ing
        25
    ywt474000158   2017-02-20 23:29:19 +08:00
    习惯之后感觉会记得没闭合的括号吧, 难道是我写的都太简单了...
        26
    pysama   2017-02-21 00:24:57 +08:00
    自动补全配置,输入左括号自动补全后括号,并进入 insert 模式

    " 括号自动补全
    func! AutoClose()
    :inoremap ( ()<ESC>i
    :inoremap " ""<ESC>i
    :inoremap ' ''<ESC>i
    :inoremap { {}<ESC>i
    :inoremap [ []<ESC>i
    endf

    不谢~
        27
    pysama   2017-02-21 00:26:29 +08:00
    哦,还得补上这个执行语句:
    ``` 
    au FileType php,c,python,javascript,html,css exe AutoClose()
    ```
        28
    Immortal   2017-02-21 09:18:59 +08:00
    已经脱离纯 vim 了
    一直是 idea+vim 插件的方案
    idea 下的 vim 操作还是相对接近原生 也有自己的可配置文件
    又能使用 idea 这类 ide 带来的便利
        29
    SpaceVim   2017-02-21 13:22:40 +08:00 via Android
    何不尝试 SpaceVim.
    SpaceVim 主页 https://spacevim.org
    SpaceVim 文档 https://spacevim.org/documentation

    当然你也可以看这篇博客,如何打造一个 Java IDE

    http://spacevim.org/use-vim-as-a-java-ide/
        30
    flniu   2017-02-21 13:25:15 +08:00
    在 Vim 下一直习惯先打开括号、打完内容、再打闭括号。`set showmatch` 之后,漏打多打闭括号都不太可能。
    autoclose 类的插件没有用过。如果能做到 idea 系的效果也是不错的:输入开括号时自动在光标后添加闭括号,若手工再输入闭括号则自动覆盖(相当于向右移动光标)。这样在关注括号里内容时可以省略输入闭括号,在需要输入括号后内容时可以最大限度避免思路中断。
        31
    iEverX   2017-02-21 17:23:37 +08:00
    忘了从哪个博客里看到的,用的挺顺手的

    inoremap ( ()<esc>i
    inoremap ) <c-r>=ClosePair(')')<cr>
    inoremap [ []<esc>i
    inoremap ] <c-r>=ClosePair(']')<cr>
    inoremap { {}<esc>i
    inoremap } <c-r>=ClosePair('}')<cr>
    inoremap (<cr> (<cr>)<esc>O
    inoremap [<cr> [<cr>]<esc>O
    inoremap {<cr> {<cr>}<esc>O

    function! ClosePair(char)
    if getline('.')[col('.')-1] == a:char
    return "\<Right>"
    else
    return a:char
    endif
    endfunction
        32
    waruqi   2017-02-21 18:21:37 +08:00
    写个括号。没必要整的这么复杂吧。。直接顺序手打 ( . ) 下就行了。。
        33
    JamesRuan   2017-02-21 20:05:53 +08:00
    谁让你们一开始就把括号闭起来的啦,最后闭合一点问题都没有。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2207 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 05:07 · PVG 13:07 · LAX 22:07 · JFK 01:07
    ♥ Do have faith in what you're doing.