创建可运行的sublime text插件需满足:文件置于packages/user/下、以.py结尾;定义继承sublime_plugin.textcommand或windowcommand的camelcasecommand类;实现run(self, edit)方法;通过json配置绑定命令名(类名转小写下划线)至快捷键或菜单。

怎么创建一个能跑起来的 Sublime Text 插件
Sublime Text 插件本质就是 Python 3.3+ 脚本,放在 Packages/User/ 或独立文件夹里,文件名以 .py 结尾,且必须定义一个继承自 sublime_plugin.TextCommand(针对文本操作)或 sublime_plugin.WindowCommand(针对窗口操作)的类。
常见错误:新建个 my_plugin.py,只写个 print("hello") 就以为能运行——不会。Sublime 启动时只扫描符合命名和继承规则的类,并注册为命令;裸函数或未继承的类直接被忽略。
- 插件路径必须在
Packages/下(推荐Packages/User/,避免升级被覆盖) - 类名必须是
CamelCaseCommand格式,且以Command结尾,例如ToggleCommentCommand - 必须实现
run(self, edit)方法,edit是 Sublime 提供的编辑上下文,所有文本修改都必须通过它 - 重启 Sublime 或执行
Package Control: Satisfy Dependencies不会自动重载插件,改完代码后按Ctrl+Shift+P→ 输入Developer: Reload Plugin手动重载
为什么 view.insert() 报 RuntimeError: Invalid edit object
这是新手最常卡住的地方:edit 对象是一次性的,不能跨调用、不能缓存、不能在回调里用(比如 set_timeout 中),更不能在 run() 返回后再用。
典型错误场景:想“先记录位置,稍后插入”,结果把 edit 存成实例变量,或者在 sublime.set_timeout(lambda: view.insert(edit, 0, "x"), 10) 里传进去——立刻崩。
-
edit只在当前run()调用生命周期内有效 - 如果需要延迟操作,得把要插入的内容和位置先记下来,等延时结束后重新获取
edit(即再调一次view.run_command()) - 批量修改务必在同一个
edit对象上调用多次insert/replace/erase,不要每个操作都 new 一个
如何让插件响应快捷键或右键菜单
Sublime 不靠代码里写监听,而是靠外部 JSON 配置绑定命令到触发器。插件本身只负责提供一个可调用的命令名(由类名自动推导),其余全靠配置文件驱动。
命令名规则:类名 ConvertToUppercaseCommand → 命令名是 convert_to_uppercase(小写下划线)。这个名称必须和 sublime-commands、Default (Windows).sublime-keymap 等文件里写的完全一致。
- 快捷键:在
Packages/User/Default (Windows).sublime-keymap(macOS/Linux 换对应文件名)里加一条{"keys": ["ctrl+alt+u"], "command": "convert_to_uppercase"} - 右键菜单:在
Packages/User/Context.sublime-menu里加{"caption": "UPPERCASE", "command": "convert_to_uppercase"} - 菜单栏:改
Main.sublime-menu,结构更深但逻辑一样,注意id和children嵌套层级 - 所有 JSON 文件必须是 UTF-8 编码、无 BOM,语法严格,少个逗号就整个配置失效
调试插件时 print 不显示怎么办
Sublime 的 Python 环境不连终端,print() 输出默认被吞掉。不是代码没跑,是输出看不见。
真正有效的调试方式只有两种:用 sublime.status_message() 弹临时提示,或往 Sublime 控制台(Ctrl+`)里打日志。后者更可靠,但要注意别高频刷屏卡死 UI。
- 用
sublime.status_message("pos: {}".format(view.sel()[0].begin()))快速确认执行流 - 用
print()+sublime.log_commands(True)(在控制台输入)可看到命令调用链,但不显示你的 print - 真要查变量值,老实用
sublime.error_message(str(my_var)),虽然丑但一定弹出来 - 别依赖断点调试:Sublime 的 Python 解释器不支持标准 pdb,第三方方案(如
sublime-debugger)维护差、兼容性脆,不如把逻辑拆细 + status_message 分段验证
插件开发里最耗时间的往往不是写功能,而是搞清“它到底有没有执行”“edit 到底在哪失效了”“命令名拼错没”。这些点不踩一遍坑,光看文档根本绕不出来。











