如何让 Vim 自动放置大括号?

Posted

技术标签:

【中文标题】如何让 Vim 自动放置大括号?【英文标题】:How do I get Vim to automatically put ending braces? 【发布时间】:2010-10-27 08:58:57 【问题描述】:

在编辑 .scm 文件时,如果 Vim 会在我开始 ( 时自动放置结束大括号 ),那就太好了。我该怎么做?

【问题讨论】:

【参考方案1】:

您可以根据自己的喜好映射左大括号:

:imap ( ()<left>

【讨论】:

其他答案中提到的插件具有在键入相应的关闭“)”时表现“智能”的优势。如果不需要,那么我也会使用直线前进地图。 一些插件还: - 不要在注释和字符串上下文中扩展, - 定义一种用一对括号包围选择的方法, - 插入占位符/标记以跳过结束括号(与大多数 sn-ps/templates 扩展插件一致)。 有没有办法只在一行的末尾这样做?有时它比有用更烦人,但有了这个,我会很乐意使用它......【参考方案2】:

尝试使用AutoClose插件。

【讨论】:

不要与蒂亚戈·阿尔维斯(Thiago Alves)的AutoClose 另一个不那么激进(也不那么烦人,IMO)混淆。 @AndrewMarshall +1,您列出的版本不那么烦人了。我来这里是为了寻找 Mykola 答案中的替代品,因为它有怪癖。 仅供参考,这个插件似乎工作正常,但对我来说,它引入了“滞后”&lt;ESC&gt; 行为。因此,如果您关心这一点,请避免。【参考方案3】:

最简单的答案是包含地图。例如:

:inoremap ( ()<left>

问题是您需要为每个要自动关闭的符号添加一个条目(''、'['、'"'等)。此外,插件通常更智能,提供诸如检测“关闭”字符而不是重复它。

上述解决方案和大多数插件的问题在于它们倾向于破坏撤消序列(gundo任何人?),如:help ins-special-special中所述。

这里是执行您所要求的插件列表(来自vimtips):

delimitMate by Israel Chauca Fuentes(可配置,不会破坏撤消/重做/重复,但 - 破坏 iabbr)也在 GitHub AutoClose Karl Guertin(自动关闭特定的硬编码字符,但不会中断撤消/重做/重复) AutoClose by Thiago Alves(可配置,但会中断撤消/重做/重复) auto-pairs Auto Pairs by Miaojiang(可配置,但会中断 undo/redo/repeat) ClosePairs Edoardo Vacchi(可配置,但会中断撤消/重做/重复) smartinput by Kana Natsuno(可配置,但会中断撤消/重做/重复)

除了vimtips,网上还有another nice explanation of the issue。

【讨论】:

对于将来发现此问题的其他人,我刚开始使用自动配对,除非我理解术语错误,否则它不会破坏我的撤消或历史记录。此列表中最好的一个!它还处理退格键删除对! 哪个 Vim 版本?上次我检查时仍然没有解决方案让撤消/重做/重复在 Vim 7.4 及更高版本中自动关闭时正常工作。一些插件使用了在早期 Vim 版本中工作的 setline()。【参考方案4】:

我也需要一个,我已经尝试了一些插件:

自动关闭,http://www.vim.org/scripts/script.php?script_id=1849,有点激进。

简单对,http://www.vim.org/scripts/script.php?script_id=2339,依赖于 Python。如果您在 Linux 上,这不是问题,但在 Windows 上,将 Vim 版本与您拥有的 Python 解释器匹配可能会很麻烦。

我的建议是 ClosePairs,您可以在 http://www.vim.org/scripts/script.php?script_id=2373 找到它,这对我来说非常有效。简单实用。

【讨论】:

【参考方案5】:

关于这个主题有很多提示和插件。查看 vimtips 站点中的relevant entry。

【讨论】:

【参考方案6】:

我目前正在使用auto-pairs,效果非常好。

插件破坏撤消/重做/重复的问题似乎在上面列出的一些插件中仍然存在,但我认为这不是什么大问题(嗯,至少目前对我来说不是)。

不过,请注意,在撰写本文时,我无法使用 :helptags 生成带有此插件的帮助文件。

【讨论】:

【参考方案7】:

查看这个新插件:vim-autoclose by Townk。前面提到的AutoClose 具有攻击性,有时表现得不受欢迎。

【讨论】:

【参考方案8】:

使用这个有问题(通过 imap 或脚本之一)。您将无法使用. 命令重复完整的编辑。

e.g. (foo) with . only gets you foo, without the brackets.

如果你把括号作为两个字符正常插入就可以了。

【讨论】:

【参考方案9】:

您可以尝试下载以下插件 AutoClose : Inserts matching bracket, paren, brace or quote

【讨论】:

【参考方案10】:

https://github.com/vim-scripts/Auto-Pairs

测试了这个插件的undo redo。 2013 它只是工作。还有python-mode插件。

【讨论】:

【参考方案11】:

cohama 有一个新插件:

lexima.vim (github)

(尚未在 vim.org 上)

此插件支持.command! Afaik,这是唯一支持此功能的插件。

撤消/重做序列也有效。

【讨论】:

以上是关于如何让 Vim 自动放置大括号?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Visual Studio 为功能块自动生成大括号?

C# 怎样让大括号自动对齐

vi vim 括号自动缩进设置及解释

反正有没有让 VS Code 在 C# 的新行上自动格式化大括号?

vs2010怎么让打右大括号的时候代码自动对齐

Resharper:循环后自动插入大括号