Java 编码风格 & Emacs cc-mode 配置

19
我正在使用包含cc-mode(c版本5.32.2)的GNU/Emacs HEAD在GNU/Linux Debian机器上。我试图定义一个自定义样式来管理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);
}

嵌套条件缩进不正确:

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

Ctrl-c Ctrl+s 报告第二行的语法分析: ((arglist-cont-nonempty 2447 2450) (arglist-cont-nonempty 2447 2452)),但我明显有16个空格(++出现了两次)缩进,而不是8个(++)。

我想要以下缩进:

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

我试图定义一个类似于statement-cont使用的{{(,(当(fboundp …)))}}条件,但没有成功(我的Lisp知识不足也没有帮助)。现在的问题是:我的方法正确还是错误?我应该如何实现预期的行为(即检测我是否处于嵌套条件中以获取正确的缩进)?(我不想使用malabar-mode或JDEE,所以请不要告诉我使用它们。)

祝好,

Renaud

更新2011/12/06(回应评论)

我们不会在这里开始一场圣战。那些出于自己的原因想使用Emacs的人可以坚持使用Emacs,其他人可以随心所欲...

话虽如此,我在一个团队中工作,在那里我是唯一使用Emacs的人,其他人喜欢Eclipse。由于我负责编码规则,我与同事合作获得了正确的保存操作并帮助配置了Eclipse的格式化程序。我能说的是:Eclipse的保存操作和格式化程序都不容易配置... 主要区别在于你有一个漂亮的GUI和漂亮的复选框,但这并没有多大帮助来减少复杂性。

我坚持使用Emacs...


1
我会使用专门设计用于开发、调试和测试Java应用程序的集成开发环境。虽然它不像emacs那样通用,但很可能更好地支持Java特定的功能。 - Peter Lawrey
4
这里的问题不在于我应该/会/能否使用Eclipse或其他全功能Java-aware IDE,而在于如何在emacs中解决一个非常具体的缩进问题...无论如何,感谢您的评论! - Renaud
2
这只是对你问题的评论,不是答案。 ;) - Peter Lawrey
1
@PeterLawrey Emacs现在已经允许自定义C语言缩进几十年了,考虑到Java和C的“if”条件具有严格相同的语法(这是问题的关键,对吧?),我不认为其他IDE应该在这方面做得更好。 - Antoine
1
@Antoine,Java IDE 没有用,但是一个好的 Lisp IDE 可能会有帮助。 - Peter Lawrey
显示剩余2条评论
1个回答

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();
}

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