Sublime Text 中 LSP-haskell 格式化失效的根源在于 HLS 进程未正确安装或项目配置缺失:需验证 haskell-language-server 是否在 PATH 中、项目根目录是否存在 .cabal 或 package.yaml、LSP-haskell 设置中启用 formattingProvider(如 "stylish-haskell"),且格式化规则由 .haskell-language-server.yaml 控制而非 Sublime 设置。

Sublime Text 装了 LSP-haskell 却不格式化代码?先确认 HLS 进程是否真在跑
CodeFormatter、SublimeHaskell 等老插件已彻底失效,Sublime Text 4 中唯一可靠路径是 LSP-haskell + haskell-language-server(HLS)。但插件显示“ready”不代表能格式化——它只负责转发请求,真正干活的是 HLS 进程。
必须手动验证:
- 终端执行
haskell-language-server --version,有输出才算安装成功;若报command not found,需用ghcup install hls安装并确保~/.ghcup/bin在$PATH中 - 打开 Haskell 项目根目录,确认存在
.cabal或package.yaml——缺这两个文件,HLS 启动后立刻静默退出,LSP 客户端收不到响应 - 在 Sublime 中打开一个
.hs文件,按Ctrl+Shift+P输入LSP: Toggle Server Trace,看输出里是否有textDocument/formatting请求被接收和响应
为什么 Ctrl+Shift+I 格式化没反应?检查 LSP-haskell 的 formatting 配置开关
默认情况下,LSP-haskell 不自动启用格式化功能,即使 HLS 正常运行。必须显式开启:
- 打开
Preferences → Package Settings → LSP → Settings - 在
"clients"下添加或修改haskell配置块,确保包含:{ "haskell": { "enabled": true, "settings": { "haskell.formattingProvider": "stylish-haskell" } } } -
"stylish-haskell"是目前最稳定兼容的 formatter;若想用fourmolu,需额外全局安装fourmoluCLI 并在配置中指定"haskell.formattingProvider": "fourmolu" - 改完保存,重启 Sublime 或执行
LSP: Restart Servers
格式化后缩进错乱或换行异常?别碰 CodeFormatter,它不支持 ST4
网上大量教程推荐的 CodeFormatter 插件早已停止维护,其 Haskell 支持仅基于过时的 hindent,且无法适配 Sublime Text 4 的 LSP 架构。强行安装会导致:
- Package Control 搜索不到,或安装后
Ctrl+Shift+P里根本无相关命令 - 与
LSP-haskell冲突,导致格式化请求被丢弃或返回空响应 - 即使侥幸加载,也会因缺少
haskell-language-server的 formatting capability 而静默失败
真实有效的格式化入口只有一个:Ctrl+Shift+I(Windows/Linux)或 Cmd+Shift+I(macOS),前提是 HLS 正在运行且 formattingProvider 已设为有效值。
项目级格式化规则怎么生效?靠 .haskell-language-server.yaml,不是 Sublime 设置
Sublime 本身不解析 Haskell 格式化规则,所有风格控制(如缩进宽度、是否导出类型签名等)都由 HLS 读取项目根目录下的 .haskell-language-server.yaml 决定。
示例配置:
plugins:
fourmolu:
settings:
indent-width: 2
trailing-newlines: true
stylish-haskell:
settings:
columns: 100
注意:
- 该文件必须放在项目根目录,且 HLS 启动时当前工作目录需为此目录(即用 Sublime 打开整个文件夹,而非单个 .hs 文件)
- 修改后需重启 HLS:关闭所有 Sublime 窗口 → 终端执行
killall haskell-language-server→ 重新打开项目 -
stylish-haskell和fourmolu的配置项完全不同,不能混用;查文档要认准对应 formatter 的 YAML key
HLS 不读 Sublime 的 JSON 配置,也不理 Preferences → Settings 里的任何 Haskell 相关字段——那些只是摆设。


















