0

我正在编写一个 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,但这似乎比我现在正在做的更丑陋)。有没有更好的方法来做到这一点,还是我应该硬着头皮坚持我目前的方法?

4

2 回答 2

1

与其直接在超时回调中调用,不如调用一个在is stillsublime.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)

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

于 2013-10-24T17:01:08.667 回答
0

尝试定义一个名为 plugin_loaded 的模块级方法。它可能只适用于 Sublime 3。我不知道你使用的是哪一个。

def plugin_loaded(): 通过

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

于 2015-03-01T23:43:32.663 回答