【问题标题】:How can can I get emacs to insert closing braces automatically如何让emacs自动插入右括号
【发布时间】:2011-04-17 14:24:18
【问题描述】:

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

void foo()<cursor>

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

void foo(){
    <cursor>
}

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

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

任何提示将不胜感激。

【问题讨论】:

  • 我认为这是stackoverflow.com/questions/1023770/…的副本
  • 我看了那个问题,但它只是添加右括号/大括号/等。我希望它换行两次,缩进,并将光标重新定位到空行

标签: emacs curly-braces cc-mode


【解决方案1】:

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

(electric-pair-mode 1)

【讨论】:

    【解决方案2】:

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

    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)
      

    【讨论】:

      【解决方案3】:

      在您可以使用的最新 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)中

      【讨论】:

        【解决方案4】:

        这样就可以了:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            该函数应检查前一个字符是否为 {,如果是,则执行所需的 RETRET TAB, }, Up, TAB 将光标移到您想要的位置并关闭 }插入。

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

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

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

            【讨论】:

            • 我就是这么想的。有没有一种简单的方法可以在 lisp 函数中检查我是否在注释/字符串中以及我是否在行尾?我知道 cc-mode 在内部执行此操作,如果我可以使用它,它会变得非常容易。
            • 您可以使用 thing-at-point 来确定您所处的环境。
            【解决方案7】:

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

            【讨论】:

            • 这似乎不太理想,我需要按 Tab 来展开它,如果 "{" 和它之前的任何内容之间没有空格,它就不起作用。
            • 您可以修改为模板以删除空间。修改/创建模板非常简单。
            猜你喜欢
            • 2021-09-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-23
            • 2018-08-14
            • 1970-01-01
            • 2011-07-09
            相关资源
            最近更新 更多