接受的答案实际上是错误的。Emacswiki 将无济于事。
将以下代码插入~/.emacs
:
(defun fix-c-indent-offset-according-to-syntax-context (key val)
;; remove the old element
(setq c-offsets-alist (delq (assoc key c-offsets-alist) c-offsets-alist))
;; new value
(add-to-list 'c-offsets-alist (cons key val)))
(add-hook 'c-mode-common-hook
(lambda ()
(when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
;; indent
(fix-c-indent-offset-according-to-syntax-context 'substatement-open 0))
))
有关技术细节,请参阅http://blog.binchen.org/posts/ccjava-code-indentation-in-emacs.html。
关键问题是 c-set-offset不再可靠地检测语法上下文(Emacs24.3.1)。所以唯一可靠的方法是分析原始的emacs代码。我的文章中列出了破解代码的详细步骤,基本上你需要阅读/usr/share/emacs/24.3/lisp/progmodes/cc-cmds.el 中定义的函数c-indent-line
有些人抱怨我的设置不起作用。实际上,如果您不更改默认设置(缩进具有不同的配置文件,我的设置基于默认配置文件),它实际上适用于所有稳定版本的 Emacs(23.4、24.3、24.4)。
我的重点是,在这个特定问题上,您需要阅读代码。