【问题标题】:SublimeText3 Plugin - Listen on Application or Window close eventsSublimeText3 插件 - 监听应用程序或窗口关闭事件
【发布时间】:2019-10-01 08:50:35
【问题描述】:

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

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

我尝试使用on_window_command(window, command_name, args) 查看所有触发的窗口命令,但在关闭应用程序时似乎没有涉及可拦截的窗口命令。

我还尝试在on_pre_close(view) 上收听。当应用程序为每个选项卡关闭一次时,这会被触发,但我无法通过该方法确定是仅关闭一个视图还是关闭整个窗口。

我是否遗漏了一些明显的东西,或者无法收听应用程序或应用程序窗口的关闭?

【问题讨论】:

    标签: sublimetext3 sublime-text-plugin


    【解决方案1】:

    基于您希望在窗口关闭或 Sublime 退出之前立即采取行动,您的问题的简短回答是不可能以可靠的方式执行任何一项。然而,在这些事情发生后的某个时候,有可能知道其中任何一个,尽管对于 Sublime 退出的情况,这通常不那么有趣,因为当你有能力知道时,你已经太迟了任何回应。

    on_closeon_pre_close 事件是 view 事件;也就是说,它们在关闭选项卡(或即将关闭)时触发。选项卡可能因多种原因关闭,因此仅使用该事件来检测窗口何时关闭是不可行的。

    特别是,当hot_exit 设置打开(默认情况下)时,退出 Sublime 或关闭具有关联的 sublime-projectsublime-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()窗口已更改(这表明窗口关闭并添加了新窗口)。

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

    【讨论】:

    • 感谢@OdatNurd 的广泛回答!我想这证实了我对此的怀疑。虽然关于分叉plugin_host 的提示很有趣。我可能会调查一下,尽管在这种情况下它对我没有帮助。
    • @vlz 您可能有兴趣在sublime_lib 库中查看issue 128;它是一个用于插件的库,用于抽象出通用代码。这个特殊问题涉及添加与此类似的功能,以允许插件在 Sublime 退出时进行清理。
    • 太好了,谢谢!在此之后,我找到了issue 10 from core,它最近重新开放,听起来很有希望。
    猜你喜欢
    • 2011-06-18
    • 2013-10-20
    • 2011-10-27
    • 2020-12-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多