Sublime Text 的宏文件不支持语法上下文过滤,context 必须在快捷键绑定中定义:{ "keys": ["ctrl+alt+p"], "command": "run_macro_file", "args": {"file": "Packages/User/add_docstring.sublime-macro"}, "context": [{"key": "selector", "operand": "source.python"}]}。

Sublime Text 的宏命令本身不支持语法上下文过滤
宏文件(.sublime-macro)是纯命令序列,执行时完全无视当前文件的语法类型。你不能在宏定义里写 "context": [{"key": "selector", "operand": "source.python"}] —— 它压根不认这个字段。run_macro_file 命令没有 context 支持,绑定后无论你在 Python、Markdown 还是 JSON 文件里按快捷键,它都照常运行。
想让宏“只在 Python 文件生效”,得靠快捷键的 context 规则
真正的控制点在 Preferences → Key Bindings 的用户键位配置里。必须显式加上 context 判断,否则宏会无差别触发:
- 打开命令面板(
Ctrl+Shift+P),输入View: Show Scope Name,确认当前 Python 文件右下角显示的是source.python - 在用户快捷键中添加带 context 的条目,例如:
{
"keys": ["ctrl+alt+p"],
"command": "run_macro_file",
"args": {"file": "Packages/User/add_docstring.sublime-macro"},
"context": [
{"key": "selector", "operand": "source.python"}
]
}
注意:operand 必须严格匹配 scope 名(大小写、斜杠、后缀都不能错),常见错误包括写成 python、source.Python 或漏掉 source. 前缀。
为什么 macro 文件里加 selector 没用?
因为 Sublime 的宏系统根本不解析 context 字段。它只认 command 和 args。下面这种写法是无效的,不会报错但也不会生效:
[
{"command": "insert", "args": {"characters": """"\n""""}, "context": [{"key": "selector", "operand": "source.python"}]}
]
所有 context 相关逻辑必须由外层快捷键绑定承担。如果你发现宏在不该出现的地方触发了,第一反应不是改 macro 文件,而是检查快捷键的 context 是否缺失或写错 scope。
更稳妥的替代方案:用插件代替宏
当逻辑开始依赖语法、选区、光标位置甚至文件路径时,宏就到头了。比如“只在函数体内部插入日志”或“根据当前变量类型生成不同注释”,这些需要运行时判断,只能靠自定义插件:
- 通过
Tools → Developer → New Plugin…创建python_logger.py - 在
run方法里用view.scope_name(view.sel()[0].begin())检查是否在source.python内 - 再用
view.match_selector(..., "meta.function")确认是否处于函数作用域 - 最后调用
view.insert()插入内容
宏适合线性、确定性操作;一旦涉及“如果…就…”或“当前是不是…”,就得切到插件——这不是升级,是换工具。


















