Emacs自动完成paren,缩进和新行 - 如何?

时间:2011-03-04 15:44:05

标签: emacs autocomplete

在C中 - 我希望当我键入{然后}时,emacs会在它们之间插入一个新行,然后将光标置于它们之间。例如:

int main() {

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

int main() 
{
    //cursor is here
}
编辑:忘了提 - 我希望emacs知道在定义一个函数时它应该执行上面描述但是在执行for循环时,或者例如语句我想要它执行以下操作:

if (bla bla) {

输入}和...:

if (bla bla) {
     //cursor here
}

2 个答案:

答案 0 :(得分:4)

如果你不介意这种行为只是差不多,但并不完全按照你描述的方式,那么就有一种内置的方法可以做到这一点。这是自动换行功能,可以使用组合键C-c C-a或此行.emacs激活:

(c-toggle-auto-newline 1)

不同之处在于它会在进入开口支撑后立即重新格式化{。当你最终进入右括号时,它也会以正确的方式缩进。

您还需要设置正确的CC模式样式。风格“cc-mode”似乎以你描述的方式定义事物。您可以使用组合键C-c .激活它,然后选择cc模式或.emacs行

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

c模式功能是自动加载的,因此在加载.emacs文件时通常不可用。因此,您应该将它们包装在c-mode的钩子中,就像这样

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

答案 1 :(得分: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,这可以正常使用。