将Emacs设置为在括号成对出现后自动换行?

7

我开启了electric-pair-mode (不过这并不是非常相关的,因为这适用于任何自动成对模式或者手动括号),但简而言之,我希望在以下情况下:

function foo() {|}

(其中 | 是标记)

如果我按下回车,我希望它自动转到

function foo() {
|
}

这也意味着,function foo(|) {} 将变成
function foo(
|
){}

我已经处理好缩进的部分,但是不确定如何表达“如果我在任何一对空的匹配括号内部时,按回车键实际上插入两个新行,并将光标放置在第一个新行上”的意思。

谢谢!


你想要第二种情况吗?还是那会产生副作用? - Rorschach
这里的答案结合起来应该可以告诉你如何让Emacs自动插入闭合括号。 - Rorschach
第二种情况应该是一个副作用,但我不知道提供的答案是如何工作的。你链接的案例明确替换了“{”,而我所建议/询问的是要替换符合匹配括号的所有内容。 - Philip Kahn
我想伪代码应该是这样的:`在RET时: 如果move_mark_left.matchParens()等于move_mark_right: RET,RET,up` - Philip Kahn
2个回答

6

以下是我的init文件的内容,这段代码来自Magnar Sveen的.emacs.d

(defun new-line-dwim ()
  (interactive)
  (let ((break-open-pair (or (and (looking-back "{") (looking-at "}"))
                             (and (looking-back ">") (looking-at "<"))
                             (and (looking-back "(") (looking-at ")"))
                             (and (looking-back "\\[") (looking-at "\\]")))))
    (newline)
    (when break-open-pair
      (save-excursion
        (newline)
        (indent-for-tab-command)))
    (indent-for-tab-command)))

您可以将其绑定到您选择的按键上。我已将其绑定到M-RET,但如果您想,也可以将其绑定到RET。这些行

(or (and (looking-back "{") (looking-at "}"))
    (and (looking-back ">") (looking-at "<"))
    (and (looking-back "(") (looking-at ")"))
    (and (looking-back "\\[") (looking-at "\\]")))

检查光标是否在 {|}[|](|)>|<(HTML)中。


谢谢!几乎完全符合我的要求。不过有点遗憾的是,括号匹配必须是显式的而不是算法的。 - Philip Kahn
假设您使用的模式为您想要的分隔符分配()字符语法,(and (eq ?\( (char-syntax (char-before))) (eq ?\) (char-syntax (char-after))))将起作用。例如,这将覆盖java-mode中的() [] {}。但不包括>< - 即使在html-mode中也是如此。尽管如此,这仍然使它大多数是“算法”。 - Greg Hendershott

4

您还可以查看smartparens。具体来说,可以查看有关插入钩子的页面。

这是我个人使用的配置:

(with-eval-after-load 'smartparens
  (sp-with-modes
      '(c++-mode objc-mode c-mode)
    (sp-local-pair "{" nil :post-handlers '(:add ("||\n[i]" "RET")))))

这样做的另一个好处是可以自动缩进当前行。如果您需要,可以轻松地将此方法推广到更多模式(使用全局对 sp-pair) 和括号类型(只需复制代码)。


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