6

每当我在 Sublime Text 3 中保存 Python 文件时,我都想申请black。我该怎么做?

(如果有快速禁用它的方法,则加分)

4

3 回答 3

10

上面的答案真的很好。如果您不想编写自己的包或插件并且不喜欢Formatter包,还有sublack包,我认为它支持快速启用/禁用保存时运行黑色

您可以通过包控制(Ctrl-Shift-P(Mac:Cmd-Shift-P)包控制:安装包)以通常的方式安装 sublack。之后,您可以手动格式化当前文件:

在当前文件上运行黑色:按 Ctrl-Alt-B 格式化整个文件。您也可以 Ctrl-Shift-P(Mac:Cmd-Shift-P)并选择 Sublack:格式化文件。

或者您可以:

Toggle Black on save for current view : 按 Ctrl-Shift-P (Mac: Cmd-Shift-P) 并选择 Sublack: Toggle black on save for current view。

或者,您也可以通过创建类似于以下的用户设置(首选项 -> 包设置 -> sublack -> 设置)来启用在保存时永久运行黑色:

{
    "black_on_save": true,
    "black_line_length": 80,
}
于 2019-08-30T08:55:38.520 回答
4
  1. 蟒蛇3.6
  2. 点安装黑色
  3. cmd + shift + p 然后点击Package Control: Install Package
  4. 欠缺
  5. 在终端上,which python
  6. Preferences/Package Settings/sublack/Settings 在右侧面板

    {
        "black_on_save": true,
        "black_command": WHICH_PYTHON_RESULT
    }
    
于 2019-12-27T01:12:23.787 回答
2

要执行此类操作,您需要一个能够on_post_save在 Sublime 中为 Python 文件触发事件时触发外部命令的包或插件。

Formatter包是执行此类操作的包的一个示例,它的 README 中提到它也支持 Black 。我自己不使用那个包,所以我不能以一种或另一种方式推荐它。可能还有其他提供类似功能的包,尽管这是我发现的唯一一个提到它明确支持 Black 的包。

从理论上讲,任何格式化包或在保存事件上执行命令的包都可以让您指定要执行的命令,也可能配置为也可以正常工作。

ViewEventListener为了完整起见,可以通过创建仅在 Python 文件内部触发并使用内部exec命令执行命令的插件来相当快速地创建执行此类操作的插件black

此类插件的示例如下(如果您不确定如何在 Sublime 中设置插件,此视频提供了有关如何在 Sublime 中设置插件的说明),其中元点已在保存时自行格式化:

import sublime
import sublime_plugin

import os


class FormatWithBlackOnSave(sublime_plugin.ViewEventListener):
    """
    Listen for file saves and run the black code formatter on Python files
    as they are saved, unless they have a setting indicating that the autoformat
    should be disabled.
    """

    @classmethod
    def is_applicable(self, settings):
        return "/Python/" in settings.get("syntax") and not settings.get(
            "black_disabled", False
        )

    def on_post_save(self):
        path, file = os.path.split(self.view.file_name())

        settings = sublime.load_settings("Preferences.sublime-settings")

        show_panel_on_build = (settings.get("show_panel_on_build", True),)
        override_panel = settings.get("black_override_panel", False)
        env = settings.get("black_env", {})
        args = settings.get("black_arguments", [])

        if override_panel:
            settings.set("show_panel_on_build", not show_panel_on_build)

        window = self.view.window() or sublime.active_window()
        window.run_command(
            "exec",
            {
                "shell_cmd": 'black {args} "{file}"'.format(
                    file=file, args=" ".join(args)
                ),
                "working_dir": path,
                "env": env,
            },
        )

        if override_panel:
            settings.set("show_panel_on_build", show_panel_on_build)

一旦在您的包中就位,您User还应该向文件添加一些自定义设置Preferences.sublime-settings来控制它:

    // When this is True, the plugin will not execute on save.
    "black_disabled": false,

    // Override the value of the `show_panel_on_build` setting that controls
    // whether the output panel appears when the command is executed. When
    // true the value of that setting is temporarily inverted.
    "black_override_panel": false,

    // The arguments (other than the current file) to pass to black
    "black_arguments": [],

    // Optional environment variables to use while running the tool
    // (for example to set the path); works as in a `sublime-build` file.
    "black_env": {
    }   

这需要您自己安装black命令(例如pip install black)并使用当前文件的给定参数执行它,只要该文件是 Python 文件并且black_disabled设置false为如上。

该插件使用内部exec命令,该命令使用首选项show_panel_on_build来确定是否应该出现显示命令输出的面板。该设置的默认值为true,这意味着每次保存 Python 文件时,面板都会打开并显示如下消息:

reformatted black.py
All done!
1 file reformatted.
[Finished in 0.2s]

black_override_panel设置使插件在show_panel_on_build执行命令时反转值;正常情况下不显示,反之亦然。

更改首选项中的设置将全局禁用事件侦听器在所有 Python 文件中触发。您还可以在User包中创建一个文件,其名称类似于Black.sublime-commands以下内容:

[
    { 
        "caption": "Black: Toggle Format-on-save for this view",
        "command": "toggle_setting",
        "args": {
            "setting": "black_disabled"
        }
    }
]

这将向命令选项板添加一个命令,该命令反转当前文件中设置的状态;这将允许您仅对某些文件禁用插件或仅对某些文件启用它。

于 2019-08-01T06:22:38.670 回答