sublime插件必须继承sublime_plugin.textcommand或windowcommand,类名以command结尾,run方法中使用一次性edit对象;构建系统通过cmd调外部python解释器,file_regex需严格匹配错误格式。

Sublime 插件必须继承 sublime_plugin.TextCommand 或 sublime_plugin.WindowCommand
不满足这个继承关系的 Python 文件,哪怕放在 Packages/User/ 下、文件名以 .py 结尾,Sublime 也完全不会加载它。常见错误是写了个独立脚本,比如只定义了普通函数或类,没继承、没 run(self, edit) 方法,结果 Command Palette 里搜不到命令——不是插件没生效,是压根没被识别为插件。
必须用 TextCommand 处理当前视图中的文本(如插入、替换、选中内容),用 WindowCommand 操作窗口级行为(如新建文件、切换标签页、弹出输入框)。别混用:在 TextCommand 里调 self.window.new_file() 可以,但反过来在 WindowCommand 里访问 self.view 就会报 AttributeError。
- 类名必须以
Command结尾,比如InsertDateCommand,否则 Sublime 不注册 - 命令 ID 自动转成小写下划线格式:
InsertDateCommand→insert_date,配置快捷键或菜单时必须用这个 ID - 文件名建议与命令 ID 一致(如
insert_date.py),否则容易在重载或调试时搞混
edit 对象只能在 run() 内使用一次,不能缓存或跨回调传递
这是最常崩的点。edit 是 Sublime 发放的一次性令牌,只在 run(self, edit) 执行期间有效。一旦 run() 返回,edit 就失效。任何试图保存它、传给 sublime.set_timeout 回调、或塞进线程里再用的操作,都会触发 RuntimeError: Invalid edit object。
正确做法是:把要操作的数据(位置、文本、region)先算好,等延时结束再用新 edit 执行;或者改用命令式调用,比如 self.view.run_command('insert', {'characters': text})。
- 错例:
self._edit = edit然后在set_timeout里调self.view.insert(self._edit, ...) - 错例:
sublime.set_timeout(lambda: self.view.replace(edit, r, 'x'), 100) - 对例:延时前记录
pos = self.view.sel()[0].begin(),延时后self.view.insert(edit, pos, 'x')
构建系统(.sublime-build)靠 cmd 和 file_regex 驱动,不是“运行 Python”而是调外部解释器
Sublime 本身不解析 Python,所谓“一键运行”只是用 cmd 数组唤起系统命令行执行 python 或 python3。所以失败通常和 Sublime 无关,而是环境问题:Python 没装、没加 PATH、路径含空格、Windows 下反斜杠没转义。
file_regex 决定能否双击错误行跳转。Python 默认报错格式是 File "xxx.py", line 12,正则必须匹配这个结构,否则面板里显示报错但点不动。
-
"cmd": ["python", "-u", "$file"]:加-u强制无缓冲,避免print()卡住不输出 - Windows 用户若
python命令不可用,得写死路径:["C:\Python39\python.exe", "-u", "$file"](注意双反斜杠) -
"file_regex": "^File "(.*?)", line ([0-9]+)"必须严格匹配引号、空格、逗号,少一个字符就失效 -
"working_dir": "${file_path}"很关键,否则open('data.txt')会因工作目录不对而 FileNotFoundError
插件和构建系统都依赖 Packages/User/ 目录,但重载逻辑完全不同
插件修改后不用重启 Sublime,按 Ctrl+Shift+P → 输入 Developer: Reload Plugin 即可重载当前文件;而构建系统改完 .sublime-build 文件后,必须手动在 Tools → Build System 里重新选一遍,否则旧配置还在内存里。
两者都建议放 Packages/User/,因为这个目录不会被升级覆盖。别往 Packages/Default/ 或 Packages/Python/ 里硬塞,否则下次更新可能直接清掉。
- 插件路径示例:
Packages/User/insert_timestamp.py - 构建系统路径示例:
Packages/User/Python3.sublime-build - 菜单配置路径示例:
Packages/User/Context.sublime-menu - 所有配置里的
command字段,必须和插件类名去掉Command后缀、转小写下划线的结果完全一致
edit 失效不报具体哪行错了,file_regex 写错也不提示匹配失败——它就安静地不跳转。你得自己对照日志、变量、路径、命名规则一环环核对。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











