基于您希望在窗口关闭或 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命令绑定一个key,这个key会退出Sublime并被插件拦截,但是选择File > Exit或者File > Quit会在不触发插件的情况下终止Sublime。当您关闭 Linux 或 Windows 上的最后一个窗口时,它也不会触发任何事情(隐式退出 Sublime;在 MacOS 上,即使没有窗口存在,Sublime 也会继续运行)。所以总的来说,这不是一个可靠的方法。
同样,您也可以监听close_window 命令来检测窗口何时关闭。但是在这种情况下,该命令仅在您使用键绑定或菜单项时触发,而不是在您使用窗口标题中的按钮关闭窗口时触发(因为这实际上不会触发 Sublime 中的命令)。
因此,在这两种情况下,技术上都可以在任何一个事件发生之前捕捉到它,但只能在某些特定情况下进行,这对于您需要依赖的任何事情都不太理想。
也就是说,有可能在这些项目发生后检测到它们中的任何一个,尽管它的潜在效用可能不是您想要的,特别是因为您有兴趣在这种情况下事先了解。
可以观察plugin_host 从 Sublime 外部终止,这会在 Sublime 终止时通知您。在 Linux 和 MacOS 上,您可以编写一个分叉 plugin_host 的插件,然后查看父项何时消失。在 Windows 上,您需要生成某种外部进程,因为据我所知,Windows 上的 Python 不支持 fork()。
技术上还可以通过持续轮询sublime.windows() 中的窗口列表来检测窗口何时关闭(事后),以查看列表的大小是否发生变化或其中之一的window.id()窗口已更改(这表明窗口关闭并添加了新窗口)。
这会让您知道窗口在关闭后消失了,但您使用的轮询间隔将决定您发现它之后的时间;频繁的轮询间隔也可能存在性能问题。