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
相关产品推荐
相关产品推荐

