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

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

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

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

    例如下面的代码:

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

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

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

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

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

    括号同理。
    kongse
        9
    kongse  
       2017-02-20 17:40:49 +08:00
    可以用 Autokey 自己编一个, WIn + 1 插入一对括号, Win + 2 插入两个括号, WIn + Shift + 1 插入<>等,插入后自动移动到中间位置。编好了每个编辑器都能通用。
    majixian621
        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
    wudanyang
        11
    wudanyang  
       2017-02-20 18:43:04 +08:00
    while () <c-[>isomething<c-[>Asomthing
    woohaha
        12
    woohaha  
       2017-02-20 18:48:47 +08:00
    先装 surround.vim,再定义^l 为右键
    TerrenceSun
        13
    TerrenceSun  
       2017-02-20 19:31:49 +08:00
    可以试试 ctrl+o ,临时进可视模式
    binux
        14
    binux  
       2017-02-20 19:38:04 +08:00
    对的,我就是用那种最复杂的方式写括号,然后 ESC 移动再插入的。
    插件帮我闭合了我还不习惯!
    loading
        15
    loading  
       2017-02-20 19:38:38 +08:00 via Android
    难道不是按 (,然后直接出 (光标)

    现在连手机输入法都是直接出一对啦……
    rrfeng
        16
    rrfeng  
       2017-02-20 19:53:20 +08:00
    不应该是各语言的自动 snippet 插件搞定吗?
    DiamondbacK
        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' 几个字。
    loryyang
        18
    loryyang  
       2017-02-20 20:46:46 +08:00
    “从开始写代码的时候,老师就教如果写括号,要先写括号,再写括号里面的内容”
    这个是怕你写错括号的匹配吗?感觉意义不大,我都是分开打的。一般括号里面的内容不多,都不会漏的。万一真漏了,编译( cpp )或者运行( python )时都会提醒的
    不过你那样写也没问题,并不是很麻烦
    DiamondbacK
        19
    DiamondbacK  
       2017-02-20 20:46:51 +08:00
    typo:
    call feedkeys('a', a:char, 'n')
    correct:
    call feedkeys('a'. a:char, 'n')
    klesh
        20
    klesh  
       2017-02-20 20:55:32 +08:00
    TJT
        21
    TJT  
       2017-02-20 21:09:10 +08:00
    @loryyang 你可以试一下去写 Lisp :D
    chemzqm
        22
    chemzqm  
       2017-02-20 21:50:00 +08:00
    iRiven
        23
    iRiven  
       2017-02-20 22:06:28 +08:00
    同问
    noclyt
        24
    noclyt  
       2017-02-20 23:21:58 +08:00
    天哪, VIM 打个括号竟然这么麻烦! Emacs 围观 ing
    ywt474000158
        25
    ywt474000158  
       2017-02-20 23:29:19 +08:00
    习惯之后感觉会记得没闭合的括号吧, 难道是我写的都太简单了...
    pysama
        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

    不谢~
    pysama
        27
    pysama  
       2017-02-21 00:26:29 +08:00
    哦,还得补上这个执行语句:
    ``` 
    au FileType php,c,python,javascript,html,css exe AutoClose()
    ```
    Immortal
        28
    Immortal  
       2017-02-21 09:18:59 +08:00
    已经脱离纯 vim 了
    一直是 idea+vim 插件的方案
    idea 下的 vim 操作还是相对接近原生 也有自己的可配置文件
    又能使用 idea 这类 ide 带来的便利
    nG29DOMuRYTWfcSr
        29
    nG29DOMuRYTWfcSr  
       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/
    flniu
        30
    flniu  
       2017-02-21 13:25:15 +08:00
    在 Vim 下一直习惯先打开括号、打完内容、再打闭括号。`set showmatch` 之后,漏打多打闭括号都不太可能。
    autoclose 类的插件没有用过。如果能做到 idea 系的效果也是不错的:输入开括号时自动在光标后添加闭括号,若手工再输入闭括号则自动覆盖(相当于向右移动光标)。这样在关注括号里内容时可以省略输入闭括号,在需要输入括号后内容时可以最大限度避免思路中断。
    iEverX
        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
    waruqi
        32
    waruqi  
       2017-02-21 18:21:37 +08:00
    写个括号。没必要整的这么复杂吧。。直接顺序手打 ( . ) 下就行了。。
    JamesRuan
        33
    JamesRuan  
       2017-02-21 20:05:53 +08:00
    谁让你们一开始就把括号闭起来的啦,最后闭合一点问题都没有。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3373 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 11:02 · PVG 19:02 · LAX 03:02 · JFK 06:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.