保留空行的缩进

54

是否有可能让VSCode在空行上保留缩进?

无法在本地或“Beautify”扩展中找到此设置。

所需行为示例:

code screenshot

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


6
为什么你想要那个?也许editor.trimAutoWhitespacefiles.trimTrailingWhitespace这两个设置是你正在寻找的? - Lasse V. Karlsen
13
我希望您能翻译以下内容:我想要实现与 IntelliJ IDEA 的“保留空行缩进”功能相同的功能。当此选项开启时,运行“重新格式化代码”操作时,IntelliJ 会确保空行正确缩进,就像您可以在我刚刚添加的示例截图中看到的那样。 - Stas Korzovsky
3
"editor.trimAutoWhitespace" 确实是您想要的。 - Scruffy
谢谢Scruffy,但不幸的是它没有起作用。 - Stas Korzovsky
1
当我格式化文档时,Prettier似乎无法保留空行的缩进。 - Kyle Delaney
显示剩余2条评论
8个回答

45

前往 文件 > 首选项 > 设置。在右侧添加以下行:

,"editor.trimAutoWhitespace": false

它对我来说完美地起作用了。


4
我不知道“on the right side”是什么意思。也许自2018年以来界面已经改变了?无论如何,我在搜索栏中输入了“editor.trimAutoWhitespace”,然后通过单选按钮将其关闭。 - josephwb
在 Mac 上的 VS Code 1.76.2 上,editor.trimAutoWhitespace 不存在 :( - chilifan
“On the right side” 指的是 “打开设置(JSON)” 图标。 - akinuri
有没有办法只针对.diff文件将其设置为假? - Eugen Konkov

15

这是一个有点老的问题,但我发现结合以下设置:

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

...对我有用。

注意:(19/03/2021)

看起来这个在GitHub上注册的问题仍然是一个未解决的案例。


2
这个代码可以运行,除非我对文档进行格式化。格式化仍然会认为我想要去掉否则为空的行中的空白。 - Kyle Delaney
1
@KyleDelaney - 现在我想了想,格式化可能是特定于语言的,这可能取决于您使用的语法处理器(注意斜体!);o)。 - user1945782
我该如何修改语法处理器? - Kyle Delaney
1
@KyleDelaney - 好吧,这取决于你使用的编程语言或工具。你可以在VS Code中使用NPM安装各种语法高亮和格式化工具。(类似于Visual Studio本身中的Ctrl + K,Ctrl + D快捷键。)如果你感到有精力,还可以自己编写插件! - user1945782
我的意思是,我很乐意使用一个能够做到这一点的扩展程序。只是我不知道有哪些扩展程序可以做到。 - Kyle Delaney
1
@KyleDelaney - 只需搜索您正在使用的编程语言,通常会有几个好用的扩展可供使用。一些扩展可以以不同的方式重新格式化代码,并可能提供一种定制您正在进行的操作的方法。 - user1945782

6

截止日期:2022年2月1日

这是适用于我且即使在VSCODE格式化(linting)下也有效的解决方案:

VSCODE有两个本地设置会自动格式化你的代码:

  1. "editor.formatOnSave": true,
  2. "editor.formatOnType": true,

只有当“editor.defaultFormatter”不为空时,这些设置才会影响文本编辑器。

问题如下:

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

在我的情况下,在编码时,我逐块在终端中测试我的代码。对于我来说,python的问题在于for循环和条件的结尾由缩进定义。在这种情况下,由于终端按行而不是按块运行代码,因此删除缩进后,终端认为for和if命令已经完成了。

解决方法如下:

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

如何做到这一点?

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

  • 将语言格式化程序更改为首选格式。在我的情况下:
    python.formatting.provider": "black"

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

  1. 每个提供程序(在我的情况下为“黑色”)都提供忽略某种格式化规则的选项。为此提供程序设置忽略参数。 在我的情况下,我只忽略两个规则,我的设置如下:
  • "python.formatting.blackArgs": [ "--ignore=E501,W293" ],

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

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

忽略W293会使自动修剪空格适用于除W293外的所有尾随空格。


我必须说,VS Code 在添加和删除常见语言/标记的自己的代码检查器方面有着一段历史(例如 HTML 和 CSS),这使得管理一些设置变得困难。此外,目前 editor.formatOnSaveeditor.formatOnType 的默认值为 false。感谢提供有用的信息。 - user1945782

3

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

用例:

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

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

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

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

扩展解决方案

implicit-indent 扩展名由 jemc 提供:
https://marketplace.visualstudio.com/items?itemName=jemc.vscode-implicit-indent

当导航到空行(如果其周围的行已缩进)时,自动为其缩进。

功能

从实验中,这是implicit-indent 的工作方式:

  • Checks and matches either tab or space indentation automatically.

  • Determines spaces or tabs based on indentation of surrounding text, regardless of editor settings.[See Footnote 2]

  • Clicking on an empty line automatically indents to match surroundings.

  • If pressing the up or down arrow key navigates the caret (a.k.a. text cursor) to an empty line, implicit-indent will automatically indent the line and place the cursor to the right of the indentation (making it feel the same as if the line were already indented).

    -> Before or is pressed, it doesn't matter what column the caret is on, this extension will trigger regardless.
     

  • Navigating to an empty line matches nested indentation.
    Assume you have the following:

    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)
    

    Pressing the up arrow key results in the following:

    |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 Code

截至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" (又称为 "unindent" 或 dedent)
    当前行(如果没有选择)
    或取消缩进所有选定或部分选定的行。

[注2]

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

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

1
implicit-indent 扩展很好,它可以在你点击行时将光标放在正确的位置,但它也会在该行中生成空格(从开头到光标处),并且在点击另一行后不会将其删除。因此,如果您没有在此行上键入任何内容,则必须手动删除这些空格。 - Sam
1
这是一个很棒的扩展,不幸的是,每当您导航到空行时,它会触发git更改。 - Pierre-Loup Pagniez

3

我有同样的问题,但是在删除以下内容后问题得以解决:

"editor.autoIndent": "none"

我准备就绪。


在 Mac 上的 VS Code 1.76.2 上不存在 editor.autoIndent。 - chilifan

1

我在编写Flutter代码时遇到了问题。

对我来说唯一的解决方案是将默认格式化程序更改为Flutter。

更新:我还需要禁用Dart:启用SDK格式化程序。


我还需要禁用Dart:启用SDK格式化程序。 - Anthony Peña

1
那很可能是eslint(和/或beautify)在做这件事。请查看。
"no-trailing-spaces": ["error", { "skipBlankLines": false }],

我在我的eslintrc.json文件中设置了这个,所以在空白行上有空格或制表符时会出现错误。将"skipBlankLines"设置为true可能适用于您。


1

自VSC版本1.56.2起,答案已编辑。

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

enter image description here

将以下内容添加到keybindings.json文件中,使其如下所示:

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

没有重新打开VSC,它对我起作用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接