必须安装language coffeescript插件、手动绑定.coffee文件语法为coffeescript、统一设为2空格缩进,三者缺一不可;装错插件、缩进错误或未绑定语法均导致文件被识别为plain text而非coffeescript解析。

Sublime Text 默认完全不识别 .coffee 文件,装错插件、缩进设错、语法没手动绑定——三者任一出问题,你看到的就只是黑底白字的纯文本,不是高亮“失效”,是根本没被当作 CoffeeScript 解析。
必须装 Language CoffeeScript,不是 CoffeeScript 或 SublimeCoffeeScript
很多人搜“CoffeeScript 插件”随手点了第一个,结果装的是早已废弃的 CoffeeScript 或 SublimeCoffeeScript。这两个包用的是旧版 .tmLanguage 语法定义,在 Sublime Text 3/4 上直接失效:右下角永远显示 Plain Text,关键词全黑,缩进无分层。
- 正确做法:按
Ctrl+Shift+P→ 输入Install Package→ 等列表加载完 → 搜索并安装Language CoffeeScript(作者 jashkenas,官方维护) - 装完后打开任意
.coffee文件,右下角状态栏必须显示CoffeeScript;若仍是Plain Text,说明插件没生效 - 检查
Packages/User/下是否残留旧插件目录(如CoffeeScript/),有就直接删掉 - 别手动丢
CoffeeScript.tmLanguage文件进Packages—— Sublime Text 3/4 已弃用该格式,会和Language CoffeeScript冲突
右下角显示 CoffeeScript ≠ 高亮真正常,缩进必须统一为 2 空格
CoffeeScript 对空白符极度敏感。Sublime 一旦混用 Tab 和空格,或缩进宽度 ≠ 2,语法解析器就会放弃渲染:关键词变黑、缩进颜色消失、甚至右下角自动跳回 Plain Text。
- 菜单 →
View→Indentation→ 勾选Convert Indentation to Spaces - 再点
Indentation→Tab Width: 2 - 在
Preferences → Settings(用户设置)中加一行:"detect_indentation": false,防止编辑器自作主张重设缩进 - 改完设置后,已打开的
.coffee文件需关闭再重开,或按Ctrl+Shift+P→ 输入Reload Syntax回车
构建系统里 coffee 命令找不到,和终端能跑无关
你在终端敲 coffee --version 成功,不代表 Sublime 能调到它。Sublime 构建系统启动时读取的是它自己的环境变量,不继承 shell 的 PATH。
- 先查真实路径:
Windows:CMD 里运行where coffee,结果类似C:UsersxxxAppDataRoaming pmcoffee.cmd
macOS/Linux:终端运行which coffee,结果类似/usr/local/bin/coffee - 在 Sublime 控制台(
Ctrl+`)运行import os; print(os.environ.get('PATH')),确认输出里包含上述路径 - Windows 构建系统中
"cmd"必须写"coffee.cmd"(不是coffee),且"path"填绝对路径,比如"C:\Users\xxx\AppData\Roaming\npm" - macOS/Linux 建议显式加
"path"字段,例如"path": "/opt/homebrew/bin:/usr/local/bin",别依赖$PATH
为什么改了设置还是没反应?检查 scope 是否被劫持
有些插件(比如旧版 Babel、自定义主题或语法覆盖插件)会悄悄重写 source.coffee 的 scope,导致 Language CoffeeScript 的规则无法命中。这种问题不会报错,但高亮就是不动。
- 验证方式很直接:把光标放在任意关键字上(如
console),按Ctrl+Shift+P→ 输入Developer: Show Scope Name回车,看输出是否以source.coffee开头 - 如果不是,说明 scope 被覆盖了,得排查最近安装的插件,尤其是带 “Babel”、“JSX”、“ESLint”、“Theme” 字样的
- 临时禁用可疑插件,重启 Sublime,再试一次
Show Scope Name
真正卡住的人,往往不是没装插件,而是装了两个冲突的插件、缩进改了一半、或者 scope 被静默覆盖了却还在反复调构建路径——这些地方不盯住 scope 和右下角状态,其他操作全是徒劳。











