【问题标题】:VSCode: keeping indents on empty linesVSCode:在空行上保持缩进
【发布时间】:2017-12-25 12:09:53
【问题描述】:

是否可以让 VSCode 在空行上保持缩进?

在本机和“美化”扩展中都找不到这样的设置。

期望行为示例:

更新:最终我刚刚切换到Prettier - 再也不用考虑代码样式了,因为它只是为我自动格式化。

【问题讨论】:

  • 你为什么要这样?也许editor.trimAutoWhitespacefiles.trimTrailingWhitespace 的设置正是您要找的?
  • 我想实现与 IntelliJ IDEA 的“在空行上保持缩进”功能相同的功能。当它打开并运行“重新格式化代码”操作时,IntelliJ 会确保空行正确缩进,如我刚刚添加的示例屏幕截图所示。
  • editor.trimAutoWhitespace 确实是你想要的。
  • 感谢 Scruffy,但不幸的是它没有成功。
  • 当我格式化文档时,Prettier 似乎没有在空行上保留缩进

标签: visual-studio-code


【解决方案1】:

截至:2022-02-01

这是对我有用的解决方案,即使在 VSCODE 格式化(linting)开启时也是如此:

有两个本机 VSCODE 设置可以自动格式化您的代码:

  1. “editor.formatOnSave”:真,
  2. “editor.formatOnType”:真,

这些设置仅在以下情况下才会影响您的文本编辑器 “editor.defaultFormatter”不为空

这里有问题

  1. “editor.trimAutoWhitespace”VSCODE 设置解决了该问题,但仅适用于“editor.formatOnType”自动格式化,当您保存文档时,此设置将被忽略。
  2. 您可能还想在所有情况下修剪AutoWhitespaces,但在空行上留下缩进的情况除外。 (这是我的情况)。

就我而言,在编码时,我在终端中逐块测试我的代码。在我的例子中,python 的问题是 for 循环的结尾和条件是由缩进定义的。在这种情况下,由于终端逐行运行代码,而不是分块运行代码,因此删除了缩进,终端认为 for 和 if 命令在它们实际完成之前就完成了。

解决办法如下:

  1. 永远不要在您的 VSCODE 设置中定义 edit.defaultFormatter,按语言定义它。

你是怎么做到的?

  • 将 VSCODE“editor.defaultFormatter”更改为 null,如下所示:
    "editor.defaultFormatter": null,

  • 将语言格式化程序更改为您喜欢的。就我而言:
    python.formatting.provider": "黑色"

VSCODE 使您可以为任何语言选择格式化(linting)提供程序。这些提供者的规则比 VSCode 原生规则要详细得多。在 VS 代码中按 CRTL+SHIFT+P 并搜索“首选项:配置语言特定设置...”。然后为所述语言定义格式提供程序。

  1. 每个提供者(在我的例子中是“黑色”)都提供忽略某种格式规则的选项。设置此提供程序的忽略参数。 就我而言,我只忽略 2 条规则,我的设置是:
  • “python.formatting.blackArgs”:[“--ignore=E501,W293”],

规则 E501 = 超过 80 个字符的行。

规则 W293 = 仅包含空格的空行。

忽略 W293 允许自动修剪空格继续处理各种尾随空格,W293 中提到的情况除外。

【讨论】:

  • 修正完毕。
【解决方案2】:

时间戳
2021,使用 VS Code v1.56.2

用例:

您使用editor.action.trimTrailingWhitespace。稍后您希望在函数中编写新代码。您导航到函数中的空白行,但发现该行没有缩进并且完全为空。在这种情况下,您有四种选择:

  1. 多次点击Tab,直到光标位于正确的缩进位置。
  2. 向上导航到具有适当缩进的行,按End,然后按Enter
  3. 在正确缩进的行的右侧单击鼠标,然后按 Enter
  4. 反复按 Ctrl + ] 以缩进空行。[见脚注 1]

此答案通过为您插入缩进来自动化此工作流程(当您导航到由缩进线包围的空行时)。

背景: 花了 3 个小时尝试此页面上的所有解决方案(以及许多不同的扩展)。找不到其他有效的方法。

通过扩展解决

implicit-indentjemc 的扩展名:
https://marketplace.visualstudio.com/items?itemName=jemc.vscode-implicit-indent

导航到时自动缩进一个空行(如果其周围的行缩进)。

功能

通过实验,implicit-indent 的工作原理如下:

  • 自动检查并匹配制表符或空格缩进。

  • 无论编辑器设置如何,根据周围文本的缩进确定spacestabs[参见脚注 2]

  • 单击空行会自动缩进以匹配周围环境。

  • 如果按向上 或向下 箭头键将插入符号 (也称为文本光标) 导航到空行,implicit-indent将自动缩进该行并将光标放在缩进的右侧(使其感觉就像该行已经缩进一样)

    -> 在 被按下之前,插入符号在哪一列都没有关系,这个扩展无论如何都会触发。

  • 导航到空行匹配嵌套缩进。
    假设您有以下内容:

    Where |n| represents a line
    and c represents the caret / text cursor
    and only line |2| is empty.
    
    |1|    indented line
    |2|                         (empty line)
    |3|  c    indented line
    
         ^ assume caret is on line |3|
           (caret can be at any column)
    

    按向上 箭头键会产生以下结果:

    |1|   indented line
    |2|      c 
    |3|      indented line
    
             ^ Line |2| (previously empty)
               is automatically indented to 
               match nested indentation 
               of line |3| 
    
               and the caret is automatically moved
               to the end of the inserted whitespace
    
               (as if the line were already indented).
    

VS 代码

截至 2021 年 5 月,以下 GitHub 问题仍未解决:

https://github.com/microsoft/vscode/issues/49661
https://github.com/microsoft/vscode/issues/54210
https://github.com/OmniSharp/omnisharp-vscode/issues/1980
https://github.com/OmniSharp/omnisharp-vscode/issues/1680

使用implicit-indent 是迄今为止我发现的唯一解决方法。

当自动缩进添加到 VS Code 的本机设置时,我会修改这个答案。




[脚注 1]

作为此扩展的替代方案,您可以使用 Tab 或 VS Code 内置的以下缩进/取消缩进功能来手动缩进空行。有点超出范围,但这是一个很好的热键。

默认的内置热键是:

  • 热键CTRL + ]
    命令editor.action.indentLines
    它的作用
    缩进当前行(如果没有选择)
    或缩进所有选定或部分选定的行。
  • 热键CTRL + [
    命令editor.action.outdentLines
    它的作用
    “Outdent”(又名“unndent”又名 dedent)
    当前行(如果没有选择)
    或突出所有选定或部分选定的行。

[脚注 2]

注意:无论您是否使用此扩展,您都可以使用以下 VS Code 命令快速替换当前文档的缩进(到前导制表符或前导空格):

  • editor.action.indentationToTabs
  • editor.action.indentationToSpaces

【讨论】:

  • 隐式缩进扩展很好,当您单击行时,它会将光标放在正确的位置,但它也会在该行中产生空格(从开始到光标),并且在单击另一个后不会删除它们线。因此,如果您没有在此行输入任何内容,则必须手动删除这些空格。
【解决方案3】:

转到文件 > 首选项 > 设置。在右侧,添加以下行:

,"editor.trimAutoWhitespace": false

它非常适合我。

【讨论】:

  • 我不知道右侧的“是什么意思。也许自 2018 年以来界面发生了变化?无论如何,我在搜索栏中输入了“editor.trimAutoWhitespace”并能够通过无线电将其关闭按钮。
【解决方案4】:

我有同样的问题,但删除后:

"editor.autoIndent": "none"

我很高兴。

【讨论】:

    【解决方案5】:

    有点老问题,但我发现设置的组合:

    "editor.trimAutoWhitespace": false,
    "editor.renderWhitespace": "all"
    

    ...为我工作。

    注意: (19/03/2021)

    看来this issue, registered on GitHub,仍然是一个未决案件。

    【讨论】:

    • 这有效,除非我格式化文档。格式化仍然认为我想摆脱空行中的空格。
    • @KyleDelaney - 现在我想起来了,格式是特定于语言的,它可能取决于您正在使用的语法处理器(注意斜体! ) ;o).
    • 如何修改语法处理器?
    • @KyleDelaney - 是语言或者你使用的任何东西。您可以将各种语法荧光笔和格式化程序 NPM 到 VS Code 中。 (类似于 Visual Studio 本身中的 Ctrl + K、Ctrl + D 键。)如果您感觉精力充沛,也可以自己编写!
    • @KyleDelaney - 只需搜索您正在使用的语言。您通常可以使用一些好的扩展。一些扩展会以不同的方式重新格式化代码,并且可能提供一种定制您正在做的事情的方式。
    【解决方案6】:

    答案已编辑,适用于 VSC 1.56.2 及更高版本。

    命令editor.action.insertLineAfter 创建一个新行并将光标移到那里保留缩进。 要将该命令绑定到 Enter 键,请转到您的键盘快捷键(按 ctrl + k ctrl + s),然后按最右上角带有枢轴箭头图标的页面。

    在 keybindings.json 中添加以下内容,如下所示:

    // Place your key bindings in this file to override the defaults
    [
        {
            "key": "enter",
            "command": "editor.action.insertLineAfter",
            "when": "editorTextFocus && !editorReadonly"
        },
    ]
    

    它在我没有重新打开 VSC 的情况下工作

    【讨论】:

      【解决方案7】:

      这可能是 eslint(和/或美化)这样做。看看

      "no-trailing-spaces": ["error", { "skipBlankLines": false }],
      

      我的 eslintrc.json 文件中有这个,所以我在空白行上出现错误,上面有空格或制表符。将“skipBlankLines”设置为 true 可能对您有用。

      【讨论】:

        猜你喜欢
        • 2015-10-05
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 2020-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-18
        相关资源
        最近更新 更多