Intellij IDEA 13:如何禁用重构注释和字符串?

Intellij IDEA 13: how do I disable refactor comments and strings?

提问人:mjs 提问时间:1/2/2014 最后编辑:mjs 更新时间:7/7/2020 访问量:11584

问:

public class KV<K, V> {
    public K key;
    public V value;
    public KV(K key, V value) {
        this.key = key;
        this.value = value;
    } 
}

我正在尝试重构类变量,这发生在原地。这意味着不会弹出任何对话框;我按回车键,它试图在整个项目中重构,包括注释和其他不注释的内容,包括:value

<%--<link href="<c:url value="../core/core.css" />" />--%>

在 .jsp 文件中。这太“聪明”了,无法尝试重构与整个项目匹配的注释。这通常会导致大量的错误风险,并且在 Java 环境中重构不再安全。

同样的事情也发生在 Intellij 12 中。说真的,我不需要 Intellij 推荐任何被认为不安全的东西,或者当它不确定它是一回事时!

我可以排除重构,但我没有时间每次都评估五个“建议”。它只会增加人为错误的机会:大多数时候我只是按回车键,然后事情就会被重构。

重构也是 Java 环境中的一个主要问题,因为它有时会尝试替换 .js 文件中的内容。说真的,这必须停止。

如果没有弹出对话框,我无法取消选中“搜索字符串”。即使勾选了该选项,Intellij 也不应默认包含建议,尤其是当它位于当前文件之外时。它也可以建议重构它们,但默认情况下应排除它们。也就是说,它应该是一个选择加入的功能,而不是默认破坏所有内容。

这是最近所谓的“智能”Intellij 重构的一个严重的用户体验问题。重构 JS 文件时,我不想在 Java 文件中搜索注释或字符串!时期!反之亦然!

安全第一!知道自己在做什么的开发人员会在需要时自己搜索字符串。在动态语言环境中,它使 Intellij 无法使用,因为通常没有任何明确的模式,有时重构会通过,有时它会改变整个项目的内容等等。

应该有一个选项说,“仅相对于此文件或在 100% 推断时重构!”,特别是对于动态语言!对于静态语言,它甚至不应该尝试在文件外部查找注释和字符串。

我并不是要把它公开发布,但我在 2 多年前在 bugtracker 中提出了这个问题,但没有人注意。

编辑

对于那些认为我可能会走得更远的人,我只是尝试了一下:

使用此类:

public class KV<K, V> {
    public K key;
    public V val;
    public KV(K key, V val) {
        this.key = key;
        this.val = val;
    }
}

并将其添加到任何 Java 类中,例如:

public class CoreConfig {
    String abc = "kv.val";
    String def = "somethingElse.val";
}

像以前一样重构时,我会得到以下建议,一个来自灾难的 ENTER,以及我必须一次评估和排除一个的建议。这需要努力,而且很烦人和冒险。就像有人大喊,停下!然后哦,一分钟后什么都没有,沮丧和一篇 1000 字的长文(这个)。KV.val

enter image description here

说真的,有没有办法禁用这种危险行为!?有什么理由默认打开??

编辑20200706

狗屎在2020年继续:https://youtrack.jetbrains.com/issue/IDEA-245370

智能创意

评论

5赞 TatiOverflow 2/5/2017
Intellij 充满了强加给我的东西。如果 android 支持其他编辑器,我会在心跳中切换。我发现自己在与编辑器作斗争,而不是花时间编码。我花时间在这里试图找到一种方法来关闭它。大多数时候,他们不推荐解决方案。大多数时候他们都在说......“你为什么讨厌这个功能?”
1赞 Vicky Chijwani 2/12/2017
至少这个功能应该有一个最小长度限制——就像我正在重构一个具有通用 3 个字母名称的变量一样,默认情况下在字符串和注释中搜索和替换它是没有意义的。如果是一个大型项目,那么这个 3 个字母的序列极有可能存在于随机字符串中。呸。
1赞 yeoman 3/28/2019
它现在很普通,只是破碎了。它曾经是一个有意义的 IDE。无法关闭这种可怕的默认行为使 IntelliJ 成为一个糟糕的工具,我在不知不觉中创造了可怕的看似无关的错误,就像 IntelliJ 多年来让我难以做到的那样......我一直忘记了我不能再相信它的重构了-.-
1赞 yeoman 3/28/2019
今天,它改变了Spring MVC POST映射的路径,因为我将类移动到了另一个包(!!!!!!)
1赞 ACV 8/26/2019
是的,这是 intellij 最糟糕的功能之一。如果我想重命名一个类,我最终可能会破坏整个项目,因为该类名恰好出现在字符串中。因此,如果您将类重命名为它将重命名所有内容,包括配置文件、标签、url、rest 调用映射中的路径......UserMyUser

答:

112赞 Meo 1/2/2014 #1

当您按两次时,它会打开对话框,您可以禁用“在注释和字符串中搜索”Shift + F6 (Refactor Rename)

评论

10赞 Kris Erickson 1/2/2014
需要明确的是,激活了“重构重命名”的快捷方式两次。它可能是一个不同的组合,具体取决于您的按键映射。
4赞 mjs 1/2/2014
谢谢,我看到您也可以禁用就地重构,尽管它很好,因为这总是感觉安全。我这篇文章的重点是强调应该全局关闭对评论和字符串的搜索。它试图改变另一个类中变量中的值是没有意义的。这并不聪明。当智能或人工智能假设通过增加正确的可能性,以某种方式允许它有误差范围时,就会出现问题。我想要严格的 java 重构,除非存在整个包名称,否则应该包括 XML 文件
1赞 Meo 1/2/2014
但是由于它记住了设置,我认为它没有问题。您可以根据需要使用或不使用全文重构。
3赞 Erk 7/19/2018
不幸的是,该复选框似乎时不时地重新出现。有谁知道可以永久关闭此设置?如前所述,IntelliJ 在这里太“聪明”了......
0赞 mjs 11/7/2019
@Meo它并不尊重任何地方。如今,javascript 中的内联、编码文本重构正在修改代码中的值和注释,甚至在函数中也不修改。
7赞 Jk1 1/2/2014 #2

有什么理由默认打开??

是的,有。如今,人们倾向于使用太多的 DSL、模板和语言注入。在普通的旧 Java 中,所有这些东西主要以 String 的形式存在。反射 API 还将方法/类名表示为 String。任何 IDE 都不可能支持和识别所有这些,因此最好为您提供一个安全网,防止可能的重构错误。但是,如果您有很好的单元测试覆盖率,那么您在这里可能是安全的。

至于注释,它们通常包含代码示例。这些代码块在重命名过程中会很快过时,因此当 IDE 提醒您它们的存在时会很有帮助。

当然,这种检查有时会导致误报。但是,如果您为变量提供描述性不言自明的名称(我的意思是不是“var”或“val”),则不太可能发生这种情况。因此,IDE 正在以某种方式推动您走向更好的代码风格。

如果您仍然不相信,请遵循@Meo的建议,并禁用字符串和注释中的搜索。

评论

9赞 mjs 1/2/2014
是的,这是一个很好的建议。但正如我对他的评论一样,当智能或人工智能假设通过增加正确的可能性时,就会出现一个问题,它以某种方式被允许有误差范围。我想要严格的 java 重构,除非整个包名称存在,否则应该包括 XML 文件,即使那样,我也希望收到通知。重构结果不应首先列出注释和字符串,默认情况下应排除。它变得不那么用户友好,需要我集中注意力,这迫使我向前倾并拉伤我的眼睛。
2赞 mjs 1/2/2014
这就像试图记下一个塞满的电话号码。你能重复这个数字吗:392314213343234295423442?对我来说,这是同样的努力,当然对许多其他人来说也是如此。我希望 Intellij 的家伙们能拿起并给我们关闭它的选项。
11赞 mjs 1/2/2014
“但是,如果你有一个优秀的单元测试覆盖率,那么你在这里可能是安全的”——这并不是为我们提供将 Java 视为动态语言的想法的借口。如果我想要一种动态语言,我会用Groovy编写代码。“如果你给你的变量起描述性的不言自明的名字(我的意思是不是”var“或”val“)” - 但碰撞的风险仍然存在。只需给我们一个“严格”的 Java 模式/选项,就像 Eclipse 和 Intellij 过去提供的那样。
5赞 Nicolas Zozol 11/17/2014
一次错误点击,我就会删除 Symfony 的框架。我们应该能够“默认排除”。
5赞 Jilles van Gurp 6/22/2017
刚刚也遇到了这个。绝对危险的默认值,我犯了一个错误,即重命名了几次“价值”之类的东西,但没有立即注意到可能对项目造成的巨大损害。