9

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

void foo()<cursor>

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

void foo(){
    <cursor>
}

我希望这仅在 cc 模式下发生,并且仅在不在字符串/注释/等中时发生在行尾

首先想到的是重新绑定“{”以始终执行此操作(我自己可以弄清楚如何执行此操作),但很难让它只在正确的时间发生。

任何提示将不胜感激。

4

7 回答 7

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)中

于 2010-09-27T22:51:45.683 回答
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)
于 2010-09-27T20:12:08.730 回答
3

我衷心建议您尝试出色的自动配对次要模式 - 它不仅仅是插入大括号,而且使 Emacs 在该领域更像是 IDE。我想将它与 cc-mode 中的电动牙套设置相结合,或多或少会给您带来您所寻求的行为。

于 2010-09-27T08:04:21.177 回答
3

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

(electric-pair-mode 1)
于 2015-11-27T06:31:58.740 回答
2

尝试yasnippet(或在 Emacs Wiki 页面yasnippet 上)。Emacs 有很多包支持做这种事情,但是 yasnippet 目前似乎有动力并且非常可扩展。查看视频。

于 2010-09-27T05:11:20.593 回答
1

您需要深入研究 emacs-lisp 才能完全按照您的意愿执行此操作,因为 YASnippet 会为您做一些好事,但并不完全符合您的要求。

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

该函数应检查前一个字符是否为{,如果是,则执行所需的RET, RET, TAB, } , Up,TAB以获取所需的光标并插入结束}

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

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

或者,我发现autopair.el对我来说做得很好,我自己做换行符;)

于 2010-09-27T07:49:35.783 回答
1

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

  1. 依靠前面回复中提到的包来自动添加右大括号。
  2. 当你想在函数体中添加语句时,你按下Return键(当自动添加的右大括号仍在光标下时)。'Return' 键绑定如下:

    ;; automatic first line in function                                             
    (defun my-c-mode-insert-funline ()
      (interactive)
      (newline-and-indent)
      (when (looking-at "}")
        (newline-and-indent)
        (forward-line -1)
        (c-indent-line)))
    (global-set-key (kbd "RET") 'my-c-mode-insert-funline)
    
于 2015-06-30T15:18:08.093 回答