Emacs - 无法找到有关 electric-layout-mode 的信息

3

我非常新手Emacs,我在寻找关于electric-layout-mode的信息时遇到了困难,特别是electric-layout-rules

我现在使用c-toggle-auto-newline,但我正在尝试用Electric Layout替换它,希望它能与Electric Pair Mode配合使用,这样我就可以将electric-indent-mode的自动缩进与Electric Pair Mode的括号行为结合起来。

换句话说,我希望在按下“{”键时它会给我这种行为:

int main() <- (Ideally autonewline here, as C Auto Newline does)
{
    (point)
}

然而,我无法找到关于electric-layout-rules的足够信息来让它在我的.emacs文件中运行。我成功启用了electric-layout-mode,因为在自定义缓冲区中有一个条目。
我查看了“electric-layout-rules”的帮助条目,但我很难理解它,并且我注意到它的语法类似于C Auto Newline的c-hanging-braces-alist,我试图模仿其语法,但没有成功。
长话短说,我会感激一些关于electric-layout-rules的使用示例,我可以将其放入我的.emacs文件中。

编辑:几周前我在SuperUser上发布了一个类似但不太详细的问题。我不知道如何移动问题,但我想我可能会把它保留到这个问题得到回答或者如果有人建议我现在删除它的话,以防其中的任何内容与此相关。

这个电动布局模式手册页面是在其他问题中链接的,但它没有任何关于通过electric-layout-rules自定义行为的内容,并且明确说明它是JavaScript。当编辑C文件时,答案和electric-layout-mode中的代码都无法工作。


恭喜您使用Emacs!建议在开始时略过所有电气化的东西,即使它揭示了一些强大的功能。在我看来,Emacs最大的优势在于可扩展性,而电气化并不是最适合入门的点。 - Andreas Röhler
值得一提的是,我刚刚安装了一个修复electric-pair-mode的补丁,使其与electric-layout-mode更好地交互。我现在可以得到你想要的行为,不过它可悲地取决于启用这两种模式的顺序。 - Stefan
1个回答

4

如您所见,C-hv electric-layout-rules RET 告诉我们:

List of rules saying where to automatically insert newlines.
Each rule has the form (CHAR . WHERE) where CHAR is the char
that was just inserted and WHERE specifies where to insert newlines
and can be: nil, `before', `after', `around', or a function of no
arguments that returns one of those symbols.

这意味着我们可以通过以下模式添加新规则:
(add-to-list 'electric-layout-rules '(CHAR . WHERE))

e.g.:

(add-to-list 'electric-layout-rules '(?{ . around))

当我们输入{时,会自动在前后插入换行符。这是由编辑器自动生成的。

我尝试结合布局和对选项,但并不能完全复制您所希望的效果,但供参考:

(require 'electric)
(add-to-list 'electric-layout-rules '(?{ . around))
(add-to-list 'electric-pair-pairs '(?{ . ?}))
(electric-layout-mode 1)
(electric-pair-mode 1)

似乎这与您启用这两种模式的顺序有关。为关闭括号添加布局规则没有帮助,因为这些显然仅在手动键入字符时触发。
进一步阅读:
- C-hig (elisp)基本字符语法 RET - C-hig (elisp)点对符号表示法 RET - C-hig (elisp)关联列表 RET

谢谢!但是经过这么多麻烦,它最终不想与Electric Pair Mode一起工作。我能做到的最接近的是两个括号,但没有缩进的线。你认为有更好的方法来获得我想要的括号行为吗? - user1017523
1
你可以尝试将 electric-indent-mode 与此混合使用,但我不确定它是否有效。还有其他选择;请查看 Wiki:http://www.emacswiki.org/emacs/AutoPairs(或者可能像 Yasnippet 这样的东西更适合您?) - phils
我已经开启了 electric-indent-mode,所以我会看一下 AutoPairs,而不是试图让所有这些电动模式按照我的意愿工作。再次感谢您的帮助! - user1017523
1
你可能还想看看smartparens,这是所有酷孩子们都在用的(Nic Ferrier说)。它旨在提供灵活和可定制的功能。 - Chris Barrett

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