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)
我是 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)