初始化依赖于项目设置的插件的安全方法

时间:2013-09-19 13:31:15

标签: python sublimetext2 sublimetext

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

在加载插件时简单地运行该命令失败,因为sublime.active_window()仍然未初始化 - 我当前的解决方法是使用set_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_activated,但这似乎比我现在正在做的更难看。有没有更好的方法来做到这一点,还是应该咬紧牙关并坚持我目前的做法?

2 个答案:

答案 0 :(得分:1)

不要在超时回调中直接调用sublime.active_window(),而是在active_window()仍为None时调用自己调用的函数:

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)

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

答案 1 :(得分:0)

尝试定义名为plugin_loaded的模块级方法。它可能 只能在Sublime 3中工作。我不知道你正在使用哪一个。

def plugin_loaded():    通

http://www.sublimetext.com/docs/3/api_reference.html