Как я могу применить форматирование черного кода при сохранении?
Я бы хотел применить 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,
}
- Python 3.6
- pip install черный
- cmd + shift + p, затем нажмите
Package Control: Install Package
- субчерный
- На терминале
which python
Предпочтения / Настройки пакета /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"
}
}
]
Это добавит команду в палитру команд, которая инвертирует состояние настройки в текущем файле; это позволит вам отключить плагин только для определенных файлов или включить его только для определенных файлов.