Java编码风格& Emacs cc模式配置

时间:2011-12-04 17:28:45

标签: java emacs elisp dot-emacs cc-mode

我在GNU / Linux Debian机器上使用GNU / Emacs HEAD和附带的cc-mode(c-version 5.32.2)。

我正在尝试定义自定义样式来管理Code Conventions for the Java Programming LanguageAndroid's Code Style Guidelines for Contributors和一些自定义规则。

作为一名初学者,从头开始似乎并不明智。因此,我使用google-c-style作为起点,我设法获得最缩进规则的预期行为,嵌套条件有例外(请参阅下面的代码片段)。

that post开始,我在自定义样式中定义了(arglist-cont-nonempty . ++)(完整代码:custom-java-style.el)。不幸的是,尽管大多数情况都按预期缩进:

if ((condition1 && condition2)
        || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomethingAboutIt();

    someMethod(longExpression1, longExpression2, longExpression3,
            longExpression4, longExpression5);
}

嵌套条件错误地缩进:

if (!(deviceRegistred.getAddress().equalsIgnoreCase(deviceAdress)
                && deviceRegistred.getName().equalsIgnoreCase(deviceName))) {
    doSomethingAboutIt();
}

Ctrl-c Ctrl + s 报告Syntactic analysis: ((arglist-cont-nonempty 2447 2450) (arglist-cont-nonempty 2447 2452))在第二行,我显然有16个空格(2次++)缩进而不是8(++)。

我想得到以下缩进:

if (!(deviceRegistred.getAddress().equalsIgnoreCase(deviceAdress)
        && deviceRegistred.getName().equalsIgnoreCase(deviceName))) {
    doSomethingAboutIt();
}

我尝试定义一个(,(when (fboundp …)))条件,就像用于statement-cont的条件一样但没有成功(我缺乏lisp知识也没有帮助)。

现在,问题是:我的做法是对还是错?我怎么能/应该实现预期的行为(即检测我何时处于嵌套状态以获得正确的缩进)?

(我不想使用malabar-mode或JDEE,所以请不要告诉我使用它们。)

干杯,

雷诺

更新2011/12/06(对评论作出反应)

我们不会在这里开始圣战。那些想要使用Emacs的人,出于他们自己的原因,可以坚持使用Emacs,其他人会按照自己的意愿去做......

说,我在一个团队中工作,我是唯一一个使用Emacs的人,其他人则喜欢Eclipse。由于我负责编码规则,因此我与同事一起工作以获得正确的保存操作并帮助配置Eclipse的格式化程序。我只能说:Eclipse保存动作和格式化程序根本不容易配​​置......主要区别在于你有一个很好的GUI和漂亮的复选框,但它对降低复杂性没有多大帮助。

我坚持用Emacs ......

1 个答案:

答案 0 :(得分:3)

我会说,Emacs做对了。 考虑这种情况:

if (!(deviceRegistred.getAddress().equalsIgnoreCase(deviceAdress)
                && deviceRegistred.getName().equalsIgnoreCase(deviceName))
        || otherCondition) {
    doSomethingAboutIt();
}

如果嵌套条件缩进了8个字符,那将是一个令人困惑的变体:

if (!(deviceRegistred.getAddress().equalsIgnoreCase(deviceAdress)
        && deviceRegistred.getName().equalsIgnoreCase(deviceName))
        || otherCondition) {
    doSomethingAboutIt();
}