自动闭合括号的Vim插件

79

是否有适用于Vim 7.4的工作插件,能够自动关闭括号('{}'、'[]'、'()'),并且在至少对'{}'插入一些换行符?

我知道这个问题已经被问过很多次了,但是所有的答案似乎要么不能在vim 7.4上正常工作,要么插件没有更新或者其他问题。

到目前为止,我尝试过vim-smartinput、autoclose和delimitmate这几个插件,但是它们都没有成功插入任何闭合字符,即使我启用了插件,并且它们似乎都是活跃的。我不知道vim是否有一些更改,以某种方式破坏了这些插件。这些插件中没有一个似乎至少在一年内得到更新。是否有任何适用于vim 7.4的有效解决方案?


1
有不同的“autoclose”插件。尝试过这个吗?https://github.com/Townk/vim-autoclose - Kent
1
如果你想要另一种选择,你可能想看看 Surround。即使你不是为了这个情况而使用它,Surround 也是一个很好的插件。https://github.com/tpope/vim-surround - Peter Rincker
1
Surround 是一个非常棒的插件(教皇也如此期望),但我不会为此放弃分隔符插件,反之亦然。两者都使用吧 :) - krystah
你列出的所有插件在7.4中的表现和它们在7.3中一样好(或不好)。据我所知,7.4没有破坏任何现有的插件。此外,你不能“启用”Vim插件。我认为你应该详细说明如何安装它们。 - romainl
看插件的日期,似乎大多数插件都是为vim 7.0或其他版本编写的... :)我认为可能有一些东西破坏了我的vimrc中的“关闭”行为,因为到目前为止没有一个插件起作用...Romainl:所有插件似乎都有一个“启用”命令,但并不总是默认启用。 - Dago
这是我的.vimrc文件,如果有人有任何想法,请提出来。我已经安装了pathogen、airline、autocomplpop、code_complete、nerdtree和taglist插件。 - Dago
6个回答

239

对于那些想要一个基本配置的vim的人:

inoremap " ""<left>
inoremap ' ''<left>
inoremap ( ()<left>
inoremap [ []<left>
inoremap { {}<left>
inoremap {<CR> {<CR>}<ESC>O
inoremap {;<CR> {<CR>};<ESC>O

如果在insert模式下并且没有设置set paste,则启用自动补全。将其保存在vimrc中以避免每次输入时都要输入它。当我们不想使用映射时,需要在键入映射字符之前使用ctrl+v进行转义,例如( {等。


13
在我的Vim 8.0中运作得非常好。 - Chenxiong Qi
6
这一个很有效,顺便我做了一点小改进,对我来说很重要... 在最后两个映射中,我添加了<TAB>到每行的末尾,因为你想要在打开代码块后,每次写新代码时都比上一行多一次Tab缩进。 inoremap {<CR> {<CR>}<ESC>O<TAB> inoremap {;<CR> {<CR>};<ESC>O<TAB> - rossijonas
6
@rossijonas,Tab键应该由自动缩进来处理。如果您设置了ai或者families,就不需要使用Tab键了。 - dlmeetei
3
@dlmeetei,你可能误解了我的意思。我并不是指编辑.vimrc文件。我是在谈论Eclipse中的工作方式。当你输入(时,它会在后面插入一个),但是如果你再次输入),它会覆盖原有的)而不是在后面再插入一个)。请注意不要改变原文意思。 - SOFe
10
您可以使用以下方式避免这个问题:inoremap <expr> ) strpart(getline('.'), col('.')-1, 1) == ")" ? "\<Right>" : ")"。这将自动将光标右移或插入一个闭括号,具体取决于当前光标位置的字符是否为右括号。 - JoePerkins
显示剩余14条评论

43

我刚在Ubuntu上的Vim 7.4.131中使用Pathogen测试了ClosePairs, AutoClose, DelimitMateAutoClose。并不意外的是,它们全部都能正常工作。

你应该重新表达你的问题,因为你并不是在寻找“适用于7.4版本的自动闭合插件”... 因为所有这些插件都可以使用。你应该问的是:“这是我的设置,为什么没有一个‘自动关闭’插件对我有效呢?”。

有人可以回答的问题是:“这实在是太乱了,从第95行开始注释掉所有内容。”

此外,Vim是一个非常稳定的环境:“没有得到积极维护”并不意味着“不值得一试”。相反,事实并非如此。


抱歉,我的问题措辞不太好。我试着将我的 .vimrc 裁剪到这个 http://paste.dy.fi/PAj,然后再次尝试所有的插件,但是没有任何一个插件插入字符。 - Dago
记得关闭vim,这样你的插件才能被加载。 - Dana Woodman
1
这实际上并不是真的,至少在编辑JavaScript代码时不是。每个都有自己的问题。 - cnp
@ChristopherPappas,我的回答中所有内容在问题的范围内都是可以证明的。所有这些插件都能够被Vim识别和调用。它们是否真正做到了它们所声称的功能,是否存在错误或副作用(在JS或其他文件类型中),以及它们是否真正有助于OP的日常工作,这完全是另一回事,超出了讨论范围。 - romainl
1
Closepairs在Mac上的Vim 7.3上无法正常工作...启动Vim时会显示一系列错误,而且会在成对字符之间插入一个换行符。已经测试了autoclose(1.2),它可以正常工作。 - User

37

这意味着我正在使用适用于Vim 7.4的delimitMate插件,可以直接使用。 - krystah
12
哦,还有一个对我来说必备的按键绑定,你可能想要检查一下:inoremap {<CR> {<CR>}<C-o>O。它的作用是:当你插入一个 { 并按下回车键时,它会插入闭合括号,并将光标放置在成对括号之间的新行上。 - krystah
你能给我一个配置的例子吗?我尝试了delimitMate,但无法在任何地方插入单个字符。我尝试更改loaded_delimitMate、delimitMate_autoclose并调用:delimitMateSwitch(显示delimitMate已启用/禁用),但无论如何都无法在任何地方插入字符。 - Dago
我的 .vimrc 文件中没有任何一行配置 delimitMate 的代码。就像我之前说的那样,它可以直接使用,无需任何配置。你最好先检查一下你的 .vimrc 文件,只使用这个插件启动 Vim,不要加载其他任何插件。如果这样可以正常工作,再逐步添加其他插件。祝你好运! - krystah
1
如果您设置了 let g:delimitMate_expand_cr = 2,则不需要使用该键绑定。 - Tallboy

17

添加新的候选者:有一个叫做lexima的插件。它是在2014年10月推出的,因此是比较新的。根据作者介绍,它具有高度的可定制性和点重复功能。它还可以被定制成自动关闭ruby中的def-end对。

这里是作者在日本举行的VimConf上的演示文稿,介绍了实现自动关闭功能的不同方法之间的比较。


这个插件会破坏其他浮动窗口和自动完成框架的功能 :( - Samir Alajmovic

3

我弄清楚了为什么没有一个插件对我起作用。看来问题与vim中的mksession功能有关,我只是在一个已保存的会话中尝试这些插件,由于某种未知的原因,这似乎阻止了插件起作用。插件似乎已经安装并且“工作”正常(指从插件中找到命令等)。至少,不打开已保存的会话,delimitMate就开始起作用了。


我曾经复制了一些键绑定,例如inoremap { {}<Left>,但它没有生效。问题出在我的.vimrc文件中的set paste选项上。将其删除后就可以工作了! - Jatin Kumar
谢谢!我一直在努力让自动关闭也起作用,但是删除“set paste”才解决了问题。 - ozooner

2

xptemplate 是一个代码片段插件,它包括自动补全括号/大括号等选项。安装并设置即可使用。

let g:xptemplate_brace_complete = '([{'

在您的.vimrc文件中,它们从同一行开始,但如果您按回车键,它们会正确地定位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接