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

Поддержка отступа Emacs для синтаксиса С++ 11?

Теперь, когда С++ 11 отсутствует, я задавался вопросом, есть ли какие-либо советы по улучшению поддержки отступов в Emacs, когда все больше и больше кода переносится с С++ 98 на С++ 11.

Примеры:

Вот несколько сомнительных отступов, над которыми я работаю:

struct m {
    int a;
    char b;
};

std::vector<m> foo { {1, 'a'},
        {2, 'b'},
            { 3, 'c'},
                { 4, 'd' }};

Я бы предпочел

std::vector<m> foo { {1, 'a'},
                     {2, 'b'},
                     { 3, 'c'},
                     { 4, 'd' }};

или даже

std::vector<m> foo { {1, 'a'},
        {2, 'b'},
        { 3, 'c'},
        { 4, 'd' }};

например.

Следующий:

cout << 5
     << [](int a) {
    return 2 * a;
} (5);

Я бы предпочел

cout << 5
     << [](int a) {
            return 2 * a;
        } (5);

чтобы блок был отступом относительно лямбда.

Я нахожу, что трачу больше времени на отступ, что раздражает.

Есть ли какие-либо пакеты или настройки, которые помогают отменить современный код С++ 11?

(сторона примечания: я настроил clang-format для Emacs, но я не могу получить 100% -ную совместимость с существующим кодом, а также не но хорошо понимают синтаксис С++ 11. Тем не менее он иногда полезен и звучит как хорошая идея для новых проектов.)

4b9b3361

Ответ 1

Я только что установил последнюю версию CC Mode 5.33 из SourceForge, которая должна покрыть большую часть того, что вы ищете:

С++ 11 теперь должен полностью поддерживаться вместе с некоторыми функциями С++ 14:

  • Унифицированная инициализация
  • Лямбда-функции
  • Пакеты параметров
  • Необработанные строки
  • Сепараторы в целых литералах
  • " → " как двойной шаблон ender
  • и др.

Вот отступы, которые я получаю для ваших примеров:

struct m {
  int a;
  char b;
};

std::vector<m> foo { {1, 'a'},
                     {2, 'b'},
                     { 3, 'c'},
                     { 4, 'd' }};

и

cout << 5
     << [](int a) {
          return 2 * a;
        } (5);

Я также рекомендую установить modern-c++-font-lock (например, через MELPA), как предложено в этот ответ SO.

Ответ 2

Посмотрите ClangFormat:

ClangFormat описывает набор инструментов, которые построены поверх LibFormat. Он может поддерживать ваш рабочий процесс различными способами, включая автономный инструмент и интеграция редакторов.

Он интегрирован в emacs:

(load "<path-to-clang>/tools/clang-format/clang-format.el")
(global-set-key [C-M-tab] 'clang-format-region)

У вас множество параметров, чтобы определить стиль отступа для С++ 11 и выше.

Параметры стиля Clang-Format описывают настраиваемый стиль форматирования параметры, поддерживаемые LibFormat и ClangFormat.

Несколько примеров:

  • AlignTrailingComments
  • AlwaysBreakTemplateDeclarations
  • и др.

Ответ 3

Когда я использую emacs, следующий параметр достаточно хорош для меня с отступом:

; auto indent   
(setq-default indent-tabs-mode nil)
(setq-default tab-width 2)

(define-key global-map (kbd "RET") 'newline-and-indent)
(defun indent-buffer ()
  (interactive)
  (save-excursion
    (indent-region (point-min) (point-max) nil)))
(global-set-key [f12] 'indent-buffer)

Надеюсь, что это поможет.