Visual Studio 在 emacs 中样式大括号自动完成

Visual Studio style curly brackets auto completion in emacs

我是 emacs 的新手,因为我以前一直在使用 Visual Studio。 有没有办法在 emacs 中对大括号进行相同类型的自动完成?

我的意思是,在 Visual Studio 中,如果输入这个(“|”是光标):

int foo()
{|

我明白了:

int foo()
{
    |
}

我尝试使用电对模式,但它只是关闭了大括号。 我希望我已经清楚了,英语不是我的母语。

编辑: @Rupert Swarbrick electric-pair-open-newline-between-pairs 在我的 emacs 中似乎没有设置为 true 。当我启用 electric-pair-mode 并在括号后按 return 我得到这个:

int foo()
{
|}

光标与右括号在同一行,我必须手动转到上面的行来编写代码,这有点烦人。 我在哪里可以修改 electric-pair-mode 来检查它是否设置为 true ?我还没找到。

编辑 2:

感谢@Rupert Swarbrick 的帮助,我现在使用 autopair.el,因为我使用的是 emacs 24.3,它可以满足我的要求。对于使用 emacs 24.4 或更高版本的人 electric-pair-mode 已经升级,您可以使用 Rupert 所说的。

查看 electric-pair-mode 的内容,您似乎无法通过自定义任何变量来做到这一点,但并非一无所获!如果 electric-pair-open-newline-between-pairs 为真(默认值),那么您会发现键入 { 然后 return 键应该会给您

{
    <- cursor here
}

你想要的。

为了避免输入额外的换行符,我们想假装用户在输入开头 { 后立即输入了它。为此,我们可以编写下面的函数。这会检查 electric-pair-mode 是否已启用,我们是否希望在对之间打开新行(if 块是从 elec-pair.el 中的逻辑复制的),用户刚刚键入 { 并且我们坐在 {} 对中(关闭的 } 已经通过电对模式添加了。如果这些都是真的,它调用 newline函数。第二个参数指定它应该表现得好像用户实际键入换行符(而不是仅仅插入 \n 并停止)。在这一点上,正常的 electric-pair-mode 代码 运行s并根据需要重新缩进所有内容。

最后,我们需要确保运行在正确的时间。一种方法是将其添加为 "advice" 到 electric-pair-post-self-insert-function。这样,只要启用电对模式,它就会在正确的时间运行。

将以下 elisp 代码粘贴到您的 .emacs 中并尝试一下:

(defun electric-pair-brace-fixup ()
  (when (and electric-pair-mode
             (if (functionp electric-pair-open-newline-between-pairs)
                 (funcall electric-pair-open-newline-between-pairs)
               electric-pair-open-newline-between-pairs)
             (eq last-command-event ?\{)
             (= ?\{ (char-before)) (= ?\} (char-after)))
    (newline nil t)))

(advice-add 'electric-pair-post-self-insert-function :after
            #'electric-pair-brace-fixup)