如何为Java代码的某些部分关闭Eclipse代码格式化器?

我有一些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

显然,一个“解决方案”是让我们的团队成员标准化一些外部格式化器,如破旧的飞机JIndent,但这不是这个问题的问题所在(也不是我对这个项目的决定):我正在特别寻找一种避免Eclipse格式化器的方法。

理想情况下,一个解决方案将允许我为Eclipse格式化程序无需团队成员使用Eclipse进行任何IDE重新配置插入指令(而不是可能选择一个与格式化程序无关的命令注释:STOP-ECLIPSE-FORMATTINGSTOP-FORMATTING)。

178864 次浏览

这个方法有效:

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

我建议不要使用格式化程序。好的代码需要时间。你不能在质量上作弊。格式化是源代码质量的一部分。

格式器上的Eclipse 3.5 M4中的AFAIK有一个选项“Never Join Lines”,它保留了用户换行符。也许这就是你想要的。

还有一个丑陋的黑客

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

如果你把加号放在行首,它的格式就不同了:

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

我使用了固定宽度的字符串部分(用空格填充),以避免格式化程序弄乱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                          ";

Eclipse 3.6允许您通过放置一个特殊的注释来关闭格式化,例如

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

开/关特性必须在Eclipse首选项中“打开”:Java>代码风格>格式化程序。单击编辑/在标签,启用启用Off/On标签

也可以在首选项中更改神奇的字符串——点击这里查看Eclipse 3.6文档

更多的信息

< kbd > Java > 代码风格 > 格式化程序 > 编辑 > /在标记< / kbd >

这个首选项允许你定义一个标签来禁用和一个标签来启用格式化器(参见格式化器配置文件中的Off/On Tags选项卡):

enter image description here

你还需要从Java格式中启用标志

另一种方法:在Eclipse 3.6中,在“换行”下的“常规设置”中有一个选项“永不连接已经换行的行”。这意味着格式化程序将对长行进行换行,但不会撤销您已有的任何换行。

您必须打开添加格式化程序标记的功能。在菜单栏转到:

< kbd >窗口 首选项 Java 代码风格 格式化程序< / kbd >

编辑按钮。选择最后一个选项卡。注意On/Off框,并用复选框启用它们。

@xpmatteo可以禁用部分代码,但除此之外,默认的eclipse设置应该设置为只格式化编辑过的代码行,而不是整个文件。

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

这将在第一时间阻止它发生,因为您的同事正在重新格式化他们实际上没有更改的代码。这是一个很好的实践,可以防止使源代码控制中的diff变得无用(当整个文件因为微小的格式设置差异而重新格式化时)。

如果关闭了on/off标签选项,它还可以防止重新格式化。

看到这个答案在SO上

您可以使用另一种解决方案来抑制特定块注释的格式化。在块注释的开头使用/*-(注意连字符),如果格式化文件的其余部分,则格式化不会受到影响。

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

来源:Oracle文档

您可以将其配置为不连接已经换行的行,而不是关闭格式化。与Jitter的回复类似,下面是Eclipse STS的回复:

属性→Java代码样式→格式化程序→启用项目特定设置或配置工作区设置→编辑→换行(选项卡)→勾选“永远不要加入已经换行的行”

保存,适用。

enter image description here

每一行以双斜杠“//”结束。这将防止eclipse将它们全部移动到同一行上。

幽灵注释,在你想要新行的地方添加//,非常棒!

  1. off将代码中的引用添加到编辑器中。在我看来,代码不应该有这样的引用。

  2. 幽灵注释(//)将工作,无论使用的格式化工具。无论您使用Eclipse或InteliJ或任何编辑器。这甚至适用于非常好的谷歌Java格式

  3. 幽灵注释(//)将在整个应用程序中工作。如果你也有Javascript,可能会使用类似于JSBeautifier。你也可以在Javascript中使用类似的代码风格。

  4. 实际上,你可能想要格式化,对吗?您希望删除混合制表符/空格和尾随空格。您需要根据代码标准缩进行。你不想要的是长长的队伍。那,而且只有那,是幻影注释给你的!

不是很漂亮,但适用于默认设置和第一行:

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