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


488

我有一些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更易于阅读和维护(IMHO),尤其是对于较大的查询。例如,我可以将编辑器置于“覆盖”模式并相当容易地就地修改文本。

请注意,此问题超出了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)。


1
我们遇到了这个问题。Eclipse 应该有一个选项,可以始终在+所在的String构造函数中中断一行,而不管字符串的下一部分是否适合该行。但事实并非如此。:-(
JeeBee

显然,此功能是在Eclipse 3.6M6中添加的:bugs.eclipse.org/bugs/show_bug.cgi?
Guillaume

注意:如果您只是想防止Eclipse弄乱您的注释,则可以在每行前面使用//。要注释掉一个块,请突出显示并按Ctrl + /。
约翰·亨克尔

请注意,现在10年后,Java 14可能会带来多行字符串,这已成为过去。
托尔比约恩Ravn的安徒生

Answers:


865

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

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

必须在Eclipse首选项中将“打开/关闭”功能“打开” Java > Code Style > Formatter。点击EditOff/On Tags使能Enable Off/On tags

也可以在首选项中更改魔术字符串- 在此处查看Eclipse 3.6文档

更多信息

Java > Code Style > Formatter > Edit > Off/On Tags

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

在此处输入图片说明

您还需要启用来自 Java Formatting


7
此页面其他地方提到的“从不连接行”选项也非常有用。
xpmatteo 2012年

89
开/关功能必须打开。在Eclipse首选项中:Java>代码样式>格式化程序。单击“编辑”按钮,“关闭/打开标签”,然后选中“启用关闭/打开标签”。
Domenic D.

2
这在JavaScript代码样式首选项中不可用,我格式化方面遇到了完全相反的问题。:(
Redsandro

11
团队应将Eclipse首选项(文件)的副本导出到其Wiki,并要求每个人都使用相同的副本。对我们来说效果很好。;)
Joseph Lust

仅供参考,我必须删除//和@符号之间的空格才能使其正常工作。
Roy Truelove 2014年

61

格式化程序上的Eclipse 3.5 M4的AFAIK具有选项“从不连接线”,它保留用户换行符。也许这就是您想要的。

否则会有这个丑陋的骇客

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

1
因此,除了设置“从不加入行”选项外,我必须编写这些“幻像”注释吗?“ Never Join Lines”部分不应该自己工作吗?
格雷格·马特斯

2
是的,当然应该。幻影注释是一种替代方法(如果它不存在,或者您使用的是早期版本等)。
克里斯,

我将这种方法与TOAD中的自定义格式模板结合使用,使我可以从JAVA代码中剥离旧的SQL,对其进行重新格式化,并获取所有无关的注释,然后将其返回到JAVA中。这很痛苦,但是它允许我们立即保存Java代码以自动格式化。谢谢你的建议!
jnt30'7

如果不选中“从不连接行”,则开/关宏对我不起作用-谢谢!
Christoffer Soop,2014年

28

在SO上看到这个答案

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

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

资料来源:Oracle文档


2
这是最佳答案,因为它不依赖于用户IDE的配置。谢谢。
Azim

26

您可以将其配置为不连接已经换行的行,而不是关闭格式。与Jitter的响应类似,这是针对Eclipse STS的:

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

保存,申请。

在此处输入图片说明


1
我认为这将对SQL示例这样的事情有所帮助,但是我不确定对于完全禁用IDE格式化程序的一般情况是否足够。
格雷格·马特斯

2
使用生成器模式时,该解决方案非常好,它的意义当然是引进的lambda表达式在Java中8上升
乔纳斯Kongslund

16

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

Windows Preferences Java Code Style Formatter

按下Edit按钮。选择最后一个标签。注意“打开/关闭”框,并通过复选框启用它们。


14

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

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

1
这可能是一个有趣的折衷。通常,由于一种工具的某些不良行为,我想避免过多地更改代码的格式。在这种情况下,字符串连接运算符更多是偶然的,而不是SQL所发生问题的本质。这就是为什么我更喜欢在每行末尾写它们。我认为应该强调SQL作为这一行的开始。但是,如果没有可以让我保留所需格式的解决方案,这可能是个好方法。谢谢!
格雷格·马特斯

8
别客气。实际上,几十年来,我一直将+符号放在行的开头,而不是愚弄格式化程序。我更喜欢它们在前面,因为这使发生的事情对我更清楚:行尾的内容有时会丢失。早在我们使用燃木编译器时,它就是项目标准,它一直困扰着我。
CPerkins,2009年

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

5

每行末尾都有一个双斜杠“ //”。这样可以防止Eclipse将它们全部移到同一行。


4

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


4

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

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

因为您的同事正在重新格式化他们实际上没有更改的代码,所以这首先可以防止它发生。这是一个很好的做法,可以防止使源代码控件上的差异变得无用的麻烦(当由于格式设置的微小差异而重新格式化整个文件时)。

如果关闭了开/关标签选项,这也将阻止重新格式化。


2

幻影注释,添加//您想要的新行的地方,很棒!

  1. @formatter:off将代码中的引用添加到编辑器。我认为该代码不应包含此类引用。

  2. 不管使用哪种格式化工具,幻像注释(//)都可以使用。不管是Eclipse还是InteliJ或您使用的任何编辑器。这甚至可以与非常不错的Google Java格式一起使用

  3. 幻影注释(//)将在整个应用程序中正常工作。如果您也有Javascript,也许使用JSBeautifier之类的东西。您也可以在Javascript中使用类似的代码样式。

  4. 实际上,您可能确实想正确格式化吗?您要删除混合的制表符/空格和尾随空格。您要根据代码标准缩进行。您不想要的是长队。那就是幻象评论给您的!


-3

这个hack的作品:

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

我建议不要使用格式化程序。错误的代码应该看起来不好而不是人为地好。好的代码需要时间。您不能欺骗质量。格式化是源代码质量的一部分。


8
不使用格式化程序只是个坏主意;格式化程序有助于捕获错误并使代码保持一致状态。
弗朗西斯·阿普顿四世

一个有趣的建议,但是我不明白格式化如何告诉我们代码是否好。
克里斯,

2
我认为他的意思是,他认为应按原样保留编写不好,格式不正确的代码,而不是为了“改进”而对其进行格式化。编写不佳,格式不正确的代码应以某种方式“突出”,以便易于识别。不太确定我完全同意,但是我认为这是主意。
格雷格·马特斯

1
@Francis-错误:如何通过自动格式化的代码查找错误?一致性:一致性是一个很好的论据,但是整体代码质量更为重要。您可以为汉堡包翻转定义一个很好的一致过程,但不适用于高级美食。如果您忽略了足够的事实,则烹饪a可能是一项相当复杂的活动,或者是琐碎的事情。如果您认为软件开发就像汉堡包翻转工具一样,那么执行一致性就适合您。这并不是反对格式化准则的观点,但是,如果开发人员不关心这些准则,那么他们就不会关心其他要领。
Thomas Jung,

4
我在这里的论点是:我编写了不错的代码,并且遵守格式指导原则。但是我很懒。当我可以编写五行草率代码,按格式按钮并感到高兴时,为什么必须插入正确数量的空格和换行符?在使用我的工具格式化代码以确保结果始终完美之后,我和其他人一样对格式化感到纳粹。如果格式化只是一招而已,则没有理由反对坚持准则(否则可能会特别糟糕)。所有项目成员共享相同的代码格式设置。
Per Wiklander
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.