Reference:: Sublime Text API Reference
概览
本文档为有意向开发Sublime Text插件的开发者提供了基础指导。从环境设置到插件的创建、编码、测试,直至最终的分发,确保开发者能够顺利入门插件开发。
插件编写准备工作
1. 环境设置
确保你安装了 Sublime Text。Sublime Text 内置了 Python 解释器,通常是 Python 3.3 或更新版本。
2. 创建插件文件
- Sublime Text 的插件文件通常放在特定的
Packages
目录中。你可以通过 Sublime Text 菜单Preferences
->Browse Packages...
找到这个目录。 - 在
Packages
目录中创建一个新的子目录,例如名为MyPlugin
。 - 在这个目录下创建一个 Python 文件,例如
easy_draft.py
。这个文件将包含你的插件代码。
3. 编写插件代码
在你的 Python 文件中,你可以使用 Sublime Text 的 API 创建插件
4. 插件加载
保存文件之后, Sublime Text 将自动加载插件.
5. 运行并测试插件
为了运行并测试插件, 可以通过 Sublime Text 的控制台执行命令。打开控制台(View
-> Show Console
)或者通过快捷键 Ctrl + ` 直接呼出控制台,然后输入:
python
view.run_command('example')
这里的 'example'
是你的命令类名 ExampleCommand
的小写形式,根据 Sublime Text 的约定,类名中的 "Command" 会被省略。
6. 分发插件
- 直接压缩打包
MyPlugin
文件夹并且分享 - Package Control :如果你希望你的插件能够通过 Sublime Text 的 Package Control 被更广泛地安装,你可以提交你的插件到 Package Control。这需要遵循一定的指南和标准。具体步骤可以在 Package Control 提交指南 中找到。
插件示例 Easy Draft
粽子作为一个后端程序员, 经常需要临时处理一些字符, 比如以下场景:
- 格式化 JSON 字符串
- 将一些数字简单的相加
- 根据一些订单号查询数据
这个时候粽子就会很自然的打开 Sublime Text 进行编辑, 不为别的, 只是 Sublime 的列编辑功能使用起来非常舒服. 但是 Sublime Text 不会默认关闭 Tab, 久而久之就会累计非常多的未保存Tab页面, 非常烦人;
因此粽子打算编写一个名为 Easy Draft
的插件, 可以每十分钟自动关闭未被编辑的 Tab 页面, 同时也可以实现一些简单的字符编辑功能.
功能 1: 格式化 JSON 字符串
在easy_draft.py
文件中编写以下代码
python
import sublime
import sublime_plugin
import json
# 自动格式化 JSON 字符串
class FormatJsonCommand(sublime_plugin.TextCommand):
def run(self, edit):
# 获取当前视图中的所有文本
all_text_region = sublime.Region(0, self.view.size())
text = self.view.substr(all_text_region)
try:
# 尝试解析 JSON
parsed_json = json.loads(text)
# 美化 JSON 字符串
formatted_json = json.dumps(parsed_json, indent=4)
# 用美化后的 JSON 替换旧的文本
self.view.replace(edit, all_text_region, formatted_json)
sublime.status_message("JSON formatted successfully!")
except Exception as e:
sublime.status_message("Error formatting JSON: " + str(e))
-
测试代码
- 保存文件后, 使用 Ctrl + ` 呼出命令行控制台 键入以下代码后回车
pythonview.run_command("format_json")
-
将插件命令绑定到
Command Palette
(命令面板)命令面板可以通过
Command Shift P
呼出, 或者在菜单(Tools -> Command Palette
)下呼出, 可以更方便的执行命令 Format JSON.
-
创建或编辑
.sublime-commands
文件-
在 Sublime Text 的
Packages
目录下相应的插件文件夹中,创建或编辑一个.sublime-commands
文件。 这个文件用于定义应该在命令面板中显示的命令列表。如果你的插件文件夹名为MyPlugin
,则可以在MyPlugin
文件夹中创建一个名为Default.sublime-commands
的文件。 -
配置命令, 在Default.sublime-commands中输入以下内容
json[ { // 这是在命令面板中显示的文本 "caption": "Format Json", // 这是命令的名称,应与 Python 类名的小写匹配(并去除 Command 后缀) "command": "format_json" } ]
-
运行命令
保存文件
Default.sublime-commands
后, 应当在命令面板中看到Format Json
命令. -
场景 2: 每隔十分钟自动关闭 Tab 页
在easy_draft.py
中继续添加代码
python
import time
import sublime
import sublime_plugin
# 运行标志
running = False
# 自动清理过期没处理的 view
class AutoCloseOldViewsListener(sublime_plugin.EventListener):
# 用于存储最后编辑时间的字典
last_edited_times = {}
def on_new(self, view):
# 新建视图时添加时间戳
self.last_edited_times[view.id()] = time.time()
def on_load(self, view):
# 新建视图时添加时间戳
self.last_edited_times[view.id()] = time.time()
def on_modified(self, view):
# 每次视图被修改时更新时间戳
self.last_edited_times[view.id()] = time.time()
def on_activated(self, view):
# 当视图被激活时,也更新时间戳
self.last_edited_times[view.id()] = time.time()
def on_post_save(self, view):
# 当视图保存后更新时间戳
self.last_edited_times[view.id()] = time.time()
def on_close(self, view):
# 当视图关闭时从字典中移除
if view.id() in self.last_edited_times:
del self.last_edited_times[view.id()]
def check_old_views(self):
current_time = time.time()
views_to_close = []
active_view = sublime.active_window().active_view() # 获取当前激活的视图
for view_id, last_edited in self.last_edited_times.items():
# 检查上次编辑时间是否超过 10 分钟 600 秒
if current_time last_edited > 600:
view = sublime.View(view_id)
# 关闭非当前代码
if view and view.is_valid() and view.id() != active_view.id(): # 排除当前激活的视图
if view.is_dirty():
view.set_scratch(True)
views_to_close.append(view)
print("View:{} is going to be closed".format(view_id))
# 关闭旧视图
for view in views_to_close:
should_close_view = sublime.ok_cancel_dialog("Do you want to close the file {}?".format(view.name()), "Yes, close it")
if view and should_close_view:
del self.last_edited_times[view.id()]
view.close()
background_task(self)
def background_task(listener):
if not running:
return
# 每隔 600 秒执行一次 check_old_views() 方法
sublime.set_timeout_async(listener.check_old_views, 600000)
def start_background_task():
global running
running = True
listener = AutoCloseOldViewsListener()
for window in sublime.windows():
for view in window.views():
listener.last_edited_times[view.id()] = time.time()
# 启动定时器
background_task(listener)
def stop_background_task():
global running
running = False
# 插件加载
def plugin_loaded():
print("Plugin loaded, starting tasks.")
start_background_task()
# 插件卸载
def plugin_unloaded():
print("Plugin unloaded, stopping tasks.")
stop_background_task()
保存文件之后, 每隔十分钟, 应当Sublime Text 中应当弹出以下对话框
点击Yes, close it
后, Tab将会自动关闭注意: 当前获得焦点的Tab页不会被要求关闭.
最后一点小总结
- Sublime Text 插件编写步骤整体来说比较便捷, 确保认真阅读并且实践官方API文档;
- 在编写插件的过程中可以通过命令行控制台输出运行信息, 方便调试;
- 如果你有更好的编写Sublime Text 插件的想法, 可以放在评论区哦