sublime 中 blade 文件无高亮,90% 是因未识别为 blade 语法;需右下角手动选“html (laravel blade)”,装 laravel blade highlighter 插件,并绑定 .blade.php 扩展名,再检查主题 color_scheme 中对应 scope 配色。

Blade 文件没高亮,90% 是因为 Sublime 根本没识别成 Blade 语法——不是插件装错了,也不是主题坏了,先解决“认文件”这个前提。
怎么确认当前文件被识别为 Blade
打开一个 .blade.php 文件,看编辑器右下角显示什么。如果显示 Plain Text、PHP 或 HTML,说明 Sublime 没加载 Blade 语法规则,高亮不会触发。
点击右下角语言名 → 搜索并选择 HTML (Laravel Blade)(注意:不是单独的 Blade 项,多数插件注册的是这个名称);选中后立即生效,@if、@foreach、{{ }} 会立刻变色。
验证是否成功:输入 @section('content') 和 {{ $title }},看它们是否呈现不同颜色(比如控制关键字 vs 插值内容)。
装哪个插件?别混装 Laravel Blade Highlighter 和 Blade Snippets
这两个插件职责完全不同,混装反而导致高亮错乱或括号匹配失效:
-
Laravel Blade Highlighter负责语法解析和作用域定义(如keyword.control.blade),是高亮的基础 -
Blade Snippets只提供@foreach、@include等代码片段补全,不参与高亮
如果你只需要高亮,只装 Laravel Blade Highlighter 就够了;需要补全再加装 Blade Snippets,但必须进 Preferences → Package Settings → Blade Snippets → Settings – User,加一行:"disable_syntax_highlighting": true。
别碰 Laravel 5 Snippets——2026 年还在用这玩意,@props、@once 全不识别。
为什么设置了还是不生效?检查 extensions 绑定和主题 scope
即使插件装了、手动选对了语法,仍可能白屏或部分高亮失效,常见于:
- 扩展名未自动绑定:Sublime 原生不支持
.blade.php,需显式告诉它“这类文件默认用 Blade 解析” - 主题没定义对应语法作用域:比如
keyword.control.blade在当前.sublime-color-scheme里没配色,就会退成灰或白
最稳的绑定方式:打开一个 .blade.php 文件,点击右下角语言名 → Open all with current extension as… → 搜索并选择 HTML (Laravel Blade)。这个操作会自动往 Packages/User/Preferences.sublime-settings 里写入:"extensions": ["blade.php"]。
若想同时支持旧式 .blade 文件,补上:"extensions": ["blade.php", "blade"]。
临时验证主题兼容性:换回默认主题(Preferences → Color Scheme → Default → Monokai),看是否恢复高亮。
高亮颜色不对或部分失效?别改 syntax,去查 color_scheme
语法高亮颜色不由 .sublime-syntax 控制,而是由当前启用的 color_scheme 决定。改错地方就永远看不到效果。
按 Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS),输入 Show Scope Name 回车,状态栏会显示当前光标位置的作用域(如 keyword.control.blade),右下角也会提示当前 color_scheme 路径。
如果路径里有 Packages/ 但没带 User/,说明你正在编辑只读的原版主题——任何修改都不会生效。必须把原文件复制到 Packages/User/ 下再改,并在用户设置中显式指定:"color_scheme": "Packages/User/YourTheme.sublime-color-scheme"。
在副本里搜索 keyword.control.blade、meta.interpolation.blade 等 scope,给它们加 foreground 规则。注意 JSON 格式要合法,颜色推荐用 #RRGGBBAA 或 hsla() 格式,避免不透明背景盖住文字。
复杂点在于:同一个 scope 在不同主题里可能被拆成多个子作用域(比如 {{ }} 里的变量名可能是 variable.other.blade),靠 Show Scope Name 点哪看哪,比猜靠谱得多。











