sublime text 跑不了 lua 的根本原因是系统未正确配置 lua/luajit 命令及构建系统:必须先在终端验证 lua -v 或 luajit -v 可执行,再创建严格符合 json 语法的 lua.sublime-build 文件,确保 cmd、selector(如 source.lua 或 source.lua.enhanced)、file_regex 与实际环境完全一致,且重启 sublime 以加载新 path。

Sublime Text 跑不了 Lua,它只是个编辑器;能 Ctrl+B 运行的唯一条件是:你系统 PATH 里真有 lua 或 luajit,且 .sublime-build 文件里写的命令和终端里敲的一模一样。
确认 lua 或 luajit 在终端能直接执行
这是硬门槛,跳过就白配。Sublime 构建系统不会帮你猜路径、也不会读你没生效的环境变量。
- Windows:打开 CMD 或 PowerShell,执行
where lua或where luajit;有类似C:\lua\lua.exe的输出才算通过 - macOS:终端运行
which lua或which luajit;若为空,用brew install lua@5.4(M1/M2 推荐);注意 GUI 启动的 Sublime 可能读不到 shell 的 PATH,建议记下实际路径(如/opt/homebrew/bin/lua),后面构建文件里直接写死 - Linux:运行
which lua5.4或ls /usr/bin/lua*;很多发行版默认命令是lua5.4,不是lua,这点必须和构建文件里的"cmd"字段完全一致 - 改完 PATH 后,必须彻底退出 Sublime 进程(不是关窗口),再重启——它只在启动时读一次环境变量
新建 Lua.sublime-build 并严格校验 JSON 格式
Sublime 对语法错误零容忍:多一个逗号、引号用了中文、缩进混用 Tab、selector 缺失——全都会静默失效(Ctrl+B 没反应,也不报错)。
- 菜单 → Tools → Build System → New Build System…,粘贴以下内容(必须全英文引号、末尾有逗号、4 空格缩进、无 Tab):
{
"cmd": ["lua", "$file"],
"selector": "source.lua",
"file_regex": "^(*?):([0-9]+):?([0-9]*):? (.*)$",
"working_dir": "$file_path"
}
"cmd" 必须是你终端里真实能敲出来的命令:如果 luajit -v 有输出,就得写 ["luajit", "$file"];Windows 上建议写 ["lua.exe", "$file"],避免扩展名解析问题"selector": "source.lua" 是硬性要求;如果你装了 Lua Enhanced 插件,它注册的是 source.lua.enhanced,这里就必须同步改成对应值"file_regex" 决定点击错误能否跳转到行号;Lua 默认报错格式是 test.lua:5: attempt to call a nil value,但 luajit 错误可能带列号(如 :5:12),就得改成 "^(.*?):([0-9]+):([0-9]+):"
"shell_cmd":例如 "shell_cmd": "cd $file_path && lua $file_name" 在 Sublime 构建系统中不支持 &&,会直接失败;要用 "working_dir": "$file_path" 显式指定工作目录解决 Windows 下脚本一闪而过、中文路径报错、交互卡死
游戏开发常需 io.read() 或加载本地资源,这些问题在 Windows 上最典型,本质是编码与路径解析错位。
- 中文路径报
cannot open xxx: No such file or directory:Sublime 用系统 ANSI 编码(如 GBK)读取路径,而lua.exe(尤其 5.4+)只认 UTF-8;临时解法是把项目移到纯英文路径,长期建议用luajit+ 显式设置"encoding": "UTF-8" - 脚本运行后窗口一闪而过:说明没阻塞等待输入;可在脚本末尾加
io.read(),或构建文件里改用"cmd": ["cmd", "/c", "lua", "$file", "& pause"](仅 Windows) - 交互输入乱码或卡住:确保 Sublime 的文件编码设为 UTF-8(右下角点击编码 → UTF-8),并在构建文件中显式声明
"encoding": "UTF-8"
真正卡住人的从来不是插件装没装对,而是 lua 命令在哪、selector 对不对、file_regex 能不能匹配真实错误格式——这三个点漏一个,Ctrl+B 就是静默失败。











