Emacs自动完成括号、缩进和换行 - 怎么做?

4
在C语言中,当我输入一个 { 和一个 } 时,希望emacs在它们之间插入新的一行,并将光标放置在它们之间。例如:
int main() {

现在我输入 },以下情况会发生:

int main() 
{
    //cursor is here
}

编辑:忘记提到 - 我希望emacs知道在定义函数时应该执行上述操作,但例如在执行for循环或if语句时,我希望它执行以下操作:

if (bla bla) {

键入 } 并...

if (bla bla) {
     //cursor here
}

移除了 c 标签。你的问题是关于配置编辑器(用于编写 C 代码)。 - pmg
2个回答

4

如果您不介意行为几乎与您描述的方式略有不同,那么可以使用内置的方法来实现。这是自动换行功能,可以通过键组合C-c C-a或此行在您的 .emacs 中激活:

(c-toggle-auto-newline 1)

不同之处在于它会在输入左括号 { 后立即重新格式化。当您最终输入右括号时,它也会正确缩进。

您还需要设置正确的 CC Mode 样式。样式“cc-mode”似乎按照您描述的方式定义了这些内容。您可以使用键组合 C-c . 激活它,然后选择 cc-mode,或者在 .emacs 行中添加相应代码。

(c-set-style "cc-mode")

c-mode函数是自动加载的,因此在加载.emacs文件时通常不可用。因此,您应该将它们包装在c-mode的钩子中,如下所示:

(add-hook 'c-mode-hook
          (lambda ()
            (c-toggle-auto-newline 1)
            (c-set-style "cc-mode")))

3
关于 { 的东西:
(define-minor-mode c-helpers-minor-mode
  "This mode contains little helpers for C developement"
  nil
  ""
  '(((kbd "{") . insert-c-block-parentheses))
)

(defun insert-c-block-parentheses ()
  (interactive)
  (insert "{")
  (newline)
  (newline)
  (insert "}")
  (indent-for-tab-command)
  (previous-line)
  (indent-for-tab-command)
  )

将上述内容粘贴到您的.emacs中。您可以使用c-helpers-minor-mode激活它。 编辑:以上代码只需按下{即可插入所有内容。如果您键入{},则以下脚本应该可以实现:
(defun insert-latex-brackets (opening closing)                      ; prototype function for all enclosing things
  (interactive)
  (insert opening)
  (insert "  ")
  (insert closing)
  (backward-char (+ 1 (length closing )))
  )

(defun check-char-and-insert (char opening closing)
  (interactive)
  (if (equal char (char-to-string (char-before (point))))
      (progn (delete-backward-char 1)
         (insert-latex-brackets opening closing))
    (insert char)
  )
)

(local-set-key (kbd "}") 'check-char-and-insert)

最后一点提示:你可以尝试使用yasnippet,如果使用得当,它可以成为一个真正的时间节省器。


yasnippet 看起来很有前途。你自己使用它吗? - Morten Kristensen

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