Авто-отступ Emacs C-mode завершается неудачно после макроса препроцессора
Emacs 24.2 для Windows.
case TYPE_LONG:
{ <------- 65383
traceCodePath(20);
tempLongVal = iterator_long(it);
tempLongVal = 10;
if (isBigEndian())
{
swap_endian64(&tempLongValCon, &tempLongVal);
traceCodePath(25); <------- 65601
if (i > 0)
{ <------ get weird from here /* ((substatement-open 65601)) */
} <------ this line aligns with the { below "case" /* ((block-close 65383)) */
} <------ the code afterward all align with { below "case" /* ((block-close 65383)) */
Отступы в c-режиме работали хорошо с самого начала I пока я не добавил некоторый макрос препроцессора de #ifdef, #else, #end, после этого с некоторой точки кода все последующие отступы становятся беспорядочными. Синтетический символ каждой строки правильный, но все позиции якоря неправильные, кажется, что они не могут распознать {на том же уровне, но привязать некоторые {перед ними на верхнем уровне.
Что еще более странно, даже если я удалю эти макросы препроцессора снова, отступ не восстановится снова.
Что еще более странно, иногда позже, это восстановилось без причины. Я не знаю, какие операции вызвали это, но наиболее вероятным, я думаю, является "сохранить", "вернуть буфер" и т. Д.
Надеюсь, кто-то может выяснить причину, спасибо заранее.
1 ответ
Это вполне может быть связано с "ошибкой #14133 24.2; разрывы распознавания функций c на некоторых макросах препроцессора":
http://lists.gnu.org/archive/html/bug-gnu-emacs/2013-04/msg00055.html
Проблема, кажется, с пробелами, предшествующими #. Я заметил, что CMa и CMe перестали работать правильно, а регионы с автоматическим отступом были странными, как и в вашем случае.
Восстановление также не было последовательным для меня.
Патч, предложенный Аланом Маккензи, решил проблему для моего случая, вы должны попробовать его.
Вы также можете попробовать с emacs 23, я не смог воспроизвести ошибку в этой версии.