如何使Emacs正确缩进C99复合字面量?

6
我是一个C99程序的编写者,经常使用复合字面量。然而,Emacs似乎不能正确地缩进它们。
例如,这里有一个简单的函数,手动缩进:
SDL_Point
random_point_within_rect(SDL_Rect r)
{
    return (SDL_Point) {
        .x = (r.x + (rand() % r.w)),
        .y = (r.y + (rand() % r.h)),
    };
}

当我使用M-x indent-region时,它的效果如下:

SDL_Point
random_point_within_rect(SDL_Rect r)
{
    return (SDL_Point) {
        .x = (r.x + (rand() % r.w)),
            .y = (r.y + (rand() % r.h)),
            };
}

我的假设是:Emacs不能识别(type) { ... }中的大括号与type x = { ... }中的大括号是同一类型,因为这个例子中大括号内的内容完全相同,但却能正常工作。
SDL_Point
random_point_within_rect(SDL_Rect r)
{
    SDL_Point p = {
        .x = (r.x + (rand() % r.w)),
        .y = (r.y + (rand() % r.h)),
    };
    return p;
}

有没有一种方法可以让Emacs将复合字面量视为结构体字面量,或者其他方式来修复这里的缩进?谢谢。

1
看起来你的假设是正确的,如果你评估(setq-local c-echo-syntactic-information-p t),你可以看到缩进规则。 - Rorschach
1个回答

0

我为那个确切的问题提交了一个错误报告;我相信emacs将您的列表视为一系列语句,并将逗号视为逗号运算符。

您可以通过在行末添加;来规避这个问题。您也可以使用未命名的结构体初始化器,即

return (SDL_Point){r.x + rand()%r.w, r.y + rand()%r.h}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接