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

如何为Java代码的某些部分关闭Eclipse代码格式化程序?,java,eclipse,code-formatting,pretty-print,eclipse-formatter,Java,Eclipse,Code Formatting,Pretty Print,Eclipse Formatter,我有一些Java代码,其中SQL语句是用Java字符串编写的(请不要或/M flamewars,嵌入式SQL就是它——不是我的决定) 为了便于维护,我在几行代码中将SQL语句语义上分解为几个串联字符串。因此,与其说: String query = "SELECT FOO, BAR, BAZ FROM ABC WHERE BAR > 4"; String query = "SELECT FOO, BAR, BAZ" + " FROM ABC " +

我有一些Java代码,其中SQL语句是用Java字符串编写的(请不要或/M flamewars,嵌入式SQL就是它——不是我的决定)

为了便于维护,我在几行代码中将SQL语句语义上分解为几个串联字符串。因此,与其说:

String query = "SELECT FOO, BAR, BAZ FROM ABC WHERE BAR > 4";
String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";
我有点像:

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
显然,一个“解决方案”是让我们的团队成员在一些外部格式化程序(如or)上进行标准化,但这不是这个问题的核心(也不是我在这个项目上的决定):我正在特别寻找一种方法来避免临时使用Eclipse格式化程序

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

这种方法有效:

String x = "s" + //Formatter Hack
    "a" + //
    "c" + //
    "d";
我建议不要使用格式化程序坏代码应该看起来不好,而不是人为地好。好代码需要时间。你不能在质量上作弊。格式化是源代码质量的一部分。

这种方法有效:

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

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

格式化程序上Eclipse3.5 M4的AFAIK有一个选项“永不连接行”,它保留用户换行符。也许这就是你想要的

否则就有这个丑陋的黑客

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

格式化程序上Eclipse3.5M4的AFAIK有一个选项“从不连接行”,它保留用户行中断。也许这就是你想要的

否则就有这个丑陋的黑客

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

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

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

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

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

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

Eclipse3.6允许您通过放置特殊注释来关闭格式设置,如

// @formatter:off
...
// @formatter:on
打开/关闭特性必须在Eclipse首选项中“打开”:Java>代码样式>格式化程序。单击编辑、关闭/打开标记、启用关闭/打开标记

还可以更改首选项中的神奇字符串-

更多信息

爪哇 > 代码样式 > 格式化程序 > 编辑 > 关闭/打开标签

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


您还需要启用Java格式化中的标志,Eclipse3.6允许您通过放置特殊注释来关闭格式化,如

// @formatter:off
...
// @formatter:on
打开/关闭特性必须在Eclipse首选项中“打开”:Java>代码样式>格式化程序。单击编辑、关闭/打开标记、启用关闭/打开标记

还可以更改首选项中的神奇字符串-

更多信息

爪哇 > 代码样式 > 格式化程序 > 编辑 > 关闭/打开标签

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


您还需要启用Java格式化中的标志替代方法:在Eclipse3.6中,在“换行”下,然后在“常规设置”下,有一个“从不连接已换行的行”选项。这意味着格式化程序将换行,但不会撤消已进行的任何换行操作。

替代方法:在Eclipse3.6中,在“换行”然后是“常规设置”有一个选项“从不连接已换行的行”。这意味着格式化程序将换行较长的行,但不会撤消任何已换行操作。

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

窗户 → 偏好 JAVA → 代码样式 → 格式化程序


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

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

窗户 → 偏好 JAVA → 代码样式 → 格式化程序


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

@xpmatteo有禁用部分代码的答案,但除此之外,默认eclipse设置应设置为仅格式化编辑行