[讨论] 在 Mac 上通过 Nix 使用 Emacs 遇到的问题

,

最近将 MacBook 上的 homebrew 给卸载了,转投了 Nix。其中遇到几个问题,一直不知道怎么解决。 希望在 Mac 上使用过 Nix的朋友指点一下迷津。

我是通过 nix-darwin + home-manager 来进行配置的管理。
这是我目前的 Nix 配置 GitHub - Eason0210/nix: My personal nix config for Mac Big Sur

问题1: 直接通过 /Application 下的 Emacs App 图片启动 Emacs 时,无法识别 home-manager 中设置的变量(sessionVariables), 但是从终端启动就可以正常识别。

比如:从 Application 中启动的 Emacs 就没法识别 aspell 的词典,home-manager 中 aspell 设置如下,

home.sessionVariables = {
      ASPELL_CONF = "conf ${config.xdg.configHome}/aspell/config;";
    };

xdg = {
    enable = true;

    configFile."aspell/config".text = ''
      local-data-dir ${pkgs.aspell}/lib/aspell
      data-dir ${pkgs.aspellDicts.en}/lib/aspell
      personal ${config.xdg.configHome}/aspell/en_US.personal
      repl ${config.xdg.configHome}/aspell/en_US.repl
    '';
  };

问题2: 如果通过 Nix 安装 GUI APP ?
我目前对于 hammerspoon,Skim 等图像界面的应用都是单独下载 dmg 安装包进行安装。

好巧, aspell 这个我也遇到过,后来还是不折腾 nix 了,因为想了想换到 linux 也是用 arch, nix 没有太明显的优势,在我已经有自己的安装脚本的情况下。

ps:GUI 可一在 nix-darwin 中设置 brew 安装。。

我是想着在 Mac 上先用好了 Nix,以后 Linux 和 WSL 可以搞一套 NixOS 配置,这样三个平台就统一了。

用 Nix 就是不想装 Brew 了 :grinning:,实在没好的办法的话,其实手动安装 GUI 的 App 其实也没什么,可以开着自动检查更新。

Emacs App 里是搜不到环境变量 path 的,你可能需要这个包:GitHub - purcell/exec-path-from-shell: Make Emacs use the $PATH set up by the user's shell

这个包我用了,测试过,PATH 的路径是全部继承了,就是设置的 session variable 没继承过来。

我这两天也准备换 nix ,等踩到这坑了我查查:see_no_evil::joy:

Nix 给我用怕了,我上次卸载不干净 nix,结果重装了两次系统 (蒙特雷到大瑟尔)

啊,搞的那么严重!。
官方有卸载的脚本,我卸载过一次,然后重现安装。Nix 安装的内容都在 /Nix 下面,还有/etc/static 文件夹,以及 .config 下面的一些配置(如果开启了xdg)。

另外,这里也有一个安装与卸载的指导

1 个赞

哎,我还是太冲动。。。。我还重装了 macOS,没想到。 不过给了一条退路,我也可以放心地折腾 nix 了 :grinning:

在 Mac 里尝试新东西的时候可以考虑新建一个卷宗,这样不管咋搞不会伤到现有的设置。

3 个赞

嗯,谢谢!(紫薯布丁)

我现在遇到一个问题:

[email protected] ~/Projects/Repositories/doom-emacs (git)-[develop] % nix-shell -p nix-info --run "nix-info -m"

...

x/store/63n7mnabxy9q8rq87qm814pgbaqn9aah-source.drv
  /nix/store/wxs90qjcl8hb63pkphb3a76n110hsw5g-brotli-1.0.9.drv
  /nix/store/any81sfaaj8wisgrn42m9cdsx910wkj1-curl-7.76.1.drv
  /nix/store/f3rfr7f90r6byndh0dmpabmhqrg196ra-cctools-binutils-darwin-wrapper-949.0.1.drv
  /nix/store/hbil2bi9nrmw1rgnv912s1scwn9xygz3-clang-wrapper-11.1.0.drv
  /nix/store/cl45rsz7ln7chbb9ymn4pz82r850nn7z-stdenv-darwin.drv
building '/nix/store/72ryiw4v8jcn357z5gfwhif820j2z64a-v6.2.tar.gz.drv'...
waiting for locks or build slots...

trying http://tarballs.nixos.org/sha256/15r2456g0mlq2q7gh2z52vl6zv6y0z8sdchrs80kg4idqd8sm8fd
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 3251k  100 3251k    0     0  53471      0  0:01:02  0:01:02 --:--:-- 47193
building '/nix/store/9y9zj4cvqa6kndh2ng7afc69vdl2j9f5-c-ares-1.17.2.tar.gz.drv'..

trying https://c-ares.haxx.se/download/c-ares-1.17.2.tar.gz

一直卡在这里。这个 nix-shell 不吃 http_proxy 和 https_proxy 呀

网络问题解决了,现在等他 build。

之前提的这个安装和卸载指导有点过时了,现在 Nix 发布了最新的 2.4 版本,在 Mac 上不再支持单用户版本了。
安装也比较简单,直接执行下面脚本即可安装多用户版本:

curl -L https://nixos.org/nix/install | sh

卸载可以参考官方指南中的多用户版本部分,说的很清楚了。 https://nixos.org/manual/nix/stable/installation/installing-binary.html

不错,更新得好。这样我就没必要使用 brew 了。

我是彻底不用 brew 了。GUI 的应用(比如 Karabiner 和 hammer-spoon)就直接 dmg 安装,反正这些应用都有自动更新,还更方便,这些工具程序也不影响 Nix。

注意,因为 Nix 2.4 只支持多用户,所以必须开启 nix-daemon

  services = {
    nix-daemon.enable = true;
  };

这样会导致没法在终端中设置代理给 Nix 用,要到 daemon 中设置。

两种解决方案:

  1. 通过修改 /Library/LaunchDaemons 文件下的 org.nixos.nix-daemon.plist 实现, 参考 Nix on macOS, Made Easy - 知乎

修改前先执行 sudo launchctl unload org.nixos.nix-daemon.plist 停止服务,增加以下的 http_proxy 和 https_proxy 代理配置:

<key>EnvironmentVariables</key>
        <dict>
                <key>NIX_SSL_CERT_FILE</key>
                <string>/etc/ssl/certs/ca-certificates.crt</string>
                <key>OBJC_DISABLE_INITIALIZE_FORK_SAFETY</key>
                <string>YES</string>
# start here ----------------------------------------------
                <key>http_proxy</key>
                <string>socks5://127.0.0.1:1080</string>
                <key>https_proxy</key>
                <string>socks5://127.0.0.1:1080</string>
# ends here --------------------------------------------------
        </dict>

最后再执行 sudo launchctl load org.nixos.nix-daemon.plist 启动服务即可。

  1. 直接使用国内的Nix 镜像,比如清华源
1 个赞

不错,也推荐一下 sjtug 的镜像,他也同步了 Nix(包括 Darwin)。

1 个赞

有没有人用过 Guix ?

https://guix.gnu.org/manual/en/html_node/Introduction.html#Introduction

https://ruzkuku.com/texts/debian-guix.html

Guix 还不支持 Mac 平台,只能用在 Linux 上。