0af
1
众所周知,Nix 的 home-manager 可以管理软件的配置(在 build 系统的过程中自动生成对应的 dotfiles),其中包括 Emacs;而 Nixpkgs 也涵盖了 Emacs Lisp 包。
但是 Nix 并不支持所有的系统,例如:(1)不支持原生的 Windows,不过这个问题可以通过 WSL 来解决,真正棘手的是:(2)Nix 不支持 BSD。
这就意味着如果需要使用 BSD 或者在 Windows 上使用原生版(虽然也是基于 MinGW 的)的 Emacs,则需要同时维护两套配置,以适应“拥有 Nix”和“没有 Nix”两种情况。
是否存在一种方法,可以在只写一套配置文件下同时处理两种情况,即:系统“拥有 Nix”的情况下自动使用 Nix 中已经下载好的 Emacs Lisp 包,而在“没有 Nix”的情况下下载所需的 Emacs Lisp 包?
啊这,我觉得同时使用win,linux,mac,bsd就已经够自找苦吃了
nix应该支持bsd吧?不过我也想知道有没有办法。我是上个月刚入坑emacs的小登,目前还在nix管理包和emacs的原生包管理之间摇摆,可以问问大佬更倾向于哪一种办法吗?
最简单的跨平台方法应该是抛弃nix用git来管理和同步emacs的配置文件吧。
1 个赞
0af
5
不过问题是,这么做会不会导致一些 Emacs Lisp 包在 NixOS 或者通过 Nix 安装的 Emacs 上出现问题。
0af
6
主要是我想的是如果不去支持 BSD,可能以后就没有机会了。 
连 FreeNAS 这种原本因为 BSD 受益匪浅的项目都抛弃 BSD 了,BSD 的未来真的很不光明。
BSD 肯定是没法靠苹果和索尼来获得光明的未来的,这些公司只想着靠 BSD 逃避 GPL 许可,却连个 launchd 都不愿意开源给 BSD 社区,结果导致现在 BSD 被 systemd 卡脖子。
看了一下这个项目,它是要用自己 fork 的 Nixpkgs 么,还是说用 Nix 官方的 Nixpkgs?(他们自己 fork 了一个 Nixpkgs,但是最近一年都没有任何更新)
基本不会有问题。我同时使用 debian, macOS+nix-darwin 还有 nixOS,纯用 lisp 写的配置,不用 nixpkgs 装 Emacs包,都能用,没有什么问题。
有一个小问题是 vterm.el 在 macOS-nixdarwin 上没办法直接编译,这个是 vterm 上游的问题。每次编译的时候需要进 nix-shell 把 cmake vterm 之类的依赖装了,就能编译了。
还有就是使用 notmuch / mu4e 之类的 cli 程序和 lisp 包一起打包的软件,需要把 nix 的 lisp 路径传到 emacs 里面。可以用环境变量注入或者 load 一个 nix 生成的 lisp文件把这些路径导入到 load-path 里就好了。不会影响主体的 emacs 配置都可以直接依然使用 lisp 来管理。
还有 alpine void 这几个不用 systemd 的 linux distro 在支撑呢。没有 systemd 不会导致 bsd 完蛋的。不过有红帽这个又当裁判又当运动员的存在,未来 gnome 全家桶生态可能确实就和 bsd 绝缘了。
理论上来说,emacs的相关配置,除开调用外部程序/api的部分,应该都是和系统无关的吧,强依赖于emacs本身
0af
11
不过 tree-sitter 好像是通过动态链接库来注入语法支持的,不知道这个怎么处理。
你只要装了 gcc,调用 treeesit-install 在本地编译会自动链接到 /nix/store/* 对应的 ld 和 libc 的。无须担心。你还可以 enable nix-ld, 这样大部分第三方安装的 binary 链接路径一般也都能找到。
0af
13
不过问题是,macOS 上支持 nix-ld 么?
nix-ld 解决的是 NixOS 没有 FHS 路径的问题。在标准 Linux 发行版或 macOS 上安装 Nix 时,库路径本就符合标准,根本不存在 nix-ld 所要解决的问题——既然如此,为何还需要 nix-ld?
Emacs包的下载和配置是可以分开的吧。你用(use-package ...)不加:ensure,在Nix管理的Emacs下就会使用Nix的包,其他环境如果没有安装这个包就会报错。而加了:ensure它就总是会下载这个包。
最简单的方法就是都不加:ensure,在文件开头用变量use-package-always-ensure来控制是否自动安装;更进一步也可以写代码去自动设置这个变量。
2 个赞
0af
17
但这相当于放弃了可复现性+可回滚性+各项目的环境隔离了。
这三个特性带来的维护成本感觉一点也不低,所以到底需不需要这三个特性本身就是一个重大决策 
rua
19
对我来说不是强需要这几点,或者说有其他实现这几点(但是可能受限于语言内使用)的方案之类的,带来的问题和麻烦比 nix 小太多了