先确认haskell-language-server是否启动:终端运行haskell-language-server --version应有输出;若command not found,需安装并加入PATH;项目根目录必须有.cabal或package.yaml文件,否则HLS静默失败。

Sublime 装了 LSP-haskell 却不工作?先看 haskell-language-server 启没启动
LSP-haskell 插件本身不提供语言服务,它只是 LSP 客户端,真正干活的是 haskell-language-server(HLS)。插件显示“ready”但跳转/补全失效,大概率是 HLS 进程根本没起来。
实操建议:
- 终端运行
haskell-language-server --version,必须有输出;若报 command not found,说明没装或不在$PATH - 项目根目录必须有
.cabal文件或package.yaml,否则 HLS 启动时静默失败,LSP-haskell 不报错也不提示 - 用
subl .(从终端启动 Sublime)而非双击 Dock 图标,避免环境变量丢失导致 HLS 找不到ghc - 按
Ctrl+Shift+P输入Haskell: Restart Server,看右下角状态栏是否出现 “HLS ready”
LSP-haskell 的 settings 里要不要配 command?
绝大多数情况不用。LSP-haskell 默认会自动查找 haskell-language-server,硬写 "command": ["/path/to/haskell-language-server"] 反而容易出问题——比如路径含空格、符号链接断裂、或指向了旧版本。
实操建议:
- 只在多 GHC 版本共存且 HLS 总选错编译器时,才显式指定
command,并确保该 HLS 是用对应 GHC 编译的 - Windows 用户注意:路径分隔符用正斜杠
/,别用反斜杠\;含空格路径必须加引号,如"command": ["C:/Users/Me/AppData/Roaming/ghcup/bin/haskell-language-server.exe"] - macOS/Linux 用户若用
ghcup管理,确保ghcup set hls已执行,这样haskell-language-server命令才指向正确实例
为什么 Ctrl+Click 跳转总跳进 GHC 源码,而不是我的模块?
这不是 LSP-haskell 的 bug,是 HLS 解析范围没对齐你的依赖声明。它默认只索引当前 package,如果你 import Data.MyModule,但 .cabal 里没在 build-depends 列出对应包,HLS 就 fallback 到 GHC 内置模块。
实操建议:
- 检查
.cabal中build-depends是否包含所有import的第三方包,例如aeson、text - 本地开发的其他库,不能只写包名,得用
path:引入,如my-utils: path: ../my-utils - 改完
.cabal后必须重启 HLS(Ctrl+Shift+P → Haskell: Restart Server),否则缓存仍指向旧解析图
保存后没自动格式化,hie.yaml 配了也没用?
LSP-haskell 不接管格式化逻辑,它把这事全交给 HLS。而 HLS 默认只认 ormolu,哪怕你系统装了 stylish-haskell,它也直接忽略。
实操建议:
- 项目根目录建
hie.yaml,内容必须含options: {formattingProvider: ormolu}(支持ormolu/floskell/fourmolu) - 确认
ormolu已安装且在$PATH:运行ormolu --version,否则 HLS 启动时静默禁用格式化 - 别在 Sublime 的 Build System 里混用
stylish-haskell,会破坏 LSP 的诊断流——补全可能卡住,类型提示延迟
最容易被忽略的是项目根目录的“存在感”:LSP-haskell 和 HLS 都严格依赖 .cabal 或 package.yaml 文件来识别项目边界。删掉它,整个语言服务就退化成纯语法高亮——连错误提示都不会有。











