Как я могу применить форматирование черного кода при сохранении?

Я бы хотел применить black всякий раз, когда я сохраняю файл Python в Sublime Text 3. Как я могу это сделать?

(Бонусные баллы, если есть быстрый способ отключить его)

2 ответа

Ответ выше действительно хорош. Если вы не хотите писать свой собственный пакет или плагин и вам не нравится пакет Formatter, есть также пакет sublack, который, я думаю, поддерживает быстрое включение / отключение запуска черного цвета при сохранении.

Вы устанавливаете sublack обычным способом через управление пакетами (Ctrl-Shift-P (Mac: Cmd-Shift-P) Управление пакетами: Установить пакет). После этого вы можете отформатировать текущий файл вручную:

Запустить черный на текущем файле: нажмите Ctrl-Alt-B, чтобы отформатировать весь файл. Вы также можете нажать Ctrl-Shift-P (Mac: Cmd-Shift-P) и выбрать Sublack: Формат файла.

или вы можете:

Переключить черный при сохранении для текущего вида: нажмите Ctrl-Shift-P (Mac: Cmd-Shift-P) и выберите Sublack: переключить черный при сохранении для текущего вида.

В качестве альтернативы, вы также можете включить постоянный запуск черного при сохранении, создав пользовательские настройки ("Настройки" -> "Настройки пакета" -> "Слабая черта" -> "Настройки"), подобные следующим:

{
    "black_on_save": true,
    "black_line_length": 80,
}
  1. Python 3.6
  2. pip install черный
  3. cmd + shift + p, затем нажмите Package Control: Install Package
  4. субчерный
  5. На терминале which python
  6. Предпочтения / Настройки пакета /sublack/ Настройки на правой панели

    {
        "black_on_save": true,
        "black_command": WHICH_PYTHON_RESULT
    }
    

Чтобы сделать что-то подобное, вам понадобится пакет или плагин, способный вызывать внешнюю команду всякий раз, когда on_post_save событие запускается в Sublime для файла Python.

Пакет Formatter является примером пакета, который делает подобные вещи, и README упоминает, что он также поддерживает Black. Я сам не пользуюсь этим пакетом, поэтому не могу рекомендовать его так или иначе. Могут быть и другие пакеты, которые предоставляют аналогичную функциональность, хотя это единственный, который я заметил, который упоминает, что он явно поддерживает черных.

Теоретически любой пакет форматирования или пакет для выполнения команд при сохранении событий, позволяющий указать команду для выполнения, вероятно, также может быть настроен на работу.

Для полноты, плагин, чтобы сделать что-то подобное, может быть создан довольно быстро, создав ViewEventListener который запускается только внутри файлов Python и использует внутренний exec Команда для выполнения black команда.

Примером такого плагина может быть следующий ( это видео содержит инструкции о том, как настроить плагин в 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"
        }
    }
]

Это добавит команду в палитру команд, которая инвертирует состояние настройки в текущем файле; это позволит вам отключить плагин только для определенных файлов или включить его только для определенных файлов.

Другие вопросы по тегам