如何让emacs将#ifdef和#endif处理类似于'{'和'}'?

6

我希望Emacs在缩进上能像“{”一样处理“#ifdef”,并像“}”一样处理“#endif”。就像这样:

#ifdef __linux__
    #include <sys/socket.h>
#endif

int func(void)
{
    int foo = 0;

    #ifdef DO_STUFF
        foo = do_stuff();
    #endif

    return foo;
}

替换为:

#ifdef __linux__
#include <sys/socket.h>
#endif

int func(void)
{
    int foo = 0;

#ifdef DO_STUFF
    foo = do_stuff();
#endif

    return foo;
}

玩弄“cpp-macro”并不能解决问题。我该怎么做?谢谢!

2个回答

4

ppindent通过在“#”和“ifdef”之间放置空格来进行缩进。我认为这使得代码更难阅读。我想保持“#ifdef”在一起,并通过在“#”之前放置空格来进行缩进。 - colding
这更接近我所需的。现在,尽管我还没有自己尝试过,但当#ifdef位于普通代码之间时,它会如何缩进?它会忽略周围的代码缩进,还是会按照流程进行缩进? - colding
我不知道,我只是为你做了这个,没有在许多情况下进行测试。 - ClemPi
好的,我明天睡醒后会仔细看一下。谢谢。 - colding
试过了。它抱怨“if:Symbol's function definition is void: minusp”。那是在第98行。我该怎么修复它? - colding
显示剩余2条评论

3
预处理器注释原本应该从第一列开始,所以emacs在这方面是正确的,然而现在的编译器通常允许它们缩进。(参见缩进#defines
话虽如此,关于这个问题,请参见在emacs中将预处理指令缩进为C代码进行讨论。实际上,我可能会尝试将此问题作为那个问题的重复提交并关闭。
我同意那个问题中的一些评论,认为将预处理器视为块或词法范围是一个错误,所以将其缩进与正常的C代码一样实际上是有害的。

2
我认为“are supposed to start”不正确。根据当前的标准,它们并不是。也许你想用“were supposed to start”来替换它?这并不意味着我不同意你从一致性/可维护性的角度来看它们应该从一开始就开始。 - Niklas B.
@ruakh:谢谢。该死,我需要咖啡。 - Arafangion
这不是那个问题的复制。我的需求不同。另一个问题的 OP 只希望他的 #ifdef 被视为代码,而我希望它们被视为花括号,并将所包含的代码缩进一级,就像它们是花括号一样。这将特别提高可读性,尤其是对于包含语句。至少在我的眼中是这样的;-) - colding
@colding:您可能希望确保预处理器缩进独立于C缩进,并在问题中指定。 :) 也许可以将 #ifdef A #ifdef B void foo() { #ifdef C int c #endif... 作为示例? - Arafangion

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