Sublime Text 配置 Haskell 环境的关键前提是已安装 GHC(通过 ghcup 推荐)并正确配置 PATH;插件如 SublimeHaskell 依赖 HLS,需手动安装并匹配项目 resolver 版本;构建系统须用 stack ghc 或 ghc 命令并设对 working_dir 和 file_regex。

Sublime Text 本身不内置 Haskell 支持,但能通过插件和外部构建系统跑起来——关键不是“能不能”,而是ghc是否已装好、build_system是否指向正确的可执行路径、以及sublime-build文件里有没有写死错误的参数。
确认 ghc 和 cabal 或 stack 已安装并可用
这是最常被跳过的前置步骤。Sublime 不会帮你装编译器,它只调命令行。运行终端检查:
ghc --version<br>stack --version # 或 cabal --version
如果报 command not found,先装好 GHCup(推荐)或直接下载 GHC + Stack。macOS 上用 brew install ghcup;Windows 用户务必把 ghcup 加入 PATH,并在 PowerShell 或 CMD 中验证生效。别信“双击安装完就 OK”——Sublime 启动时读的是它自己的环境变量,不是你终端里临时设的。
安装 SublimeHaskell 插件(非必需但强烈建议)
它不只是语法高亮,还提供类型提示、跳转定义、:load 式交互式检查。但注意:它依赖 haskell-language-server(简称 HLS),不是 ghc-mod 那种老方案。
- 用 Package Control 安装
SublimeHaskell后,必须手动运行一次SublimeHaskell: Install/Update Haskell Language Server命令(Cmd+Shift+P / Ctrl+Shift+P 调出) - HLS 安装过程会拉取几十 MB 二进制,耗时较长,失败时看 Sublime 底部状态栏提示,别关窗口
- 若项目用
stack,确保stack.yaml存在且resolver字段合法;用cabal则需project.cabal或cabal.project
手写 Haskell.sublime-build 构建系统(绕过插件也能跑)
很多人卡在这步:插件没反应,就以为整个流程崩了。其实你可以完全不用插件,靠 Sublime 的构建系统直接调 ghc 或 stack。
菜单 → Tools → Build System → New Build System,粘贴以下内容(以 stack 为例):
{
"shell_cmd": "stack ghc -- $file",
"file_regex": "^(...*?):([0-9]+):([0-9]+):? ?(.*)$",
"working_dir": "$file_path",
"selector": "source.haskell"
}保存为 Haskell.sublime-build,再选中它。注意几个硬坑:
-
shell_cmd中的--是分隔符,防止文件名含空格被拆开;没它,路径带空格就失败 -
file_regex必须匹配stack ghc的错误格式,比如src/Main.hs:5:13: error:—— 如果你用ghc直接编译,正则要改成^([^:]*):([0-9]+):([0-9]+):(.*)$ -
working_dir设成$file_path才能让stack正确识别项目根目录,否则找不到.cabal或stack.yaml
调试常见构建失败原因
按 Ctrl+B / Cmd+B 没反应?或者输出一堆红色文字?先看这几项:
- 终端里能跑
stack ghc Main.hs,但 Sublime 报错?大概率是 Sublime 启动时没继承你的 shell PATH —— macOS/Linux 可改启动方式(用终端执行subl),Windows 则需重启 Sublime 并确认 PATH 已全局生效 - 错误里出现
Could not find module 'Prelude'?说明ghc版本和当前项目要求不匹配,比如用 GHC 9.2 编译依赖 base-4.16 的代码,而系统装的是 base-4.18 - 构建成功但没生成可执行文件?默认
stack ghc只做类型检查;加-o $file_base_name参数才能输出二进制,例如:"shell_cmd": "stack ghc -- -o $file_base_name $file"
真正麻烦的从来不是配置步骤,而是 GHC 版本、HLS 版本、Stack resolver 三者之间那点细微的不兼容 —— 它不会报“版本冲突”,只会静默失败或类型检查卡住。遇到这种,先查 haskell-language-server --version 输出的 GHC 版本号,再比对 stack --version 对应的 resolver 默认 GHC 版本。


















