Да, это можно сделать с помощью простого управляемого событиями плагина, подобного тому, который я написал ниже.
Плагин был протестирован, но не командой eslint
, так как я не хотел его устанавливать пакет. Очевидно, что любая команда может быть запущена вместо eslint
в строке run_command("eslint")
плагина. Если желаемая команда принимает аргументы, они могут быть указаны следующим образом: run_command("command", {"arg_1": val, "arg_2": val})
.
Метод on_post_save_async(self, view)
(в моем плагине ниже) будет вызван после того, как view
, то есть активный буфер, имеет были сохранены - обратите внимание, что это включает в себя автосохранение. on_post_save_async()
работает в отдельном потоке и не блокирует приложение. Вы можете изменить плагин для использования аналогичного метода в зависимости от того, хотите ли вы вызывать eslint
до или после сохранения файла и должен ли метод блокировать приложение или запускаться в своем собственном неблокирующем потоке. Это 4 варианта:
on_pre_save(self, view)
: вызывается непосредственно перед сохранением представления. Он блокирует приложение до тех пор, пока метод не вернется. on_pre_save_async(self, view)
: Вызывается непосредственно перед сохранением представления. Запускается в отдельном потоке и не блокирует приложение. on_post_save(self, view)
: Вызывается после сохранения представления. Он блокирует приложение до тех пор, пока метод не вернется. on_post_save_async(self, view)
: Вызывается после сохранения представления. Запускается в отдельном потоке и не блокирует приложение. [ В настоящее время используется в плагине ниже. ] - Sublime Text
EventListener
документация находится здесь - есть и методы загрузки.
Сохраните плагин ниже где-нибудь в иерархии пакетов Sublime Text с расширением .py
. например, ~/.config/sublime-text-3/Packages/User/AutoRunESLintOnSave.py
, и он должен работать сразу.
import sublime, sublime_plugin
class AutoRunESLintOnSave(sublime_plugin.EventListener):
""" A class to listen for events triggered by ST. """
def on_post_save_async(self, view):
"""
This is called after a view has been saved. It runs in a separate thread
and does not block the application.
"""
file_path = view.file_name()
if not file_path:
return
NOT_FOUND = -1
pos_dot = file_path.rfind(".")
if pos_dot == NOT_FOUND:
return
file_extension = file_path[pos_dot:]
if file_extension.lower() in [".js", ".jsx"]:
view.window().run_command("eslint")
# Slight variations are needed for an ApplicationCommand,
# a WindowCommand, or a TextCommand.
#
# view.run_command("text_command")
# view.window().run_command("window_command")
# sublime.run_command("application_command")
#
# Need args? Use this:
#
# view.run_command("command", {"arg_1": val, "arg_2": val})
Вместо использования расширений файлов для запуска команды eslint
вы можете использовать синтаксис буфера, код еще более лаконичен.
def on_post_save_async(self, view):
""" Syntax version. """
current_syntax = view.settings().get("syntax")
if ("JavaScript.sublime-syntax" in current_syntax
or "JSX.sublime-syntax" in current_syntax):
view.window().run_command("eslint")
# You could, of course, use an exact match:
#
# current_syntax = view.settings().get("syntax")
# if current_syntax == "Packages/JavaScript/JavaScript.sublime-syntax":
# view.window().run_command("eslint")
#
# Run `view.settings().get("syntax")` in the console for the active syntax path.