sublime text 默认不识别 .tpl 文件且无 smarty 语法高亮,需安装 yaml 格式 smarty 插件、绑定 .tpl 扩展名、配置支持 smarty scope 的配色方案三步缺一不可。

Sublime Text 默认不识别 .tpl 文件,也不会对 Smarty 模板语法(如 {if $var}、{foreach $items as $item})做高亮——这不是功能缺失,而是因为 Smarty 没有内置语法定义,必须手动绑定作用域和配色规则。
确认当前文件是否被识别为 Smarty
打开一个 .tpl 文件,看右下角状态栏显示的是什么。常见错误现象:Plain Text、HTML 或 PHP。这些都意味着语法高亮完全失效——HTML 高亮只管标签,PHP 高亮只管 <?php ?> 块,对 {* *} 注释或 {$var} 变量毫无反应。
临时解决办法(仅本次文件):点击右下角名称 → 选择 Open all with current extension as… → 搜索并选中 Smarty(如果已安装插件)。但多数人点开列表根本找不到 Smarty,说明语法定义还没加载。
安装 Smarty Syntax 插件(推荐 Package Control 方式)
别用网上搜到的“Smarty.tmLanguage”旧版 plist 文件,Sublime Text 3.0+ 已弃用该格式,强行放进去会静默失败。必须用 YAML 格式的 .sublime-syntax 定义。
- 确保已安装
Package Control(没装就先按Ctrl+`调出控制台,粘贴官方安装代码) - 按
Ctrl+Shift+P打开命令面板,输入Install Package回车 - 搜索
Smarty,优先选作者为h404bi的Smarty插件(GitHub 仓库活跃,支持{function name}、{nocache}等新语法) - 安装完成后,重启 Sublime Text(部分语法定义需重载内核才能生效)
验证:打开 .tpl 文件,右下角应显示 Smarty;光标放在 {$user.name} 上,按 Ctrl+Shift+P 输入 show_scope_name,能看到类似 variable.other.smarty 的作用域输出——这才是真正生效的信号。
手动绑定 .tpl 扩展名(绕过自动识别失败)
即使插件装好了,某些 .tpl 文件仍可能被识别为 HTML,尤其当文件开头没有 Smarty 特征标记(如 {extends file="base.tpl"})时。这是因为 Sublime 的语法检测是基于内容匹配,不是单纯看后缀。
强制绑定步骤:
- 打开任意
.tpl文件 - 右下角点击当前语法名(如
HTML)→Open all with current extension as… - 在弹出窗口中,展开
Plugins→ 找到并选择Smarty
这个操作会写入 Packages/User/Preferences.sublime-settings 中的 extensions 映射,之后所有 .tpl 文件都会默认走 Smarty 语法解析。注意:不要手动编辑该设置文件去加 "tpl": "Smarty",容易格式错误导致整个配置失效。
检查配色方案是否支持 Smarty scope
装了语法定义 ≠ 高亮可见。很多主题(比如原生 Monokai)压根没定义 keyword.control.smarty 或 variable.other.smarty 这类作用域的颜色,结果就是语法被正确解析了,但所有 Smarty 标签全显示成默认前景色(灰白色),跟没高亮一样。
解决方法:
- 先换一个明确支持 Smarty 的主题,例如
Material Theme或Neon Color Scheme(它们在发布时就预置了 Smarty scope) - 若坚持用当前主题,打开菜单
Preferences → Color Scheme…,找到你正在用的.tmTheme文件路径(通常是Packages/User/xxx.tmTheme) - 在该文件的
rules数组里添加几条作用域映射,例如:{ "scope": "keyword.control.smarty", "foreground": "#FF6B6B" }, { "scope": "variable.other.smarty", "foreground": "#4ECDC4" }
改完保存,无需重启,高亮会立即刷新。但注意:作用域名必须和语法文件里定义的一致(可查插件源码里的 scope: 行),拼错一个字母就无效。
最常被忽略的点是:Smarty 语法高亮依赖三重对齐——插件安装成功、扩展名绑定正确、配色方案覆盖完整。少任何一环,看起来都是“装了但没用”。尤其是最后一步,很多人看到插件装完就以为万事大吉,结果盯着灰白的 {foreach} 发呆两小时。











