Sublime构建系统不支持原生完成音效,因其JSON配置无on_finished或sound回调;需通过Windows的PowerShell/echo ^G、macOS的afplay、Linux的aplay等外部命令,或编写Python插件监听on_post_build事件实现。

Sublime构建系统不支持原生完成音效
Sublime Text 的构建系统(.sublime-build)本身没有 on_finished、sound 或类似回调机制,JSON 配置里加任何“播放声音”的字段都会被忽略——它只管执行命令、捕获输出、解析错误行。所谓“编译完响一下”,必须绕过构建系统本身,靠外部工具或 Sublime 插件间接实现。
Windows 用户可用 powershell + cmd 组合触发 beep
在 cmd 字段里嵌入系统提示音调用是唯一轻量、无需插件的方案,但仅限 Windows(因依赖 cmd.exe 的 echo ^G 或 PowerShell 的 [Console]::Beep()):
-
"cmd": ["powershell", "-c", "[Console]::Beep(880,200); & 'C:\path\to\lua.exe' '$file'"]—— 先响一声再运行 Lua;注意单引号需转义,路径用正斜杠或双反斜杠 - 更兼容的写法:
"cmd": ["cmd", "/c", "echo ^G & lua.exe "$file""],但^G在某些终端可能无声,且不能控制音高/时长 - 别用
shell_cmd:Sublime 构建系统不支持&&连接符,必须用"shell": true+"cmd"数组形式才能让 shell 解析复合命令
macOS/Linux 用户得靠外部命令 + 构建后钩子
这两个系统没有内置 beep 命令,但可用 afplay(macOS)或 aplay(Linux ALSA)播放短音频文件,前提是构建命令能串起来:
- macOS 示例:
"cmd": ["sh", "-c", "lua '$file' && afplay /System/Library/Sounds/Ping.aiff"],注意"shell": true必须设为true,否则&&不生效 - Linux 示例(需先有 wav 文件):
"cmd": ["sh", "-c", "g++ -std=c++17 '$file' -o '${file_path}/${file_base_name}' && aplay /usr/share/sounds/alsa/Front_Center.wav"] - 风险点:如果编译失败(如语法错),
&&后半段不会执行,也就没声音——这反而是优点,只对成功构建反馈
真正可靠的方式是用插件监听 build_finished 事件
Sublime 提供了 API 接口 on_post_build(需自定义插件),比硬塞 shell 命令更可控、跨平台、可区分成功/失败状态:
- 新建插件(
Preferences → Package Settings → Browse Packages… → User目录下建BuildNotifier.py) - 内容示例:
import sublime import sublime_plugin import os <p>class BuildNotifierListener(sublime_plugin.EventListener): def on_post_build(self, view, result): if "error" not in result.lower() and "failed" not in result.lower():</p><h1>macOS</h1><pre class='brush:php;toolbar:false;'> os.system('afplay /System/Library/Sounds/Ping.aiff 2>/dev/null') # Linux(若有 paplay) os.system('paplay /usr/share/sounds/freedesktop/stereo/complete.oga 2>/dev/null') # Windows(备用) os.system('powershell -c "[Console]::Beep(659,150)" 2>/dev/null')</pre></li> - 该方式能精准判断构建是否真正成功(而非仅命令退出码),还能读取输出内容做条件判断;但要求用户会写简单 Python 插件,且每次 Sublime 更新后需确认兼容性
真正的难点不在“怎么响”,而在于“响什么时机”:构建启动、编译完成、链接完成、程序退出、还是 stdout 出现特定字符串?这些粒度 Sublime 原生构建系统一概不暴露,只能靠插件层捕获。

















