Sublimetext3 SublimiteText3插件-监听应用程序或窗口关闭事件

Sublimetext3 SublimiteText3插件-监听应用程序或窗口关闭事件,sublimetext3,sublime-text-plugin,Sublimetext3,Sublime Text Plugin,在为SublimateText开发插件时,我们可以通过扩展or类来监听事件 使用API,是否可以在应用程序关闭之前或窗口关闭之前执行操作 我试着使用on\u window\u command(window,command\u name,args)查看所有激发的窗口命令,但在应用程序关闭时似乎没有可拦截的窗口命令 我还试着在关闭(视图)时收听。当应用程序为每个选项卡关闭一次时,就会触发该命令,但我无法通过该方法确定是只关闭了一个视图还是关闭了整个窗口 我是否遗漏了一些明显的信息,或者无法听到应用程

在为SublimateText开发插件时,我们可以通过扩展or类来监听事件

使用API,是否可以在应用程序关闭之前或窗口关闭之前执行操作

我试着使用
on\u window\u command(window,command\u name,args)
查看所有激发的窗口命令,但在应用程序关闭时似乎没有可拦截的窗口命令

我还试着在关闭(视图)时收听
。当应用程序为每个选项卡关闭一次时,就会触发该命令,但我无法通过该方法确定是只关闭了一个视图还是关闭了整个窗口


我是否遗漏了一些明显的信息,或者无法听到应用程序或应用程序窗口关闭的声音?

基于您希望在窗口关闭或升华退出之前立即采取行动的愿望,您的问题的简短回答是,这两种方法都不可能可靠地完成。然而,在这些事情发生后的某个时候,你可能知道其中的任何一件事,尽管对于崇高的戒烟来说,这通常不那么有趣,因为当你知道的时候,你已经太晚了,无法做出任何回应

关闭时的
和关闭前的
事件是
视图
事件;也就是说,当选项卡正在关闭(或即将关闭)时,它们会触发。选项卡可以由于各种原因关闭,因此仅使用该事件来检测窗口何时关闭是不可行的

特别是,当打开“热退出”设置时(默认情况下),退出“升华”或关闭具有关联的“升华项目”或“升华工作区”文件的窗口将导致所有窗口的状态(或项目/工作区窗口,具体取决于您的操作)要在不关闭任何视图的情况下持久化到会话或工作区文件中。所以从这个意义上说,只有当有人正在关闭一个文件时,才会发生这些事件

确定升华即将关闭(或窗口即将关闭)的一种方法是使用您在问题中提到的
on_window_命令
,但这并不可靠

当您告诉Sublime终止时,
exit
命令会被触发,因此您可以使用
on\u window\u命令
截取该命令,以了解它何时发生,但仅在某些情况下

例如,以下插件侦听
exit
命令并重写它以阻止升华终止:

导入升华
导入升华插件
类TestListener(升华插件.EventListener):
def on_window_命令(self、window、command、args):
如果命令==“退出”:
打印(“我不这么认为!”)
返回(“noop”)
如果将一个键绑定到
exit
命令,该键将退出升华并被插件截获,但选择
File>exit
File>quit
将终止升华而不触发插件。在Linux或Windows上关闭最后一个窗口时,它也不会触发任何事件(这意味着退出Sublime;在MacOS上,即使没有Windows,Sublime也会继续运行)。所以总的来说,这不是一个可靠的方法

同样,您也可以监听
close\u window
命令,以检测窗口何时关闭。但是,在这种情况下,命令仅在使用键绑定或菜单项时触发,而不是在使用窗口标题中的按钮关闭窗口时触发(因为这实际上不会触发升华中的命令)

因此,在这两种情况下,技术上都可以在事件发生之前捕捉到任何事件,但只能在某些特定情况下捕捉到,这对于任何需要依赖的情况来说都不太理想

这就是说,在这些项目发生后,可以检测到它们中的任何一个,尽管其潜在效用可能不是您想要的,特别是在这种情况下,您有兴趣事先知道

可以从升华外部观察
插件\u主机
是否终止,这会让您知道升华何时终止。在Linux和MacOS上,您可以编写一个插件,将
plugin\u主机
分叉,然后观察家长何时离开。就我所知,Windows上的Python不支持
fork()

在技术上,还可以通过持续轮询
sublime.windows()
中的窗口列表来检测窗口何时关闭(事实发生后),以查看列表的大小是否更改,或者其中一个窗口的
window.id()
是否已更改(这将指示窗口关闭并添加新窗口)


这会让您知道窗口在关闭后消失,但您使用的轮询间隔将决定您发现它后的时间;频繁的轮询间隔也可能会带来性能问题。

感谢@OdatNurd提供了非常广泛的答案!我想这证实了我的怀疑。尽管关于分叉
插件的技巧很有趣。我可能会研究一下,不过在这种情况下对我没有帮助。@vlz你可能有兴趣到图书馆借书;它是一个库,用于插件中抽象出常见代码。这个特别的问题涉及添加类似的功能,以允许插件在升华退出时进行清理。太好了,谢谢!在这之后,我发现,这是最近重新开放,听起来很有希望。