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

我有一些Java代码,用Java语言编写的SQL语句(请不要使用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 

显然,一个“解决方案”是让我们的团队成员在Jalopy或JIndent这样的外部格式化器上进行 标准化 ,但是这不是这个问题所关心的问题(也不是我在这个项目上的决定):我特别想找一个方法避免Eclipse格式化器临时使用。

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

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

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

在Eclipse首选项中必须打开/关闭功能: Java > Code Style > Formatter 。 点击编辑关闭/打开标签 ,启用启用关闭/打开标签

也可以在首选项中更改魔术字符串 – 在这里查看Eclipse 3.6文档 。

更多信息

Java > 代码样式 > 格式化 > 编辑 > 关闭/打开标签

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

在这里输入图像描述

您还需要启用Java格式化中的标志

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

否则有这个丑陋的黑客

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

而不是关闭格式,您可以配置它不加入已包装的行。 类似于Jitter的回应,这里是Eclipse STS:

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

保存,应用。

在这里输入图像描述

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

Windows 偏好 Java 代码风格 格式化程序

按下Edit按钮。 选择最后一个标签。 注意开/关框,并启用一个复选框。

在SO上看到这个答案 。

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

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

来源: Oracle的文档 。

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

 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 "; 

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

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

这将阻止它发生,因为你的同事正在重新格式化他们没有实际改变的代码。 这是一个很好的做法,可以防止在您的源代码控制中渲染diff的意外(由于小的格式设置差异而重新格式化整个文件时)。

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

用双斜杠“//”结束每一行。 这将使eclipse不能将它们全部移到同一行上。

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

幻影评论,添加/ /你想要新的行,是伟大的!

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

  2. 幻影评论(/)将工作,无论使用格式化工具。 无论使用Eclipse还是InteliJ或其他编辑器。 甚至可以使用非常好的Google Java格式

  3. 幻影评论(/)将遍布你的应用程序。 如果你也有Javascript,也许使用像JSBeautifier的东西。 您也可以在Javascript中使用类似的代码样式。

  4. 其实,你可能想要正确的格式 ? 您想删除混合的制表符/空格和尾随空格。 你想按照代码标准缩进行。 你不想要的是一个很长的路线。 那只是幻影评论给你的!

这个黑客工作:

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

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

Interesting Posts