我正在编写一个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
, 但这似乎比我现在正在做的事情更丑陋)。有没有更好的方法来做到这一点,或者我应该咬紧牙关并坚持我目前的方法?
与其在超时回调中直接调用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)
(我实际上没有运行这段代码,但我认为它应该可以工作。
尝试定义一个名为 plugin_loaded 的模块级方法。它可能会仅在崇高 3 中工作。我不知道你用的是哪一个。
def plugin_loaded(): 通过
http://www.sublimetext.com/docs/3/api_reference.html