1.4.2 移植指南
概述
对于插件这一块,Sublime Text 3 包含一些和 Sublime Text 2 非常重要区别,大多数插件都至少需要一点移植才能正常工作。这些变化是:
- Python 3.3
- 进程外的插件
- 异步事件
- 受限的
begin_edit()
和end_edit()
- Zipped Packages
- 导入模块
Python 3.3
Sublime Text 3 使用了 Python 3.3,而 Sublime Text 2 使用了 Python 2.6。而且,在 OS X 上,Python 的构建系统不再使用了,而是捆绑了 Sublime 自己的版本。Windows 和 Linux 上和以前一样捆绑了自己的版本。
进程外的插件
插件现在是一个独立的进程,plugin_host
。从插件作者的观点来看,不应该有可观察到的差异,不同的是在插件宿主崩溃将不再降低主应用程序。
异步事件
Sublime Text 2 中只有set_timeout
线程是线程安全的。Sublime Text 3 中,每一个 API 方法都是线程安全的。此外,现在有异步事件处理程序使得编写无阻塞代码更加容易。
- on_modified_async
- on_selection_modified_async
- on_pre_save_async
- on_post_save_async
- on_activated_async
- on_deactivated_async
- on_new_async
- on_load_async
- on_clone_async
- set_timeout_async
当编写线程代码时,请记住函数运行时缓冲区会在底层进行改变。
受限的begin_edit()
和end_edit()
除了一些特殊情况,begin_edit()
和end_edit()
不再可以直接被访问。得到一个有效Edit
对象实例的唯一方法是把你的代码放到一个 TextCommand 的子类中。通常来说,大多数代码可以通过把代码放到 TextCommand 中 的begin_edit()
和end_edit()
中进行重构,然后调用这个 TextCommand 中的run_command
函数。
Zipped Packages
Sublime Text 3 中的包可以直接通过.sublime-package
(如,重命名后的.zip 文件)文件运行,Sublime Text 2 则是解压缩之前运行。
导入模块
Sublime Text 3 中导入其它插件更简单且更健全,并且可以用一个常规的 import 语句完成。如,import Default.comment
将导入Packages/Default/Comment.py
。
Restricted API Usage at Startup
由于plugin_host
是异步加载,在导入的时候是不能使用 Sublime Text API 的。这意味着你的模块中的所有顶层语句将不能调用sublime
模块中的任何函数。在启动期间,API 是休眠状态,将会略任何请求。