SublimeText3 Plugin - прослушивание событий закрытия приложения или окна - PullRequest
1 голос
/ 01 октября 2019

При разработке плагинов для SublimeText у нас есть возможность прослушивать события, расширяя классы EventListener или ViewEventListener .

Возможно ли работать с APIвыполнить действие непосредственно перед закрытием приложения или перед закрытием окна?

Я попытался просмотреть все запущенные команды окна, используя on_window_command(window, command_name, args), но, кажется, нет никаких перехватываемых команд окна, когда приложениезакрыто.

Я также пытался прослушивать on_pre_close(view). Это срабатывает, когда приложение закрывается один раз для каждой вкладки, но я не смог определить из этого метода, закрыто ли только одно представление или также все окно.

Я что-то упускаю из виду или невозможно прослушатьдо закрытия приложения или окна приложения?

1 Ответ

2 голосов
/ 01 октября 2019

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

События on_close и on_pre_close являются view событиями;то есть они срабатывают, когда вкладка закрывается (или собирается закрыться). Вкладки могут быть закрыты по разным причинам, поэтому нецелесообразно использовать это событие исключительно для определения момента закрытия окна.

В частности, когда включена настройка hot_exit (чтопо умолчанию), выход из Sublime или закрытие окна, связанного с файлом sublime-project или sublime-workspace, приведет к сохранению состояния всех окон (или окна проекта / рабочего пространства, в зависимости от ваших действий) в файле сеанса или рабочего пространствабез закрытия каких-либо просмотров. Таким образом, в этом смысле вы могли бы получить эти события только тогда, когда кто-то фактически закрывал файл.

Один из методов определения того, что Sublime собирается закрыться (или что окно должно закрыться), использует on_window_commandкак вы отметили в своем вопросе, но это ненадежно.

Команда exit запускается, когда вы указываете Sublime прекратить, поэтому вы можете перехватить это с помощью on_window_command, чтобы знать, когда это происходит, но тольков некоторых случаях.

Например, следующий плагин прослушивает команду exit и переписывает ее, чтобы блокировать завершение Sublime:

import sublime
import sublime_plugin


class TestListener(sublime_plugin.EventListener):
    def on_window_command(self, window, command, args):
        if command == "exit":
            print("I think not!")
            return ("noop")

Если вы связали ключ с командой exit, этоКлавиша выйдет из Sublime и будет перехвачена плагином, но выбор File > Exit или File > Quit завершит работу Sublime без запуска плагина. Он также не запускает ничего, когда вы закрываете последнее окно в Linux или Windows (которое неявно завершает работу Sublime; в MacOS Sublime продолжает работать даже при отсутствии окон). Таким образом, в целом, это ненадежный метод.

Аналогично, вы также можете прослушивать команду close_window, чтобы определить, когда окно закрывается. Однако в этом случае команда срабатывает только при использовании привязки клавиш или пункта меню, но не при использовании кнопки в заголовке окна, чтобы закрыть окно (поскольку это фактически не вызывает команду в Sublime).

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

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

Можно наблюдать за plugin_host для завершения из-за пределов Sublime, что позволит вам узнать, когда закончился Sublime. В Linux и MacOS вы могли бы написать плагин, который разветвляет plugin_host, а затем наблюдает, когда родитель исчезает. В Windows вам потребуется порождать какой-то внешний процесс, поскольку Python в Windows, насколько я знаю, не поддерживает fork().

Технически возможно также определить, когда окно закрыто. (после факта) путем опроса списка окон из sublime.windows() на постоянной основе, чтобы увидеть, изменится ли размер списка или изменилось window.id() одного из окон (что будет означать закрытие окна и новыйодин добавляется).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...