我怎样才能让emacs自动插入结束括号

时间:2010-09-27 04:36:26

标签: emacs curly-braces cc-mode

我刚刚开始使用emacs,并且有一个我非常喜欢的功能,而且搜索一下也没用。我希望其他人这样做是因为我还不想学习elisp。

void foo()<cursor>

我想输入一个“{”来导致这种情况发生

void foo(){
    <cursor>
}

我希望这只发生在cc模式中,并且只在不在字符串/ comment / etc中的行尾?

首先想到的是重新绑定“{”来做到这一点(我可以弄清楚如何自己做),但很难让它只在恰当的时间发生。

任何提示都将不胜感激。

7 个答案:

答案 0 :(得分:9)

您可以使用最新的emacs:

electric-pair-mode is an interactive compiled Lisp function.

(electric-pair-mode &optional ARG)

Automatically pair-up parens when inserting an open paren.

这已集成在Emacs 24.1(实际上是CVS)

答案 1 :(得分:5)

这样做:

(defun my-c-mode-insert-lcurly ()
  (interactive)
  (insert "{")
  (let ((pps (syntax-ppss)))
    (when (and (eolp) (not (or (nth 3 pps) (nth 4 pps)))) ;; EOL and not in string or comment
      (c-indent-line)
      (insert "\n\n}")
      (c-indent-line)
      (forward-line -1)
      (c-indent-line))))

(define-key c-mode-base-map "{" 'my-c-mode-insert-lcurly)

答案 2 :(得分:3)

我衷心建议您尝试优秀的autopair次要模式 - 它不仅仅是简单地插入大括号,而且使Emacs在该区域更像IDE。我想将它与cc模式中的电动支架设置相结合会给你或多或少的行为。

答案 3 :(得分:2)

尝试yasnippet(或在Emacs Wiki页面yasnippet上)。 Emacs有许多软件包可以支持这类工作,但yasnippet目前似乎有动力并且非常易于扩展。看看视频。

答案 4 :(得分:2)

在emacs 24或更新版本中打开电子对模式。

(electric-pair-mode 1)

答案 5 :(得分:1)

你需要深入研究emacs-lisp才能完全按照你的意愿去做,因为YASnippet会为你做一些不错的事情,但不完全是你所要求的。

我认为最简单的方法是在cc模式键映射中将函数绑定到 RET 键。

该函数应检查前一个字符是 {,如果是,请执行必需的 RET RET TAB } 向上 TAB 将光标移到您想要的位置并关闭} 插入

您可以通过检查平衡关闭} 来使功能更加强大,但这会更复杂,我建议您看看没有这种额外的抛光功能时的感觉。

如果您愿意,我可以为您编写功能和键盘映射绑定,但是由于您询问了它是如何完成的,所以如果您需要它,我会留给您寻求更多帮助。

或者,我发现 autopair.el 对我来说这很好,而且我自己做了换行;)

答案 6 :(得分:1)

您可能希望保留空函数体的选项,在这种情况下,您希望闭括号保持在同一行。如果是这种情况,那么您可以尝试这种替代解决方案:

  1. 依靠先前回复中提到的包自动添加结束括号。
  2. 如果要向函数体添加语句,请按>> pkg install symbolic-2.2.1.tar.gz configure: error: Failed to find Python checking for python... no pkg: error running the configure script for symbolic. error: called from 'configure_make' in file C:\Octave\Octave- 4.0.0\share\octave\4.0.0\m\pkg\private\configure_make.m near line 79, column 9 键(同时自动添加的右括号仍在光标下)。回归&#39; key的约束如下:

    Return