Исходя из вашего желания предпринять какие-либо действия непосредственно перед закрытием окна или выходом 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()
одного из окон (что будет означать закрытие окна и новыйодин добавляется).
Это даст вам знать, что окно закрылось после его закрытия, но интервал опроса, который вы используете, будет определять, как долго вы узнаете об этом;также могут быть проблемы с производительностью для частых интервалов опроса.