Рассмотрим следующий фрагмент кода C ++ с отступом с использованием cc-mode в Emacs:
auto good1 = f(a,
{1, 2}); // ((arglist-cont-nonempty 1 15))
auto bad1 = f<1>(a,
{1, 2}); // ((inexpr-statement) (block-open 36))
auto good2 = f(a,
b, // ((arglist-cont-nonempty 68 82))
{1, 2}); // ((arglist-cont-nonempty 68 82))
auto bad2 = f<1>(a,
b // ((arglist-cont-nonempty 114 130))
{1, 2}); // ((inexpr-statement) (block-open 114))
auto good3 = f(a,
b, // ((arglist-cont-nonempty 151 165))
{1, 2}, // ((arglist-cont-nonempty 151 165))
c);
auto bad3 = f<3>(a,
b, // ((arglist-cont-nonempty 209 225))
{1, 2}, // ((inexpr-statement) (block-open 209))
c);
Как видите, аргументы фигурных скобок {1, 2}
не отступают должным образом при возникновении в шаблонном вызове функции. Это связано с тем, что они ошибочно помечены как ((inexpr-statement) (block-open X))
скорее, чем ((arglist-cont-nonempty Y Z))
(точные смещения могут быть разными, я редактировал комментарии после использования C-c C-s
получить синтаксические метки).
Кто-нибудь знает, как можно это исправить? Я попробовал новейшую версию CC-Mode (5.32.5), специально загруженную из Sourceforge, а также версии по умолчанию, поставляемые с Debian и Ubuntu, но все они ошибаются.
Задача ещё не решена.
Других решений пока нет …