Emacs C ++ - режим неверного отступа? - PullRequest
34 голосов
/ 19 марта 2009

Я использую emacs 23 с режимом c ++ и у меня возникли проблемы с отступами. Предположим, у меня есть этот код:

void foo()
{
   if (cond)
     { <---
        int i;
        ...
     } <---
}

Похоже, это поведение по умолчанию для автоматического отступа. Однако я хотел бы изменить это так, чтобы это было так:

void foo()
{
   if (cond)
   {
      int i;
      ...
   }
}

Есть ли способ сделать это легко, настроив режим c ++ или мой файл .emacs?

Ответы [ 5 ]

41 голосов
/ 19 марта 2009

В моем файле .emacs есть следующее:

(defun my-c++-mode-hook ()
  (setq c-basic-offset 4)
  (c-set-offset 'substatement-open 0))
(add-hook 'c++-mode-hook 'my-c++-mode-hook)

Вы можете определить, какое смещение редактировать, нажав [ctrl-c ctrl-s] в любой строке. На первой строке с фигурной скобкой после if будет написано substatement-open.

21 голосов
/ 20 марта 2009

Это моё ... соответствует настройкам по умолчанию для visual studio.

(defun my-c-mode-common-hook ()
 ;; my customizations for all of c-mode, c++-mode, objc-mode, java-mode
 (c-set-offset 'substatement-open 0)
 ;; other customizations can go here

 (setq c++-tab-always-indent t)
 (setq c-basic-offset 4)                  ;; Default is 2
 (setq c-indent-level 4)                  ;; Default is 2

 (setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60))
 (setq tab-width 4)
 (setq indent-tabs-mode t)  ; use spaces only if nil
 )

(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
9 голосов
/ 20 марта 2009

Краткий ответ: поместите эту строку в ваш файл .emacs:

(c-set-offset 'substatement-open 0)

Длинный ответ: ...

Для тех из нас, кто новичок в emacs-lisp, есть довольно простой метод на http://www.cs.cmu.edu/:

  • Перейти к строке, которую вы хотите сделать отступ

  • Тип C-C C-O (это буква «О», а не ноль)

  • Нажмите Введите , чтобы принять предложение по умолчанию

  • Введите «0» (это ноль), чтобы не добавлять отступы, нажмите Введите

  • Введите Вкладку , чтобы заново создать строку.

  • Будущее "{" в этой ситуации будет иметь правильную настройку вкладки, пока вы не перезапустите emacs.

Приятной особенностью этого метода является то, что вы можете увидеть код lisp, который вы хотите изменить. Вы можете поместить в свой файл .emacs:

(c-set-offset 'SYNTACTIC-SYMBOL OFFSET)

Кроме того, вы можете проверить программу AStyle для автоматического форматирования исходного кода C ++ вне emacs.

3 голосов
/ 26 сентября 2014

Принятый ответ на самом деле неверен. 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), если вы не измените настройки по умолчанию (отступ имеет разные профили, мои настройки основаны на профиле по умолчанию).

Мой ключевой момент заключается в том, что по этому конкретному вопросу вам необходимо прочитать код.

0 голосов
/ 04 февраля 2015

Перед настройкой отдельных смещений настройте предпочтительный стиль. Я использую stroustrup, вы можете попробовать другие, см. http://www.emacswiki.org/emacs/IndentingC#toc1 для имен и http://en.wikipedia.org/wiki/Indent_style#Variant:_Stroustrup для примеров

M-x настраиваемая переменная c-default-style (и установите предпочитаемый для C ++ _

...