Java编码样式和Emacs cc模式配置

Ren*_*aud 19 java emacs elisp dot-emacs cc-mode

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

我正在尝试定义一个自定义样式来管理Java编程语言代码约定,Android的贡献者代码样式指南和一些自定义规则.

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

那篇文章中,我已经定义(arglist-cont-nonempty . ++)了我的自定义样式(完整代码:custom-java-style.el).不幸的是,虽然大多数情况按预期缩进:

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

    someMethod(longExpression1, longExpression2, longExpression3,
            longExpression4, longExpression5);
}
Run Code Online (Sandbox Code Playgroud)

嵌套条件错误地缩进:

if (!(deviceRegistred.getAddress().equalsIgnoreCase(deviceAdress)
                && deviceRegistred.getName().equalsIgnoreCase(deviceName))) {
    doSomethingAboutIt();
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

干杯,

雷诺

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

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

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

我坚持使用Emacs ......

Vse*_*kin 3

我想说,Emacs 做的是正确的事。考虑这种情况:

if (!(deviceRegistred.getAddress().equalsIgnoreCase(deviceAdress)
                && deviceRegistred.getName().equalsIgnoreCase(deviceName))
        || otherCondition) {
    doSomethingAboutIt();
}
Run Code Online (Sandbox Code Playgroud)

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

if (!(deviceRegistred.getAddress().equalsIgnoreCase(deviceAdress)
        && deviceRegistred.getName().equalsIgnoreCase(deviceName))
        || otherCondition) {
    doSomethingAboutIt();
}
Run Code Online (Sandbox Code Playgroud)