sublime text 的语法识别基于扩展名硬匹配和有限首行规则,非内容分析或机器学习;.env等文件因未内置扩展名而默认为plain text,需手动设置默认语法并重启生效。

Sublime Text 没有“智能匹配”能力,所谓自动识别,本质是扩展名硬匹配 + 极有限的首行规则(如 shebang),不是靠内容分析或机器学习。你看到的“自动”,全是手动配出来的。
为什么 .env、.conf、.vue 总是 Plain Text
这些后缀压根不在 Sublime 内置语法的 file_extensions 列表里,编辑器打开时只看扩展名,不读文件内容,没匹配就 fallback 到 Plain Text。这不是 bug,是设计如此。
- 点右下角
Plain Text→ 选目标语法 → 点Set as Default for .env Files,Sublime 会自动生成Packages/User/INI.sublime-settings(或对应语法名)并写入{"extensions": ["env"]} - 如果菜单里没出现
Set as Default...,说明你还没在该文件上手动切换过语法;先点右下角选一次INI或ShellScript,再点才会有 -
.conf文件默认绑定的是INI,但 Apache 配置要用Packages/Apache/Apache.sublime-syntax,别混用——否则nginx.conf会错配成 Apache 高亮
default_syntax 只影响新建空白文件
这个设置项只控制 Ctrl+N 新建的 untitled 文件,默认值是 "default_syntax": "Packages/Text/Plain%20text.sublime-syntax"。它对已保存文件、带扩展名的文件完全无效。
- 想让新文件一开就是 Python:在
Preferences → Settings – User加一行:"default_syntax": "Packages/Python/Python.sublime-syntax" - 路径必须完整、大小写敏感、后缀不能错:ST4 用
.sublime-syntax,ST3 用.tmLanguage - 改完要重启 Sublime 或新建窗口才生效;如果还是
Plain Text,八成是路径拼错,或对应语法包被禁用了(检查Preferences → Package Settings)
ApplySyntax 不是“开箱即用”的智能识别
它只是按你写的 JSON 规则做顺序匹配:路径 > 内容正则 > 扩展名,命中即停。默认规则极保守,不配等于没装。
- 规则必须放在
"syntaxes"数组里,每个对象至少含"name"(如"Packages/TypeScript/TypeScript.sublime-syntax")和"rules" - 内容匹配示例(让含
export的.env用 ShellScript):{ "rules": [ { "file_name": "\.env$", "first_line_match": "^export ", "syntax": "ShellScript/Shell-Unix-Generic" } ] } - 改完配置必须重启 Sublime 才生效——很多人忽略这点,改完以为立刻起效,结果还在用旧规则
- 规则顺序很重要:写在前面的先匹配;正则写错(比如漏转义点号)会导致整条规则静默失效,且无报错提示
最易被忽略的点:Sublime 对配置错误完全静默——JSON 多逗号、路径大小写错、语法包被禁用、插件冲突(比如 AutoSetSyntax 覆盖了你的设置),它都不会提醒,只会默默退回 Plain Text。排查时优先关插件、查路径、看 PackageResourceViewer 里的实际语法定义。











