在Vim中自动插入匹配的括号

Bob*_*Bob 64 vim autocomplete

我花的方式太多时间摸索周围因为Vim不处理花括号最喜欢的IDE做.这就是我想要发生的事情:

输入:

if( whatever )
{ <CR>
Run Code Online (Sandbox Code Playgroud)

得到这个:

if( whatever )
{
  |  
}
Run Code Online (Sandbox Code Playgroud)

其中<CR>意思是ENTER按键,|是光标的位置.这就是Eclipse的功能.这就是Visual Studio的功能.这就是我想让Vim做的事情.

我见过几个插件,试过几个,但似乎没有一个插件给我这种行为.当然,我不能成为第一个想要这个的程序员.

Mic*_*kis 33

在VimL中,您可以根据{需要将其映射到:

inoremap { {<CR>}<Esc>ko
Run Code Online (Sandbox Code Playgroud)

根据您的自动缩进设置,您可能希望将添加<BS><CR>.

对于更完整的解决方案,我建议你看看Luc Hermitte的vim插件.到目前为止,他们从未让我失望过.

  • 是的,`{<CR>`是可能的.这就是我的.vimrc` {<CR> {<CR>} <Esc> ko`中的内容 (4认同)
  • @Evan - 粘贴代码时,很多东西都会出错,特别是使用自动缩进等.尝试:在粘贴之前设置粘贴,然后:完成后设置nopaste.这会切换粘贴模式. (2认同)

Nik*_*dze 25

不需要插件。更干净、更灵活的解决方案:

inoremap { {}<Esc>ha
inoremap ( ()<Esc>ha
inoremap [ []<Esc>ha
inoremap " ""<Esc>ha
inoremap ' ''<Esc>ha
inoremap ` ``<Esc>ha
Run Code Online (Sandbox Code Playgroud)


Der*_*har 16

要在新行上获得右括号并将光标放在两个括号之间的行上,请遵循标题为" 使括号和括号处理更容易 "的文章中第一条注释的建议.

  • 你能在这里写出如何做到这一点吗?这个问题的访问者不希望被引导到越来越多的疯狂追逐链接. (15认同)

dmo*_*oly 9

使用AutoClose与以下工作正常.

inoremap {<CR> {<CR>}<C-o>O
Run Code Online (Sandbox Code Playgroud)

至少对我的系统来说这是真的(Mac OS X上的Unix终端).


ZyX*_*ZyX 8

这是我在 vimrc 中的内容:

let s:pairs={
            \'<': '>',
            \'{': '}',
            \'[': ']',
            \'(': ')',
            \'«': '»',
            \'„': '“',
            \'“': '”',
            \'‘': '’',
        \}
call map(copy(s:pairs), 'extend(s:pairs, {v:val : v:key}, "keep")')
function! InsertPair(left, ...)
    let rlist=reverse(map(split(a:left, '\zs'), 'get(s:pairs, v:val, v:val)'))
    let opts=get(a:000, 0, {})
    let start   = get(opts, 'start',   '')
    let lmiddle = get(opts, 'lmiddle', '')
    let rmiddle = get(opts, 'rmiddle', '')
    let end     = get(opts, 'end',     '')
    let prefix  = get(opts, 'prefix',  '')
    let start.=prefix
    let rmiddle.=prefix
    let left=start.a:left.lmiddle
    let right=rmiddle.join(rlist, '').end
    let moves=repeat("\<Left>", len(split(right, '\zs')))
    return left.right.moves
endfunction
 noremap! <expr> ,f   InsertPair('{')
 noremap! <expr> ,h   InsertPair('[')
 noremap! <expr> ,s   InsertPair('(')
 noremap! <expr> ,u   InsertPair('<')
Run Code Online (Sandbox Code Playgroud)

而且,对于某些文件类型:

inoremap {<CR> {<C-o>o}<C-o>O
Run Code Online (Sandbox Code Playgroud)

// 我知道 InsertPair 函数是微不足道的,但它节省了时间,因为有了它我可以用一个命令定义命令和普通模式映射,而不必写很多<Left>s。


Rod*_*nto 8

大括号、方括号和括号的解决方案,中间有制表符。

" Automatically closing braces
inoremap {<CR> {<CR>}<Esc>ko<tab>
inoremap [<CR> [<CR>]<Esc>ko<tab>
inoremap (<CR> (<CR>)<Esc>ko<tab>
Run Code Online (Sandbox Code Playgroud)

结果:

function() {
  |
}
Run Code Online (Sandbox Code Playgroud)


use*_*664 6

将以下内容放入您的 .vimrc 文件中:

inoremap { {}<ESC>ha
Run Code Online (Sandbox Code Playgroud)

每当您{在插入模式下按下时,{}就会生成并将光标放在右括号上,以便您可以立即开始在它们之间输入。通过将花括号按顺序放置而不是放在不同的行上,您可以}手动将制表符放在前面。这样你就不会在它前面有错误数量的标签。

也许有人可以弄清楚如何计算光标所在的选项卡数量,然后}在新行的前面生成等量的选项卡。


alv*_*lvy 5

inoremap ( ()<ESC>i
inoremap " ""<ESC>i
inoremap ' ''<ESC>i
inoremap { {<Cr>}<Esc>O
Run Code Online (Sandbox Code Playgroud)


Der*_*har 1

按照标题为“自动附加结束字符”的文章中的建议安装并使用 Vim 脚本AutoClose

  • 自动关闭不执行我想要的操作。它将右大括号留在同一行,让我按两次 Enter 键,返回命令模式,向上移动一行,插入模式,制表符,最后键入。 (2认同)