NixOS下Neovim中Haskell LSP无法识别XMonad导入求助
解决NixOS下HLS/ghci找不到XMonad模块的问题
问题原因
NixOS中的ghc是纯环境,默认不会将environment.systemPackages内的Haskell包纳入其模块搜索路径。而xmonad --recompile是通过Nix配置的专用编译环境运行的,该环境自动包含了XMonad相关依赖,因此能正常编译,但ghci和HLS(依赖系统ghc)无法识别这些包。
解决方案
方法1:用nix-shell临时加载依赖环境
在你的XMonad配置目录下创建shell.nix文件:
{ pkgs ? import <nixpkgs> {} }: pkgs.mkShell { buildInputs = with pkgs.haskellPackages; [ ghc haskell-language-server xmonad xmonad-contrib ]; }
执行nix-shell进入该环境后,再启动Neovim或ghci,就能正常识别XMonad模块。
方法2:用direnv自动加载环境(推荐)
- 在
configuration.nix中安装direnv:
environment.systemPackages = with pkgs; [ # 其他已安装包... direnv ];
执行sudo nixos-rebuild switch使配置生效。
- 在XMonad配置目录下创建
.envrc文件:
use nix
- 同样在该目录下创建上述的
shell.nix,然后执行direnv allow完成授权。
之后每次进入该目录时,direnv会自动加载包含XMonad依赖的环境,直接启动Neovim即可正常使用HLS。
方法3:手动注册包到ghc全局数据库(不推荐)
这种方法会破坏ghc的纯环境,系统更新后可能失效,仅作临时应急用:
# 注册xmonad模块 ghc-pkg register $(nix-build '<nixpkgs>' -A haskellPackages.xmonad)/lib/ghc-*/package.conf.d/xmonad-*.conf # 注册xmonad-contrib模块 ghc-pkg register $(nix-build '<nixpkgs>' -A haskellPackages.xmonad-contrib)/lib/ghc-*/package.conf.d/xmonad-contrib-*.conf
内容的提问来源于stack exchange,提问作者Refael Sheinker
相关产品推荐
相关产品推荐

