移行情報の公式 URL はこちら。
http://www.sublimetext.com/docs/3/porting_guide.html
さりげなく API リファレンスにも移行情報が載っています。
http://www.sublimetext.com/docs/3/api_reference.html
Python のバージョンアップ
Python 2.6 から Python 3.3 になります。
プラグインの稼働するプロセス
Sublime Text 本体とは違うプロセス (plugin_host) になります。プラグインが落ちても連動して本体が落ちるようなことはなくなります。
イベントの排他
Sublime Text 2 では set_timeout() だけがスレッドセーフでしたが、Sublime Text 3 では全てのメソッドがスレッドセーフになります。これに伴い、イベント系にスレッドセーフでないメソッドが追加されました。従来の名前に _async がつきます。
begin_edit() と end_edit()
TextCommand として動作させる以外のシチュエーションで、begin_edit() と end_edit() が呼び出せなくなりました。
ZIP パッケージ
Sublime Text 3 では .sublime-package のままプラグインを動作させます。Sublime Text 2 では、実行前に展開していました。
モジュールのインポート
他のプラグインのインポートのやり方がシンプルになりました。例えば Packages/Default/Common.py をインポートする場合は、 import Default.comment とすればいいです。
起動時の API 使用制限
plugin_host は非同期で実行するので、若干の例外を除いて Sublime Text API はインポート時に使用できません。つまり、直書きで (関数の中でない場所に) sublime モジュールの関数を呼んではいけません。起動中は、API は休眠状態で、全てのリクエストはエラーを出すことなく無視されます。
起動時に使える API
- sublime.version()
- sublime.platform()
- sublime.architecture()
- sublime.channel()
プラグインでの対応方法
plugin_loaded() の中に入れた処理は、API が使えるようになった後で呼ばれます。plugin_unloaded() の中に入れた処理は、プラグインのロードが解除される直前に呼ばれます。
とは言うものの、Sublime Text 2 でこれらのメソッドは呼び出されません。私はこのような感じで対応しました。
import sublime
def init_xxx():
# ここにプラグインの初期化処理
# Sublime Text 2 向け
if sublime.version().startswith('2'):
init_xxx()
# Sublime Text 3 向け
def plugin_loaded():
init_xxx()