【问题标题】:How to turn off the Eclipse code formatter for certain sections of Java code?如何为 Java 代码的某些部分关闭 Eclipse 代码格式化程序?
【发布时间】:2017-02-16 15:58:12
【问题描述】:

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

【问题讨论】:

  • 我们遇到了这个问题。 Eclipse should 有一个选项,即总是在一个 + 所在的 String 构造函数中换行,而不管字符串的下一位是否适合该行。但事实并非如此。 :-(
  • 显然这个特性是在 Eclipse 3.6M6 中添加的:bugs.eclipse.org/bugs/show_bug.cgi?id=27079
  • 注意:如果你只是想防止eclipse弄乱你的cmets,那么你可以在每行前面使用//。要注释掉一个块,突出显示并按 Ctrl+/。
  • 请注意,现在 10 年后,Java 14 可能会带来多行字符串,这将成为过去。

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


【解决方案1】:

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

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

必须在 Eclipse 首选项中“打开”开/关功能:Java > 代码风格 > kbd>格式化程序。点击EditOff/On Tags,启用Enable Off/On tags

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

更多信息

Java > 代码风格 > 格式化程序 > 编辑 > 关/开标签

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

您还需要启用 Java Formatting

中的标志

【讨论】:

  • 本页其他地方提到的“从不加入行”选项也非常有用。
  • 必须“打开”开/关功能。 在 Eclipse 首选项中:Java > Code Style > Formatter。点击“编辑”按钮,“关闭/打开标签”,勾选“启用关闭/打开标签”。
  • 这在 JavaScript 代码样式首选项 中不可用,我有 the exact opposite problem 格式。 :(
  • 团队应该将 Eclipse 首选项(文件)的副本导出到他们的 wiki,并要求每个人都使用相同的。对我们很有效。 ;)
  • 仅供参考,我必须删除 // 和 @ 符号之间的空格才能使其正常工作。
【解决方案2】:

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

还有这个丑陋的hack

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

【讨论】:

  • 所以除了设置“从不加入行”选项之外,我必须编写这些“幻像”cmets? “从不加入线”部分不应该单独工作吗?
  • 是的,当然应该。幻像 cmets 是一种替代方法(以防它不存在,或者您被早期版本卡住等)。
  • 我已将这种方法与 TOAD 中的自定义格式化模板结合使用,以允许我从 JAVA 代码中剥离旧 SQL,重新格式化并获取所有无关的 cmets,然后将其放回 JAVA .这很痛苦,但它允许我们现在在保存 Java 代码时自动格式化。感谢您的建议!
  • 如果不选中“从不加入行”,开/关宏对我不起作用 - 谢谢!
【解决方案3】:

this answer on SO

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

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

来源:Documentation at Oracle

【讨论】:

  • 这是最好的答案,因为它不依赖于用户 IDE 的配置。谢谢。
【解决方案4】:

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

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

保存,应用。

【讨论】:

  • 我认为这对于 SQL 示例之类的事情会有所帮助,但我不确定这对于完全禁用 IDE 格式化程序的一般情况是否足够。
  • 此解决方案在使用构建器模式时非常出色,并且随着 Java 8 中 lambda 的引入,其相关性肯定会增加。
【解决方案5】:

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

视窗 首选项 Java 代码风格 格式化程序

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

【讨论】:

    【解决方案6】:

    如果你把加号放在行首,它的格式会有所不同:

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

    【讨论】:

    • 这可能是一个有趣的折衷方案。一般来说,我想避免由于一种工具的一些不良行为而过多地更改代码的格式。在这种情况下,字符串连接运算符更像是一个意外,而不是 SQL 的本质。这就是为什么我更喜欢将它们写在每行的末尾。我觉得应该强调SQL作为行首。但这可能是在没有让我保留所需格式的解决方案的情况下的好方法。谢谢!
    • 不客气。实际上,几十年来我一直将 + 号放在行的最前面,而不是为了愚弄格式化程序。我更喜欢它们在前面,因为它让我更清楚正在发生的事情:行尾的内容有时会丢失。当我们使用燃木编译器时,它是某个地方的项目标准,它一直困扰着我。
    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

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

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

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

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

          【讨论】:

            【解决方案11】:

            幻象 cmets,在您想要新行的地方添加 //,非常棒!

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

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

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

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

            【讨论】:

              【解决方案12】:

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

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

              【讨论】:

                【解决方案13】:

                这个技巧有效:

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

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

                【讨论】:

                • 不使用格式化程序是个坏主意;格式化程序有助于捕获错误并使代码保持一致状态。
                • 一个有趣的建议,但我不明白格式化如何告诉我们代码是否好。
                • 我认为他的意思是他觉得写得不好、格式不好的代码应该保持原样,而不是格式化它以希望“改进它”。写得不好、格式不好的代码应该以某种方式“突出”,以便可以轻松识别。不太确定我是否完全同意,但我认为就是这样。
                • @Francis - 错误:自动格式化代码如何发现错误?一致性:一致性是一个很好的论据,但整体代码质量更重要。您可以为汉堡翻转定义一个很好的一致过程,但它永远不会适用于高级美食。如果您忽略了足够多的事实,烹饪 a 可能是一项相当复杂的活动或微不足道的事情。如果您认为软件开发就像汉堡包翻转工具,那么您可以使用它们来执行一致性。这不是反对格式化指南的论据,但如果开发人员不关心这些指南,则不会关心其他要点。
                • 我的论点是:我写的代码很好,而且我坚持格式指南。但我很懒惰。当我可以编写五行草率的代码,按下格式按钮并感到高兴时,为什么我必须插入正确数量的空格和换行符?在我格式化代码后,使用我的工具确保结果总是完美的,我和任何人一样对格式化很感兴趣。如果格式化只是一箭之遥,那么没有理由反对坚持指导方针(除了它们可能特别糟糕)。所有项目成员共享相同的代码格式设置。
                猜你喜欢
                • 2015-10-29
                • 2012-11-23
                • 1970-01-01
                • 2011-04-14
                • 2016-10-09
                • 1970-01-01
                • 2012-01-14
                • 2012-12-10
                相关资源
                最近更新 更多