在C中 - 我希望当我键入{然后}时,emacs会在它们之间插入一个新行,然后将光标置于它们之间。例如:
int main() {
现在我输入}并发生以下情况:
int main()
{
//cursor is here
}
编辑:忘了提 - 我希望emacs知道在定义一个函数时它应该执行上面描述但是在执行for循环时,或者例如语句我想要它执行以下操作:
if (bla bla) {
输入}和...:
if (bla bla) {
//cursor here
}
答案 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,这可以正常使用。