Подтвердить что ты не робот

Emacs С++ - неправильный отступ в режиме?

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

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

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

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

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

4b9b3361

Ответ 1

У меня есть следующее в файле .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.

Ответ 2

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

(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)

Ответ 3

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

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

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

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

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

  • Тип C-C C-O (что буква "O", а не ноль)

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

  • Введите "0" (это нуль) без дополнительного отступа, нажмите Enter

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

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

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

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

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

Ответ 4

Принятый ответ на самом деле ошибочен. 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/сс-cmds.el

Некоторые люди жаловались, что моя настройка не работает. Фактически он работает во всех стабильных версиях Emacs (23.4, 24.3, 24.4), если вы не меняете настройку по умолчанию (у отступа есть разные профили, моя настройка основана на профиле по умолчанию).

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

Ответ 5

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

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