直接改 comments.tmPreferences 不靠谱,因其为 plist 格式、藏于插件目录、升级易被覆盖且不支持条件逻辑;正确做法是通过 User.sublime-keymap 配置 context 绑定语法 scope 实现精准控制。

为什么直接改语法包里的 comments.tmPreferences 不靠谱
Sublime 的注释符号(如 #、//、)由语法包定义,但 comments.tmPreferences 是 plist 格式、藏在插件目录里、升级后常被覆盖,且不支持条件逻辑。你改完它,下次 Package Control 更新 Python 或 JavaScript 插件,配置就丢了——不是失效,是根本没加载。
正确做法:用 User.sublime-keymap + context 限定语法范围
所有自定义快捷键必须写在 User.sublime-keymap 中,靠 context 字段绑定到具体语法 scope。操作路径是:菜单 Preferences → Key Bindings,编辑右侧面板。
- scope 值不能靠猜,按
Ctrl+Shift+P输入Show Scope Name,看状态栏显示的完整值(例如source.python、source.shell、text.env) - 想让
.env文件用#注释(而非默认不支持),加一条带text.env的规则即可 - 多语法要分别写,不能用
"operand": "source.python | source.js"—— Sublime 不支持管道符 - 示例:强制
.sh和.env都走行注释(哪怕语法包没定义):
[{
"keys": ["ctrl+/"],
"command": "toggle_comment",
"args": {"block": false},
"context": [
{"key": "selector", "operator": "equal", "operand": "source.shell"}
]
}, {
"keys": ["ctrl+/"],
"command": "toggle_comment",
"args": {"block": false},
"context": [
{"key": "selector", "operator": "equal", "operand": "text.env"}
]
}]
常见失效原因:context 写对了,但 scope 没匹配上
右下角显示 Shell-Unix-Generic ≠ scope 就是 source.shell。实际 scope 可能是 source.shell.bash 或 source.shell.posix,尤其在较新版本中更细粒度。
- 新建一个
.sh文件,保存为test.sh,再按Ctrl+Shift+P → Show Scope Name看真实值 - 如果显示
source.shell.bash,那operand必须写成这个,写source.shell就不触发 - 字符串内、折叠区、已注释行里光标停着时,
toggle_comment默认不执行——这是设计行为,不是 bug - Windows 用户务必切英文输入法,否则
/键发不出去,ctrl+/自然无反应
想绕过语法限制?用自定义键绑定强制行为
某些冷门文件类型(如 .toml、.yaml)默认无注释支持,又不想装插件。这时可在 User.sublime-keymap 里加一条无 context 的规则,让它“不管当前是什么语法,都强行加 #”:
[{
"keys": ["ctrl+alt+/"],
"command": "toggle_comment",
"args": {"block": false}
}]
这条规则全局生效,不依赖语法识别,也不怕输入法干扰——但它会覆盖掉你在其他语法下可能想用的原生块注释(比如 JS 的 /* */)。真正容易被忽略的是:toggle_comment 的行为完全取决于 args.block 和当前 scope 是否定义了对应注释符;没定义时,它不会 fallback,而是静默跳过。











