【问题标题】:How to make vscode stop overriding closing parentheses on insertion如何使 vscode 在插入时停止覆盖右括号
【发布时间】:2017-08-08 16:05:54
【问题描述】:

当我尝试添加右括号时,它总是会覆盖右边的下一个括号。

这是一个屏幕截图(看起来我在键盘上按了右键,但实际上我插入了一个新的右括号):

是否可以改变这种行为?

【问题讨论】:

    标签: visual-studio-code vscode-settings


    【解决方案1】:

    从 1.38 版开始,答案是,您可以完全关闭它,同时仍保留自动关闭括号

    该版本引入了一个新设置editor.autoClosingOvertype,它可以采用三个可能的值:

    • always - 总是改写结束括号(旧的、经典的、受 Sublime-Text 启发的行为)
    • auto - “智能”改写尝试检测编辑器是否自动插入关闭括号,并仅改写那些括号(这是默认设置)
    • never - 永远不要改写右括号

    当前的默认行为是在 1.37 版中引入的。那时,没有可用的设置,无论如何你只是得到了“智能”的改写行为。

    出于历史目的,我将保留以下材料。


    不,(目前)不可能,这是设计使然。当您输入全新的代码并输入左括号时,您会自动获得右括号(当然,当您打开editor.autoClosingBrackets 时)。然后,当您在这些括号内输入完您想要的任何内容后,您将如何“退出”并将右括号留在原处?最自然的方法是键入右括号!有些人不同意,但许多打字员发现这比将手一直移到箭头键或鼠标移过去要容易得多。

    请注意,这种行为很大程度上受 Sublime Text 的启发和模仿。

    了解自动闭合括号功能并非主要用于节省击键可能会有所帮助。相反,它的主要目的是提高语法高亮的稳定性(当有一个未闭合的括号时它会变得不稳定),其次是帮助防止您忘记键入右括号。如果你碰巧因为其他原因没有输入它就离开了,那么恭喜你确实免费获得了那个括号!

    如果您想添加一个括号(请注意,在您的示例中,您将添加一个 mismatched 括号),您拥有的两个最简单的选项是(1)将在键入新括号之前,光标 右括号簇之后,或者 (2) 将光标放在您所做的位置,但只需继续键入右括号,直到添加新括号。在任何一种情况下,任何 new 括号都只会添加到集群的末尾。

    更新(现已过时):

    不管怎样,现在跟踪器上有一个issue,还有一个pull request,用于创建一个允许您关闭“括号吞咽”的设置。对于正在阅读本文的任何人,如果您对此感兴趣,您应该就拉取请求提供反馈。

    进一步更新(现已过时):

    目前有new code 正在测试,它将make the bracket overtyping more sophisticated。计划是让编辑器跟踪自动生成了哪些括号,并且只在这些括号上键入。一旦光标离开括号区域,编辑器就会停止跟踪这些括号,它们会变成“成熟”的字符,无法再输入。希望这将在有用的地方保留过度输入,并在没有用的地方摆脱它。请注意,目前的计划是让这种新行为成为标准,并且有一个设置来控制它是否生效。

    【讨论】:

    • 该功能完全有意义,只是实现太天真而无用。它不验证括号是否匹配,因此添加 missing 括号变得更加困难。
    • @ÁlvaroGonzález - 我听到你在说什么,但我不确定是否有任何“聪明”的方式来处理这个问题。仅检查括号是否匹配不足以处理所有合理的情况。如果您的软件无法读懂您的想法,那么最好的办法是让您的软件具有易于定义、可预测的行为(即使它很幼稚),以便可以适应它。如果您根本无法习惯该功能,那么幸运的是,您可以将其完全关闭。 (就我个人而言,我已将其关闭,但出于其他原因。)
    • 我发现这些自动关闭助手更多的是阻碍而不是有用。特别是当您需要返回并将if 拆分为嵌套的if 或您想要修改某些现有代码的各种其他实例时。第一次输入代码时通常不会出现问题。我关闭了所有这三个:"editor.autoClosingQuotes": "never""editor.autoClosingBrackets": "never""editor.autoSurround": "never"
    • @JohnY 将功能建立在自己的角度上,然后尝试“教”大众做不同的事情是一个巨大的错误。更糟糕的是,如果您不是开发人员之一,只是“喝了他们的饮料”,然后尝试让其他人也这样做。跑题了,我就停下来。没有冒犯,只是不回答。我遇到了问题,因为我在事后花费大量时间编辑其他人(或我自己的)括号,并且由于编辑器没有遵循我的领导,我在 Angular 中不断收到无与伦比的括号错误。
    • @DanChase - 我希望你不是说我试图让人们做任何事情。我只是试图解释该功能背后的基本原理,因为这通常有助于学习如何应对它或决定选择其他编辑器。您还应该知道,VS Code 只是直接从 Sublime Text 复制了这种行为,早在 VS Code 出现之前(现在仍然存在),它是一个非常流行且备受推崇的编辑器。很明显,那里有一些喜欢并期待它的用户群(甚至愿意为此付费)。
    【解决方案2】:

    试试setting:

    "editor.autoClosingBrackets": "never"
    

    完全禁用自动关闭括号功能。

    【讨论】:

    • 从技术上讲,它解决了我的问题……但我实际上喜欢自动关闭功能。我只是不喜欢自动覆盖的东西。
    • 我同意 OP (kundasaba);即,我喜欢在添加“(”时自动关闭,但不喜欢在输入“)”时省略“)”。在编辑具有大量嵌套的现有代码时,这确实是个问题。此外,当不在最里面的 '(' / ')' 对中添加 '(' 时,自动关闭似乎不起作用。
    • 我改了这个,但是没有效果。即使重启后。这让我发疯:(
    【解决方案3】:

    Vscode 终于解决了这个问题,你不需要做任何事情来获得新的行为。现在它只会吞下自动添加的括号,所以一切都按预期工作。如果您已经在设置中禁用了 autoClosingBrackets 选项,建议现在重新开启。

    【讨论】:

    • 您是否遇到了函数调用的错误,或者他们是否引入了一个设置来修复它?它按预期工作,除了当我智能感知一个函数然后它插入左括号,但在关闭时它会插入另一个而不是跳过它
    • 我不确定我是否理解您的问题。无论如何,直到几周前,如果您尝试插入右括号,该括号将被吞下(查看原始问题中的 gif)。现在他们修复了此行为,您无需更改设置中的任何内容。
    • 有些人可能会发现他们仍然从不希望any括号被吞下。最新版本允许您根据需要选择该行为(请参阅我的更新答案)。
    【解决方案4】:

    使用 VSCode 原始设置的方法是在括号列表的末尾添加新的括号。

    ...if (test === funFunction(data))| /* <- here */ {...
    

    您应该能够键入一个新的括号,并且它不会覆盖旧的括号。这并不能解决您的问题,但是如果您想遵循 VSCode 使用的范例,那么您就可以了。

    (我个人像其他 cmets 所说的那样禁用它)

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 2021-06-02
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 2023-02-16
      • 2013-05-05
      • 2022-06-11
      相关资源
      最近更新 更多