防止将缩进从制表符更改为空格

Prevent changing indentation from tabs to spaces

我安装了 VSCode 和 python 3.6.8 我使用制表符来缩进。但是每当我保存文件时,所有制表符都被转换为空格。 这可能是因为我使用的格式化程序,即 Black。我如何防止格式化程序执行此操作(除了 使用空格交换缩进 之外的所有格式)?

谢谢

假设您没有将 VS Code 设置为将 space 插入选项卡,那么 Black 很可能会用 space 替换它们,因为这是 Python 中的规范社区和 Black 对如何格式化 Python 代码持非常固执己见的观点。您可以尝试使用其他格式化程序,例如 yapf 或 autopep8,看看它们是否会留下物理标签。

但请注意,绝大多数 Python 社区都使用 space,因此您可能面临一场艰苦的战斗。

不仅'black'而且'autopep8'和'yapf'都会将制表符转换为space。看起来 'black'、'autopep8' 和 'yapf' 都没有提供参数来更改缩进的格式行为。我同意 Brett Cannon 的观点,你最好适应 space 缩进。

如果你真的想尝试一下,你可以在 site-packages 文件夹中找到 black.py 并在 black.py 中的 1540 行更改 ' '(四个 spaces) 到' '(一个tab,复制一个tab,你可以选择tab包含的任意spaces)。然后你可以得到你想要的。但是,我真的不推荐它。

autopep8black都非常严格。 他们不仅 推荐 space 制表符,而且 强制 使用 space 缩进。

如果你真的想使用制表符,你应该使用 yapf,样式为 use_tabs=True

直到 maintainers/contributors 添加了一个能够使用制表符缩进 Python 的设置,我通过使用 multi-command 扩展找到了解决这个问题的方法。

解决问题的步骤:

  1. 安装扩展。

  2. 找到你的 settings.jsonkeybindings.json。来自 here:

    根据您的平台,用户设置文件位于此处:

     - Windows %APPDATA%\Code\User\settings.json
     - macOS $HOME/Library/Application Support/Code/User/settings.json
     - Linux $HOME/.config/Code/User/settings.json
    
  3. 将此添加到 settings.json:

"multiCommand.commands": [
    {
        "command": "multiCommand.properlyFormatAnyDocument",
        "sequence": [
            "editor.action.formatDocument",
            "editor.action.indentationToTabs"
        ]
    }
]
  1. 将此添加到 keybindings.json:
{
    "key": "shift+alt+f",
    "command": "extension.multiCommand.execute",
    "args": {
        "command": "multiCommand.properlyFormatAnyDocument"
    },
    "when": "editorTextFocus"
}
  1. 保存所有文件即可。

从技术上讲,yapfuse_tabs 设置,但我一直无法让它工作。

所以其中一个评论是 yapf 不太容易上手。在 Debian 下,安装

apt-get install yapf3

现在转到您的源目录并运行

yapf3 --style "google" --style-help > .style.yapf

编辑 .style.yapf 以便将

use_tabs=True

而不是 False。

现在运行

yapf3 -i dirty.py

而且它确实使用制表符进行缩进。空格仍然用于视觉格式化,制表符仅用于真正的缩进,我正在发送一个视觉示例,说明我的代码是如何格式化的。