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

时间:2009-11-30 16:38:37

标签: java eclipse code-formatting pretty-print eclipse-formatter

我有一些Java代码,其中SQL语句编写为Java字符串(请不要使用OR / M flamewars,嵌入式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重新配置(除了可能选择格式化程序无关的命令注释:{{1} }→STOP-ECLIPSE-FORMATTING)。

13 个答案:

答案 0 :(得分:828)

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

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

开启/关闭功能必须在Eclipse首选项中“打开”: Java > 代码风格 > 格式化。单击编辑关/开标签,启用启用关/开标签

也可以更改首选项中的魔术字符串 - check out the Eclipse 3.6 docs here

更多信息

Java > 代码样式 > 格式化 > 修改 > 关/开标签

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

enter image description here

您还需要启用 Java Formatting

中的标志

答案 1 :(得分:59)

格式化程序中来自Eclipse 3.5 M4的AFAIK有一个选项“Never Join Lines”,可以保留用户换行符。也许那就是你想要的。

另外还有这个丑陋的黑客

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

答案 2 :(得分:23)

请参阅this answer on SO

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

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

来源:Documentation at Oracle

答案 3 :(得分:23)

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

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

保存,申请。

enter image description here

答案 4 :(得分:16)

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

Windows 偏好 Java 代码样式 Formatter

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

答案 5 :(得分:14)

如果您在行的开头加上加号,则格式不同:

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

答案 6 :(得分: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                          ";

答案 7 :(得分:5)

用双斜杠“//”结束每一行。这将使日食无法将它们全部移到同一条线上。

答案 8 :(得分:4)

替代方法:在Eclipse 3.6中,在“Line Wrapping”下,然后在“常规设置”中有一个选项“从不加入已包装的行”。这意味着格式化程序将包装长行但不撤消已有的任何包装。

答案 9 :(得分:4)

@xpmatteo有解决部分代码的问题,但除此之外,默认的eclipse设置应设置为仅编辑已编辑的代码行而不是整个文件。

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

这会阻止它首先发生,因为你的同事正在重新格式化他们实际没有改变的代码。这是一种很好的做法,可以防止在源代码控制上呈现diff的错误(当由于较小的格式设置差异而重新格式化整个文件时)。

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

答案 10 :(得分:1)

幻影评论,将//添加到您想要换行的位置,非常棒!

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

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

  3. 幻像注释(//)将在您的应用程序中运行。如果您还有Javascript,可能会使用JSBeautifier之类的内容。您也可以在Javascript中使用类似的代码样式。

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

答案 11 :(得分:0)

不太漂亮,但可以使用默认设置以及第一行:

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

答案 12 :(得分:-3)

这个黑客有效:

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

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