1.4.2 移植指南

优质
小牛编辑
141浏览
2023-12-01

概述

对于插件这一块,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 是休眠状态,将会略任何请求。