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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:55:00