Python 根据项目设置初始化插件的安全方法

Python 根据项目设置初始化插件的安全方法,python,sublimetext2,sublimetext,Python,Sublimetext2,Sublimetext,我正在编写一个SublimiteText插件,它使用一个架子来持久存储一些数据;工具架文件的路径在当前项目的设置中定义。我有一个WindowCommand和一个keybinding,用于初始化保存工具架的类,但是如果一个合适的项目打开,我想在启动时自动执行这个命令 加载插件时简单地运行命令失败,因为sublime.active\u window()仍然未初始化-我当前的解决方法是使用set\u timeout和(希望)足够大的超时: import sublime, sublime_plugin

我正在编写一个SublimiteText插件,它使用一个架子来持久存储一些数据;工具架文件的路径在当前项目的设置中定义。我有一个WindowCommand和一个keybinding,用于初始化保存工具架的类,但是如果一个合适的项目打开,我想在启动时自动执行这个命令

加载插件时简单地运行命令失败,因为
sublime.active\u window()
仍然未初始化-我当前的解决方法是使用
set\u timeout
和(希望)足够大的超时:

import sublime, sublime_plugin

_data = None

class MkshelfCommand(sublime_plugin.WindowCommand):
    def run(self):
        global _data
        shelf_path = self.window.active_view().settings().get("shelf_path")
        if shelf_path:
            _data = MyClass(shelf_path)

sublime.set_timeout(lambda: sublime.active_window().run_command("mkshelf"), 1000)

这显然是各种各样的坏事;但是我不知道如何更可靠地执行此操作,因为我既找不到在没有视图的情况下访问当前项目设置的方法,也找不到在执行命令之前确保窗口存在的方法,因此无法消除超时(我曾想过滥用
EventListener.on\u激活的
,但这似乎比我现在所做的更难看)。有没有更好的方法来做到这一点,还是我应该咬紧牙关坚持我目前的方法?

而不是调用
sublime.active\u window()
在超时回调中,直接调用当
活动窗口()仍然
无时调用自身的函数:

def runCommandWhenInitialized():
    activeWindow = sublime.active_window()
    if activeWindow is not None:
        activeWindow.run_command("mkshelf")
    else:
        sublime.set_timeout(lambda: runCommandWhenInitialized(), 100)


sublime.set_timeout(lambda: runCommandWhenInitialized(), 100)

(我实际上没有运行这段代码,但我认为它应该可以运行。)

尝试定义一个名为plugin_-loaded的模块级方法 只适用于Sublime 3。我不知道你用的是哪一个

def plugin_loaded(): 通过


我曾希望有一种感觉不那么像黑客的东西,但它似乎没有提供更好的东西来处理这种情况(对于我的一半用例来说,这似乎是正常的,比如“关闭视图”)。我选择接受您的解决方案,因为它是对我的代码的合理安全的改进,应该足以作为一种解决方法。我同意,我希望有一个“sublime已完成启动、还原所有窗口并加载所有插件”事件。我在几个实例中都需要它。