Принятый ответ на самом деле неверен. 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 '(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. Подробные шаги по взлому кода перечислены в моей статье, в основном вам нужно прочитать функцию c-indent-line , которая определена в /usr/share/emacs/24.3/lisp/progmodes/cc-cmds .el
Некоторые люди жаловались, что моя установка не работает. На самом деле он работает во всех стабильных версиях Emacs (23.4, 24.3, 24.4), если вы не измените настройки по умолчанию (отступ имеет разные профили, мои настройки основаны на профиле по умолчанию).
Мой ключевой момент заключается в том, что по этому конкретному вопросу вам необходимо прочитать код.