Javaコードの特定のセクションでEclipseコードフォーマッターをオフにする方法


488

Java文字列として記述されたSQLステートメントを含むJavaコードをいくつか持っています(OR / Mフレームワールは使用しないでください。埋め込まれたSQLはそれです-私の決定ではありません)。

メンテナンスを容易にするために、SQLステートメントを意味的にいくつかのコード行に連結された複数の文字列に分割しました。したがって、次のようなものの代わりに:

String query = "SELECT FOO, BAR, BAZ FROM ABC WHERE BAR > 4";

私のようなものがあります:

String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";

このスタイルにより、特に大規模なクエリの場合に、SQLが非常に読みやすく、維持されます(IMHO)。たとえば、エディターを「上書き」モードにして、テキストをその場で簡単に変更できます。

この問題は、SQLの特定の例を超えて一般化することに注意してください。垂直方向の書式、特に表形式の構成で記述されたコードは、きれいなプリンターによって破壊されやすくなります。

現在、一部のプロジェクトメンバーはEclipseエディターを使用しており、ソースファイル全体をフォーマットすると、セマンティックフォーマットが破壊されることがよくあります。

フォーマットに関してソースの特定の行を無視するようにEclipseに指示する方法はありますか?

Eclipseフォーマッターを切り替える特別なコメントのようなものを探しています。理想的には、そのようなコメントは私たちが選択したものになるように構成可能であり、他のフォーマッターもそれを尊重するようにプログラムできます。

// STOP-ECLIPSE-FORMATTING
String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";
// START-ECLIPSE-FORMATTING

明らかに、「解決策」の1つは、JalopyJIndentなどの外部フォーマッターでチームメンバーを標準化することですが、これはこの質問の目的ではありません(また、このプロジェクトに対する私の決定ではありません)。具体的には、アドホックベースでEclipseフォーマッターを使用しないでください。

理想的には、ソリューションを使用すると、Eclipse を使用してチームメンバーがIDEの再構成を行う必要なく、Eclipseフォーマッターの指示を挿入できます(フォーマッターに依存しないコマンドコメントを選択する以外に:STOP-ECLIPSE-FORMATTINGSTOP-FORMATTING)。


1
この問題がありました。Eclipseには、文字列の次のビットが行に収まるかどうかに関係なく、+があるStringコンストラクターで常に行を分割するオプションが必要です。しかし、そうではありません。:-(
JeeBee 2009年

どうやらこの機能はEclipse 3.6M6で追加されました:bugs.eclipse.org/bugs/show_bug.cgi?id
Guillaume

注:Eclipseがコメントをめちゃくちゃにしないようにするだけの場合は、各行の前に//を使用できます。ブロックをコメントアウトするには、強調表示してCtrl + /を押します。
John Henckel、2016

10年後の今、Java 14はおそらくこれを過去のものにする複数行の文字列をもたらすでしょう。
するThorbjörnRavnアンデルセン

回答:


865

Eclipse 3.6では、次のような特別なコメントを付けることで、フォーマットをオフにすることができます

// @formatter:off
...
// @formatter:on

Eclipse設定で、オン/オフ機能を「オン」にする必要がありますJava > Code Style > Formatter。クリックしてEditOff/On Tags有効Enable Off/On tags

設定で魔法の文字列を変更することも可能です。Eclipse3.6のドキュメントをチェックしてください

詳しくは

Java > Code Style > Formatter > Edit > Off/On Tags

この設定では、フォーマッタを無効にする1つのタグと有効にする1つのタグを定義できます(フォーマッタプロファイルの[オフ/オンタグ]タブを参照)。

ここに画像の説明を入力してください

また、からフラグを有効にする必要があります Java Formatting


7
このページの他の場所で説明されている「行を結合しない」オプションも非常に役立ちます。
xpmatteo 2012

89
オン/オフ機能を「オン」にする必要があります。Eclipse設定:Java> Code Style> Formatter。「編集」ボタンをクリックし、「オフ/オンタグ」、「オフ/オンタグを有効にする」にチェックを入れます。
Domenic D.

2
これはJavaScriptのコードスタイル設定では使用できません。この場合、書式設定に関して正反対の問題があります。:(
Redsandro

11
チームはEclipse設定(ファイル)のコピーを自分のWikiにエクスポートし、全員が同じものを使用することを要求する必要があります。私たちにとってはうまくいきます。;)
ジョセフラスト

参考までに、これを機能させるには、//と@記号の間のスペースを削除する必要がありました。
ロイTruelove 2014年

61

フォーマッター上のEclipse 3.5 M4のAFAIKには、ユーザー行の改行を保持する「行を結合しない」オプションがあります。多分それはあなたが望むことをします。

そうでなければ、この醜いハックがあります

String query = //
    "SELECT FOO, BAR, BAZ" + //
    "  FROM ABC"           + //
    " WHERE BAR > 4";

1
それで、「行を結合しない」オプションを設定することに加えて、これらの「ファントム」コメント書かなければなりませんか?「Never Join Lines」の部分はそれだけでは機能しませんか?
Greg Mattes、

2
はい、もちろんそうです。ファントムコメントは別のアプローチです(存在しない場合、または以前のバージョンで立ち往生している場合など)。
Chris、

このアプローチをTOADのカスタム書式設定テンプレートと組み合わせて使用​​して、Javaコードから古いSQLを削除し、再フォーマットして不要なコメントをすべて取得し、それをJAVAに戻しました。これは面倒ですが、Javaコードを保存する際に自動フォーマットすることができます。提案をありがとう!
jnt30 '19

「Never join lines」をチェックしないと、on / offマクロが機能しません-ありがとう!
Christoffer Soop、2014

28

SOでこの回答を参照してください。

特定のブロックコメントのフォーマットを抑制するために使用できる別のソリューションがあります。/*-ブロックコメントの先頭で(ハイフンに注意)を使用します。残りのファイルをフォーマットしても、フォーマットには影響しません。

/*-
 * Here is a block comment with some very special
 * formatting that I want indent(1) to ignore.
 *
 *    one
 *        two
 *            three
 */

出典:Oracleのドキュメント


2
これは、ユーザーのIDEの構成に依存しないため、最良の答えです。ありがとう。
Azim 2018

26

書式設定をオフにする代わりに、既に折り返されている行を結合しないように構成できます。Jitterの応答と同様に、Eclipse STSの場合は次のようになります。

プロパティ→Javaコードスタイル→フォーマッタ→プロジェクト固有の設定を有効にする、またはワークスペース設定の構成→編集→行の折り返し(タブ)→「既に折り返された行を結合しない」にチェックを入れる

保存して適用します。

ここに画像の説明を入力してください


1
これはSQLの例のように役立つと思いますが、IDEフォーマッタを完全に無効にする一般的なケースでは十分かどうかはわかりません。
Greg Mattes 14

2
Builderパターンを使用している場合、このソリューションが優れているとの関連性は確かにJavaの8のラムダの導入に伴って増加される
ジョナスKongslund

16

フォーマッタタグを追加する機能をオンにする必要があります。メニューバーで次の場所に移動します。

Windows Preferences Java Code Style Formatter

押しEditボタンを。最後のタブを選択します。オン/オフボックスを確認し、チェックボックスで有効にします。


14

行の先頭にプラス記号を付けると、フォーマットが異なります。

String query = 
    "SELECT FOO, BAR, BAZ" 
    +    "  FROM ABC"           
    +    " WHERE BAR > 4";

1
これは興味深い妥協かもしれません。一般に、1つのツールの望ましくない動作のために、コードのフォーマットを変更しすぎないようにしたいと思います。この場合、文字列連結演算子は、SQLで何が行われているのかという本質ではなく、単なる偶然です。そのため、各行の最後に記述します。SQLはラインの最初として強調されるべきだと私は感じています。しかし、これは、希望するフォーマットを維持できるソリューションがない場合に適した方法です。ありがとう!
グレッグマット

8
どういたしまして。実際、私は+記号を何十年も前線に置いてきました。フォーマッターをだますためではありません。何が起こっているのかがわかりやすくなるので、私はそれらを前に置くことを好みます。行の終わりにあるものが失われることがあります。ウッドバーニングコンパイラを使用していたとき、それはプロジェクト標準のどこかであり、私には行き詰まっています。
CPerkins、2009

5

フォーマッターがSQL文字列のインデントをめちゃくちゃにしないように、固定幅の文字列部分(空白で埋められた)を使用しています。これは混合結果をもたらし、SQLのように空白が無視されない場合は機能しませんが、役立つ場合があります。

    final String sql = "SELECT v.value FROM properties p               "
            + "JOIN property_values v ON p.property_id = v.property_id "
            + "WHERE p.product_id = ?                                  "
            + "AND v.value        IS NOT NULL                          ";

5

各行の最後に二重スラッシュ「//」を付けます。それは日食がそれらをすべて同じ行に移動するのを防ぎます。


4

代替方法:Eclipse 3.6では、[行の折り返し]の[一般設定]に、[既に折り返された行を結合しない]オプションがあります。つまり、フォーマッターは長い行を折り返しますが、既に持っている折り返しは元に戻しません。


4

@xpmatteoはコードの一部を無効にする答えを持っていますが、これに加えて、デフォルトのEclipse設定は、ファイル全体ではなく、編集されたコード行のみをフォーマットするように設定する必要があります。

Preferences->Java->Editor->Save Actions->Format Source Code->Format Edited Lines

同僚が実際に変更しなかったコードを再フォーマットしているため、これは最初からそれを防ぐことができたでしょう。これは、ソースコントロールのdiffが役に立たない事故を防ぐための良い方法です(形式設定のわずかな違いによりファイル全体が再フォーマットされる場合)。

また、タグのオン/オフオプションがオフになっている場合、再フォーマットも防止されます。


2

ファントムコメントは、//新しい行を追加する場所を追加するのに最適です。

  1. @formatter:offは、コードからエディターへの参照を追加します。私の意見では、コードにはそのような参照があってはなりません。

  2. ファントムコメント(//)は、使用するフォーマットツールに関係なく機能します。Eclipse、InteliJ、または使用するエディターに関係なく。これは非常に素晴らしいGoogle Java Formatsでも動作します

  3. ファントムコメント(//)はアプリケーション全体で機能します。JavaScriptもあり、おそらくJSBeautifierのようなものを使用している場合。JavaScriptでも同様のコードスタイルを使用できます。

  4. 実際、おそらく正しいフォーマットが必要ですか?タブ/スペースの混合と末尾のスペースを削除したい。コード標準に従って行をインデントしたいとします。あなたが望まないことは長い列です。それ、そしてそれだけが、ファントムコメントがあなたに与えるものです!


-3

このハックは機能します:

String x = "s" + //Formatter Hack
    "a" + //
    "c" + //
    "d";

フォーマッタを使用しないことをお勧めします。悪いコードは人為的に良いわけではなく見た目が悪いはずです。良いコードは時間がかかります。あなたは品質をだますことはできません。書式設定はソースコードの品質の一部です。


8
フォーマッタを使用しないことは、単に悪い考えです。フォーマッタはエラーをキャッチし、コードを一貫した状態に保ちます。
Francis Upton IV

興味深い提案ですが、フォーマットがコードの良し悪しをどのように教えてくれるのかわかりません。
Chris、

2
彼が言っていることは、「改善する」ことを期待してフォーマットするのではなく、不十分に書かれ、フォーマットが不十分なコードを現状のまま維持すべきだと感じているということです。正しく記述されておらず、フォーマットが不十分なコードは、簡単に識別できるように、何らかの形で「突き出ている」必要があります。私が完全に同意するかどうかは定かではありませんが、私はそう思います。
グレッグマット

1
@Francis-バグ:自動フォーマットされたコードでバグを見つけるにはどうすればよいですか?一貫性:一貫性は良い議論ですが、全体的なコード品質はより重要です。あなたはハンバーガーフリッピングのための素晴らしい一貫したプロセスを定義することができますが、それは高級料理にはうまくいきません。十分な事実を無視すれば、料理はかなり複雑な活動になる場合もあれば、取るに足らないことになる場合もあります。ソフトウェア開発がハンバーガーフリッピングツールのようなものだと思う場合は、整合性を強制するのが適しています。これはフォーマットのガイドラインに反対する議論ではありませんが、開発者がこれらのガイドラインを気にしない場合、他の本質的なことは気にしません。
Thomas Jung、

4
ここでの私の議論:私は良いコードを書き、フォーマットのガイドラインに固執します。しかし、私はLAZYです。5行のずさんなコードを書き、format-buttonを押して満足できるのに、正しい量のスペースと改行を挿入する必要があるのはなぜですか?結果を常に完璧にするツールを使用してコードをフォーマットした後、私はフォーマットについて誰よりもナチです。書式設定が単なるストロークである場合、ガイドラインが特に悪い場合を除いて、ガイドラインに固執することに反対する議論はありません。すべてのプロジェクトメンバーが同じコード形式設定を共有します。
Wiklanderによる
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.