Поддержка отступа 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. Тем не менее он иногда полезен и звучит как хорошая идея для новых проектов.)
Ответы
Ответ 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)
Надеюсь, что это поможет.