首页 文章

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

提问于
浏览
445

我有一些Java代码,其中SQL语句编写为Java字符串(请不要使用OR / 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      ";

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

Note that this issue generalizes beyond the particular example of SQL. Any code that is written with any vertical formatting, particularly tabular constructs, is susceptible to destruction by a pretty printer.

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

Is there a way to instruct Eclipse to ignore certain lines of source with respect to formatting?

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

// STOP-ECLIPSE-FORMATTING
String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";
// START-ECLIPSE-FORMATTING

显然,一个"solution"是让我们的团队成员在一些外部格式化程序(如JalopyJIndent)上标准化,但是's not what this question is about (also, not my decision on this project): I'm特别寻找一种方法来临时避免Eclipse格式化程序 .

理想情况下,解决方案将允许我插入Eclipse格式化程序 without requiring team members using Eclipse to do any IDE reconfiguration 的指令(除了可能选择格式化程序无关的命令注释: STOP-ECLIPSE-FORMATTINGSTOP-FORMATTING ) .

12 回答

  • 21

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

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

    由于您的同事正在重新格式化他们实际上没有改变的代码,因此这可以防止它首先发生 . 这是一种很好的做法,可以防止在源代码控制上呈现diff的错误(当由于较小的格式设置差异而重新格式化整个文件时) .

    如果关闭开/关标签选项,它还会阻止重新格式化 .

  • 58

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

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

    必须在Eclipse首选项中打开/关闭功能"on":Java>代码样式>格式化程序 . 单击编辑,关/开标签,启用启用关/开标签 .

    也可以在首选项中更改魔术字符串 - check out the Eclipse 3.6 docs here .

    More Information

    Java>代码样式>格式化程序>编辑>关/开标签

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

    enter image description here

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

  • -3

    this answer on SO .

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

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

    资料来源:Documentation at Oracle .

  • 16

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

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

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

    Windows→首选项Java→代码样式→格式化程序

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

  • 14

    我正在使用固定宽度的字符串部分(用空格填充)以避免格式化程序弄乱我的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 3.5 M4的AFAIK有一个选项“Never Join Lines”,可以保留用户换行符 . 也许那就是你想要的 .

    还有这个丑陋的黑客

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

    这个黑客有效:

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

    我建议不要使用格式化程序 . Bad code should look bad not artificially good. 好的代码需要时间 . 你不能在质量上作弊 . 格式化是源代码质量的一部分 .

  • 1

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

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

    • 无论使用何种格式化工具,幻像注释(//)都将起作用 . 无论是Eclipse还是InteliJ或您使用的任何编辑器 . 这甚至适用于非常好的Google Java Format

    • 幻像注释(//)将在您的应用程序中运行 . 如果你也有Javascript,也许使用像JSBeautifier这样的东西 . 您也可以在Javascript中使用类似的代码样式 .

    • Actually, you probably DO want formatting 对吗?您想要删除混合制表符/空格和尾随空格 . 您希望根据代码标准缩进行 . What you DONT want is a long line. 那只是幻影评论给你的东西!

  • 22

    用双斜杠“//”结束每一行 . 这将使eclipse无法将它们全部移动到同一条线上 .

  • 4

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

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

    保存,申请 .

    enter image description here

  • 5

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

相关问题