How to turn off the Eclipse code formatter for certain sections of Java code?
我有一些Java代码,其中SQL语句编写为Java字符串(请不要使用OR / M flamewars,嵌入式SQL就是这样 - 不是我的决定)。
为了便于维护,我在几行代码中将SQL语句在语义上分解为几个连接的字符串。所以,而不是像:
1 |
我有类似的东西:
1 2 3 4 |
这种风格使SQL更易于阅读和维护(恕我直言),特别是对于较大的查询。例如,我可以将我的编辑器置于"覆盖"模式,并相当容易地就地修改文本。
请注意,此问题超出了SQL的特定示例。使用任何垂直格式编写的任何代码,特别是表格式构造,都容易被漂亮的打印机破坏。
现在,一些项目成员使用Eclipse编辑器,语义格式在格式化整个源文件时经常被破坏。
有没有办法指示Eclipse在格式化方面忽略某些源代码行?
我正在寻找像切换Eclipse格式化程序的特殊注释。理想情况下,这样的评论可以配置为我们选择的任何内容,其他格式化程序也可以编程为尊重它:
1 2 3 4 5 6 | // STOP-ECLIPSE-FORMATTING String query = "SELECT FOO, BAR, BAZ" + " FROM ABC " + " WHERE BAR > 4 "; // START-ECLIPSE-FORMATTING |
显然,一个"解决方案"是让我们的团队成员对Jalopy或JIndent这样的外部格式化程序进行标准化,但这不是这个问题的原因(也不是我对这个项目的决定):我正在寻找一种方法在临时的基础上避免使用Eclipse格式化程序。
理想情况下,解决方案允许我为Eclipse格式化程序插入指令,而无需团队成员使用Eclipse进行任何IDE重新配置(除了可能选择格式化程序无关的命令注释:
Eclipse 3.6允许您通过放置特殊注释来关闭格式,例如
1 2 3 | // @formatter:off ... // @formatter:on |
必须在Eclipse首选项中打开/关闭功能:Java > Code Style> Formatter。单击Edit,Off / On Tagsabbbd,启用Enable Off / On tags。
也可以在首选项中更改魔术字符串 - 请在此处查看Eclipse 3.6文档。
更多信息
Java
>
Code Style
>
Formatter
>
Edit
>
Off / On Tagsabbbd
此首选项允许您定义一个禁用的标记和一个标记以启用格式化程序(请参阅格式化程序配置文件中的"关闭/打开标记"选项卡):
您还需要从Java Formatting启用标志
格式化程序中来自Eclipse 3.5 M4的AFAIK有一个选项"Never Join Lines",可以保留用户行中断。也许那就是你想要的。
还有这个丑陋的黑客
1 2 3 4 |
在SO上看到这个答案。
您可以使用另一种解决方案来抑制特定块注释的格式。在块注释的开头使用
1 2 3 4 5 6 7 8 | /*- * Here is a block comment with some very special * formatting that I want indent(1) to ignore. * * one * two * three */ |
来源:Oracle的文档。
您可以将其配置为不加入已包装的行,而不是关闭格式。与Jitter的响应类似,这里是Eclipse STS:
属性→Java代码样式→格式化程序→启用项目特定设置或配置工作区设置→编辑→换行(选项卡)→选中"从不加入已包装的行"
保存,申请。
您必须打开添加格式化程序标记的功能。在菜单栏中去:
Windows
→
首选项
Java
→
代码样式
→
格式化程序
按Edit按钮。选择最后一个选项卡。注意On / Off框并使用复选框启用它们。
如果将加号放在行的开头,则格式不同:
1 2 3 4 |
用双斜杠"//"结束每一行。这将使日食不会将它们全部移到同一条线上。
我正在使用固定宽度的字符串部分(用空格填充)以避免格式化程序弄乱我的SQL字符串缩进。这为您提供了混合结果,并且在SQL中没有忽略空格的情况下不起作用,但可能会有所帮助。
1 2 3 4 | 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设置应设置为仅格式化已编辑的代码行而不是整个文件。
由于您的同事正在重新格式化他们实际上没有改变的代码,因此这可能会阻止它首先发生。这是一种很好的做法,可以防止在源代码控制上呈现diff的错误(当由于较小的格式设置差异而重新格式化整个文件时)。
如果关闭了开/关标签选项,它还会阻止重新格式化。
替代方法:在Eclipse 3.6中,在"Line Wrapping"下,然后在"General Settings"中有一个选项"Never never have wrapped wra lines"。这意味着格式化程序将包装长行但不撤消已有的任何包装。
幻影评论,添加
@formatter:off将代码中的引用添加到编辑器中。 在我看来,代码应该没有这样的引用。
无论使用何种格式化工具,幻像注释(//)都将起作用。 无论是Eclipse还是InteliJ或您使用的任何编辑器。 这甚至适用于非常好的Google Java格式
幻像注释(//)将在您的应用程序中运行。 如果你也有Javascript并且可能使用类似JSBeautifier的东西。 您也可以在Javascript中使用类似的代码样式。
实际上,你可能想要格式化吗? 您想要删除混合制表符/空格和尾随空格。 您希望根据代码标准缩进行。 你不想要的是一条很长的路。 只有那个,幻影评论给你的是!
这个黑客有效:
1 2 3 4 |
我建议不要使用格式化程序。糟糕的代码应该看起来很糟糕而不是人为的好。好的代码需要时间。你不能在质量上作弊。格式化是源代码质量的一部分。