19

GNU/Linux Debian マシンで、含まれている cc モード (c バージョン 5.32.2) で GNU/Emacs HEAD を使用しています。

Code Conventions for the Java Programming LanguageAndroid の Code Style Guidelines for Contributors、およびいくつかのカスタム ルールを管理するカスタム スタイルを定義しようとしています。

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+s2行目に報告Syntactic analysis: ((arglist-cont-nonempty 2447 2450) (arglist-cont-nonempty 2447 2452))すると、明らかに8( )ではなく16スペース(2回++)のインデントがあり++ます。

次のインデントを取得したいと思います。

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

(,(when (fboundp …)))に使用されたような条件を定義しようとしましstatement-contたが、成功しませんでした (私の Lisp 知識の欠如も役に立ちません)。

さて、質問: 私のアプローチは正しいですか、それとも間違っていますか? 意図した動作を実装するにはどうすればよいですか?

(malabar-mode や JDEE は使いたくないので、使用するように言わないでください。)

乾杯、

ルノー

更新 2011/12/06 (コメントへの対応)

ここで聖戦を始めるつもりはありません。自分の理由で Emacs を使いたい人は Emacs に固執することができ、他の人は好きなように使います…</p>

そうは言っても、私は Emacs を使用するのは私だけで、他のメンバーは Eclipse が好きなチームで働いています。私はコーディング規則を担当しているので、同僚と協力して適切な保存アクションを取得し、Eclipse のフォーマッターの構成を支援してきました。私が言えることは、Eclipse の保存アクションとフォーマッターは構成がまったく簡単ではないということです...主な違いは、優れたチェックボックスを備えた優れた GUI を使用できることですが、複雑さを軽減するのにはあまり役立ちません。

私は Emacs を使い続けています…</p>

4

1 に答える 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();
}
于 2011-12-13T08:32:10.443 に答える