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

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)

(実際にこのコードを実行したわけではありませんが、動作するはずです。)

于 2013-10-24T17:01:08.667 に答える