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

Gre*_*tes 474 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";
Run Code Online (Sandbox Code Playgroud)

我有类似的东西:

String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";
Run Code Online (Sandbox Code Playgroud)

这种风格使SQL更易于阅读和维护(恕我直言),特别是对于较大的查询.例如,我可以将我的编辑器置于"覆盖"模式,并相当容易地就地修改文本.

请注意,此问题超出了SQL的特定示例.任何使用任何垂直格式编写的代码,特别是表格结构,都容易被漂亮的打印机破坏.

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

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

我正在寻找像切换Eclipse格式化程序的特殊注释.理想情况下,这样的评论可以配置为我们选择的任何内容,其他格式化程序也可以编程为尊重它:

// STOP-ECLIPSE-FORMATTING
String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";
// START-ECLIPSE-FORMATTING
Run Code Online (Sandbox Code Playgroud)

显然,一个"解决方案"是让我们的团队成员对JalopyJIndent这样的外部格式化程序进行标准化,但这不是这个问题的原因(也不是我对这个项目的决定):我正在寻找一种方法在临时的基础上避免使用Eclipse格式化程序.

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

xpm*_*teo 846

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

// @formatter:off
...
// @formatter:on
Run Code Online (Sandbox Code Playgroud)

必须在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

  • **开/关功能必须"打开".**在Eclipse首选项中:Java>代码样式>格式化程序.单击"编辑"按钮,"关/开标签",勾选"启用关/开标签". (88认同)
  • 团队应该将Eclipse prefs(文件)的副本导出到他们的wiki,并要求每个人都使用相同的.适合我们.;) (11认同)
  • 此页面其他地方提到的"从不加入行"选项也非常有用. (7认同)
  • 这在_JavaScript Code Style preferences_中不可用,我有[完全相反的问题](http://stackoverflow.com/questions/14751338/stop-eclipse-from-closing-and-opening-quotes-on-new -line-inside-quotes)格式化.:( (2认同)

jit*_*ter 59

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

还有这个丑陋的黑客

String query = //
    "SELECT FOO, BAR, BAZ" + //
    "  FROM ABC"           + //
    " WHERE BAR > 4";
Run Code Online (Sandbox Code Playgroud)

  • 是的,当然应该.幻影评论是一种替代方法(如果它不存在,或者你遇到了早期版本,等等). (2认同)

Ren*_*aud 25

在SO上看到这个答案.

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

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

来源:Oracle的文档.

  • 这是最好的答案,因为它不依赖于用户IDE的配置.谢谢. (2认同)

ili*_*nca 24

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

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

保存,申请.

在此输入图像描述

  • 当使用构建器模式时,此解决方案非常出色,并且随着Java 8中lambda的引入,它的相关性无疑得到了提高。 (2认同)

小智 16

您必须打开添加格式化程序标记的功能.在菜单栏中去:

Windows Preferences Java Code Style Formatter

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


CPe*_*ins 14

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

String query = 
    "SELECT FOO, BAR, BAZ" 
    +    "  FROM ABC"           
    +    " WHERE BAR > 4";
Run Code Online (Sandbox Code Playgroud)

  • 别客气.实际上,几十年来我一直把我的+标志放在线的前面,而不是欺骗格式化器.我更喜欢他们在前面,因为它使我发生的事情更加清晰:一条线的末端有时会丢失.当我们使用woodburning编译器时,这是项目标准的某种方式,而且它一直困扰着我. (7认同)

Guu*_*uus 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                          ";
Run Code Online (Sandbox Code Playgroud)


Evv*_*vvo 5

用双斜杠"//"结束每一行.这将使日食不会将它们全部移到同一条线上.