Darwin系统下如何用nix-env配合emacs-overlay安装Emacs最新包?
问题:通过nix-env安装emacs-overlay中的Emacs包(Darwin系统)
背景
在Darwin(MacOS)系统使用Nix时,nix-community的emacs-overlay提供了大量打包好的最新版Emacs相关包。最初配置~/.config/nixpkgs/overlays.nix为:
[ (import (builtins.fetchTarball { url = "https://github.com/nix-community/emacs-overlay/archive/master.tar.gz"; })) ]
此时可以通过nix-env -i emacs-git安装master分支的Emacs,但无法直接用nix-env安装Ement.el这类最新Emacs包,只能通过以下nix-shell命令安装:
nix-shell --expr 'with (import <nixpkgs> { overlays = [ (import (builtins.fetchTarball { url = "https://github.com/nix-community/emacs-overlay/archive/master.tar.gz"; })) ]; }); (emacsPackagesFor emacsGit).elpaPackages.ement'
尝试修改overlays.nix为以下配置时,执行nix-env -iA nixpkgs.elpaPackages.ement触发无限递归错误:
[ (final: prev: (prev.lib.composeManyExtensions [ (import (builtins.fetchTarball { url = "https://github.com/nix-community/emacs-overlay/archive/master.tar.gz"; })) (withBoth: withEmacsOverlay: withEmacsOverlay.emacsPackagesFor withEmacsOverlay.emacsGit) ] final prev) ) ]
错误信息:
$ nix-env -iA nixpkgs.elpaPackages.ement error: infinite recursion encountered at /nix/store/lxyj36fz3fbjpzwxf2j852a8dim16vkv-nixpkgs/nixpkgs/pkgs/top-level/emacs-packages.nix:60:11: 59| pkgs ? pkgs' 60| , lib ? pkgs.lib | ^ 61| , elpaPackages ? mkElpaPackages { inherit pkgs lib; } self
解决方案
问题出在直接将emacsPackagesFor emacsGit的结果合并到顶层pkgs,导致引用循环。可以通过以下两种方式解决:
方案1:新增顶层属性(推荐,避免覆盖默认包)
修改~/.config/nixpkgs/overlays.nix为:
[ (import (builtins.fetchTarball { url = "https://github.com/nix-community/emacs-overlay/archive/master.tar.gz"; })) (final: prev: { # 新增emacsGitPackages属性,指向基于emacsGit的包集合 emacsGitPackages = final.emacsPackagesFor final.emacsGit; }) ]
之后即可通过以下命令安装Ement.el:
nix-env -iA nixpkgs.emacsGitPackages.elpaPackages.ement
方案2:覆盖默认的emacsPackages(替换为基于emacsGit的版本)
如果希望直接使用nix-env -iA nixpkgs.elpaPackages.ement,可以覆盖默认的emacsPackages:
[ (import (builtins.fetchTarball { url = "https://github.com/nix-community/emacs-overlay/archive/master.tar.gz"; })) (final: prev: { emacsPackages = final.emacsPackagesFor final.emacsGit; }) ]
修改后直接执行:
nix-env -iA nixpkgs.elpaPackages.ement
原理说明
之前的错误是因为emacsPackagesFor需要依赖pkgs,但试图将它的返回值直接合并到pkgs顶层,导致构建过程中出现循环引用。通过新增独立属性或显式覆盖指定属性,既能避免递归问题,又能让这些包被nix-env识别到。
内容的提问来源于stack exchange,提问作者yheilanop
相关产品推荐
相关产品推荐

