根本原因是sublime Text依赖haskell-language-server(HLS)提供智能功能,插件仅作桥梁;若HLS未正确安装、项目配置缺失(如.cabal文件)、路径含空格或格式器未匹配,均会导致无报错无补全。

sublime text 装完 Haskell 插件后不报错也不补全,怎么回事
根本原因:Sublime Text 本身不运行 Haskell,它只靠外部工具(比如 haskell-language-server)提供语法检查、跳转、补全。插件只是“传话员”,没启动好服务,就等于没通电。
实操建议:
- 确认已全局安装
haskell-language-server(不是hlint或ghc-mod,那俩早淘汰了),运行haskell-language-server --version能输出版本才算到位 - 用
Package Control安装插件时,必须选Haskell Language Server(作者是fpco或haskell),别误装成老掉牙的Haskell-Sublime - 项目根目录下要有
.cabal文件或package.yaml,否则haskell-language-server启动失败,插件连日志都不报——它默认静默降级
Sublime 中 Ctrl+Click 跳不到定义,或者跳到 GHC 源码里去了
这不是 Sublime 的锅,是 haskell-language-server 的解析范围没对齐当前项目依赖。它默认只索引当前 package,跨 package 的模块引用若没显式声明依赖,就会 fallback 到 GHC 内置模块。
实操建议:
- 检查
.cabal文件里build-depends是否列全了你 import 的包,尤其是本地开发的其他库,得用path:引入 - 改完配置后,必须重启 Sublime(不是 reload project),因为 HLS 进程在 Sublime 启动时就绑定了项目路径
- 想验证是否生效:打开一个
.hs文件,按Ctrl+Shift+P输入Haskell: Restart Server,看右下角状态栏有没有 “HLS ready” 提示
保存文件后没自动格式化,stylish-haskell 配置无效
Sublime 的 Haskell 插件默认不接管格式化,它把这事交给 LSP(Language Server Protocol)层处理;而 haskell-language-server 默认用的是 ormolu,不是 stylish-haskell —— 即使你本地装了后者,HLS 也视而不见。
实操建议:
- 在项目根目录建
hie.yaml,写明格式器选择:cradle: cabal: - path: "./" component: "lib:your-package-name"再加一行
options: {formattingProvider: ormolu}(支持ormolu/floskell/fourmolu) -
stylish-haskell只能通过 Sublime 的外部 build system 调用,但那样会打断 LSP 流程,补全和诊断可能失步——不推荐混用 - 确认
ormolu已安装且在$PATH:运行ormolu --version,否则 HLS 启动时会静默禁用格式化
windows 上路径含空格或中文,HLS 启动失败报 Failed to parse result of calling cabal
这是 HLS 调用 cabal 时 shell 解析出错,不是编码问题,而是 Windows cmd 对引号和空格的处理太脆弱。哪怕路径只是 C:UsersJohn Doeproject,也会崩。
实操建议:
- 把项目移到无空格、无中文、无特殊符号的路径下,例如
C:haskellmyapp,这是最稳解法 - 不要试图用双引号包裹路径来“修复”,HLS 内部调用逻辑不识别外层引号,反而更乱
- 如果非得放桌面,可创建 NTFS 符号链接:
mklink /D C:hsproj "C:UsersJohn DoeDesktopmy-hs-project",然后在C:hsproj下工作
Sublime 对 Haskell 的支持本质是“借力”,所有智能功能都卡在 haskell-language-server 这一层。它启动慢、依赖严、路径敏感,出问题时日志藏得深,很多人卡在“看起来装好了,但就是不干活”这一步——其实八成是 HLS 根本没跑起来,而不是 Sublime 设置错了。