515

我有一些 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 更易于阅读和维护(恕我直言),尤其是对于较大的查询。例如,我可以将我的编辑器置于“覆盖”模式并相当容易地就地修改文本。

请注意,此问题泛化到 SQL 的特定示例之外。使用任何垂直格式编写的任何代码,尤其是表格结构,都容易被漂亮的打印机破坏。

现在,一些项目成员使用 Eclipse 编辑器,当他们格式化整个源文件时,语义格式化经常被破坏。

有没有办法指示 Eclipse 在格式方面忽略某些源代码行?

我正在寻找类似于切换 Eclipse 格式化程序的特殊注释之类的东西。理想情况下,这样的注释可以配置为我们选择的任何内容,并且其他格式化程序也可以编程以尊重它:

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

显然,一个“解决方案”是让我们的团队成员标准化一些外部格式化程序,如JalopyJIndent,但这不是这个问题的目的(也不是我对这个项目的决定):我正在专门寻找一种方法来临时避免使用 Eclipse 格式化程序。

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

4

13 回答 13

897

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

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

必须在 Eclipse 首选项中“打开”开/关功能:Java > Code Style > Formatter. 点击Edit, Off/On Tags, 启用Enable Off/On tags

也可以更改首选项中的魔术字符串 —在此处查看 Eclipse 3.6 文档

更多信息

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

此首选项允许您定义一个标签来禁用和一个标签来启用格式化程序(请参阅格式化程序配置文件中的关闭/打开标签选项卡):

在此处输入图像描述

您还需要启用以下标志Java Formatting

于 2010-07-28T14:17:36.120 回答
63

格式化程序上来自 Eclipse 3.5 M4 的 AFAIK 有一个选项“从不加入行”,它保留用户换行符。也许这就是你想要的。

否则有这个丑陋的黑客

String query = //
    "SELECT FOO, BAR, BAZ" + //
    "  FROM ABC"           + //
    " WHERE BAR > 4";
于 2009-11-30T16:48:29.490 回答
37

在 SO 上看到这个答案

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

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

资料来源:Oracle 文档

于 2014-04-11T15:01:48.670 回答
30

您可以将其配置为不加入已经换行的行,而不是关闭格式。与 Jitter 的响应类似,这里是 Eclipse STS:

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

保存,申请。

在此处输入图像描述

于 2014-07-31T14:30:29.103 回答
16

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

Windows Preferences Java Code Style Formatter

按下Edit按钮。选择最后一个选项卡。注意开/关框并使用复选框启用它们。

于 2011-08-17T18:06:38.260 回答
14

如果将加号放在行首,则格式不同:

String query = 
    "SELECT FOO, BAR, BAZ" 
    +    "  FROM ABC"           
    +    " WHERE BAR > 4";
于 2009-11-30T16:50:14.867 回答
6

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

于 2016-07-23T02:12:17.590 回答
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                          ";
于 2010-07-16T11:17:51.973 回答
4

替代方法:在 Eclipse 3.6 中,在“换行”下的“常规设置”下,有一个“从不加入已经换行的行”的选项。这意味着格式化程序将换行很长的行,但不会撤消您已经拥有的任何换行。

于 2011-04-16T17:10:48.333 回答
4

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

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

这首先会阻止它发生,因为您的同事正在重新格式化他们实际上并没有改变的代码。这是一个很好的做法,可以防止导致源代码管理上的差异变得无用的事故(当整个文件由于较小的格式设置差异而重新格式化时)。

如果打开/关闭标签选项被关闭,它也会阻止重新格式化。

于 2012-08-15T15:02:10.287 回答
2

幻影注释,添加//你想要新行的地方,很棒!

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

  2. 无论使用何种格式化工具,幻影注释 (//) 都将起作用。无论 Eclipse 或 InteliJ 还是您使用的任何编辑器。这甚至适用于非常好的Google Java 格式

  3. 幻影注释 (//) 将适用于您的应用程序。如果你也有 Javascript 并且可能使用类似JSBeautifier的东西。您也可以在 Javascript 中使用类似的代码样式。

  4. 实际上,您可能确实想要格式化吗?您想删除混合制表符/空格和尾随空格。您想根据代码标准缩进行。你不想要的是一条长线。那个,只有那个,是幻影评论给你的!

于 2017-06-01T19:45:37.393 回答
0

不是很漂亮,但可以使用默认设置和第一行:

String query = "" +
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";
于 2020-10-27T13:31:57.160 回答
-3

这个技巧有效:

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

我建议不要使用格式化程序。糟糕的代码应该看起来很糟糕而不是人为的好。好的代码需要时间。你不能在质量上作弊。格式化是源代码质量的一部分。

于 2009-11-30T16:47:45.670 回答