You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Emacs与命令行中haskell-language-server-wrapper行为差异的排查与修复咨询

修复Emacs中haskell-language-server的目录与GHC版本不匹配问题

看起来你的核心问题是Emacs里的LSP客户端没找准项目根目录,导致用了错误的GHC版本和Cradle类型——命令行里能正常识别Stack项目的hie.yaml和对应GHC 9.0.2,但Emacs却跑到父目录/Users/ar/Temp去了,只能用默认的GHC 8.10.7。下面是具体的修复步骤:

1. 强制Emacs识别正确的项目根目录

Emacs的LSP依赖工作区目录来定位项目配置,你可以手动指定:

  • 打开项目里的任意Haskell文件(比如src/Lib.hs),按下 M-x 输入 lsp-workspace-folders-add,然后选择/Users/ar/Temp/lixo作为工作区根目录。
  • 要是想让它自动识别,在Emacs配置里添加这段,让LSP优先找hie.yaml或stack.yaml:
    (setq lsp-haskell-process-path-hie "haskell-language-server-wrapper")
    (setq lsp-haskell-process-args-hie '("--lsp"))
    (setq lsp-project-root-functions '(lsp-haskell-find-root))
    

2. 同步Emacs与终端的环境变量

有时候Emacs启动时的PATH和终端不一样,导致工具版本不对。你可以:

  • 在Emacs里跑 M-x getenv RET PATH,和终端的echo $PATH对比,确保~/.ghcup/bin和Stack的bin目录(比如~/.local/bin)都在路径里。
  • 要是差异大,装个exec-path-from-shell包同步终端环境:
    (use-package exec-path-from-shell
      :ensure t
      :config
      (exec-path-from-shell-initialize))
    

3. 确认hie.yaml配置正确

从命令行日志看,你的hie.yaml在/Users/ar/Temp/lixo,但Emacs没找到。检查下文件内容,Stack项目的hie.yaml一般是这样的:

cradle:
  stack:

如果是多组件项目,也可以写得更详细,但别写错路径,确保LSP能通过它识别到Stack环境。

问题根源分析

对比两份日志就能看明白:

  • 命令行里,你在/Users/ar/Temp/lixo目录下运行haskell-language-server-wrapper,直接找到了hie.yaml,用Stack Cradle拉了项目专属的GHC 9.0.2。
  • Emacs里,LSP的当前目录是/Users/ar/Temp,找不到hie.yaml,只能用默认的Cradle,调用系统全局的GHC 8.10.7。

所以核心就是让Emacs的LSP定位到正确的项目目录,剩下的环境和配置问题都是辅助验证的。

内容的提问来源于stack exchange,提问作者Alexandre Rademaker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:57:40