Автозапуск команды на сохранение в Sublime Text - PullRequest
1 голос
/ 15 февраля 2020

Можно ли запускать eslint автоматически, когда я сохраняю файл .js или .jsx в Sublime Text?

Я сейчас использую возвышенный пакет ESLint , но мне приходится каждый раз вручную запускать его, используя Cmd + Option + e.

Спасибо!

1 Ответ

1 голос
/ 16 февраля 2020

Да, это можно сделать с помощью простого управляемого событиями плагина, подобного тому, который я написал ниже.

Плагин был протестирован, но не командой 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.
...