NixOS 上配置有软件包的 Emacs 守护进程

NixOS 上配置有软件包的 Emacs 守护进程

NixOS 手册建议如下配置以将 Emacs 作为带有某些软件包的守护进程启动:

services.emacs.enable = true;
services.emacs.package = import /home/cassou/.emacs.d { pkgs = pkgs; };

但目前尚不清楚这些pkgs = pkgs部分的含义。在我的文件中configuration.nix,我已经指定了我想要的 Emacs 软件包列表:

  environment.systemPackages = with pkgs; [
    # Emacs
    (emacsWithPackages (with emacsPackagesNg; [
      evil
      haskell-mode
      intero
      nix-mode
      org
      python-mode
    ]))
  }

我的问题:如何让守护进程 Emacs 自动使用这些包集?目前他们没有(只有直接启动的 emacs 才有)。

答案1

正在进行中的答案(见下文)

在阅读了 Nix 语言语法后,我得到了以下解决方案移动配置下的包定义services.emacs.package

  services.emacs.enable = true;
  services.emacs.package = with pkgs; (emacsWithPackages (with emacsPackagesNg; [
      evil
      haskell-mode
      intero
      nix-mode
      org
      python-mode
  ]));

虽然这有效,但每当我将新包添加到该列表时,它就不起作用(emacs 不会加载它们)。执行此操作的正确方法是什么?

答案2

多年后... (2021)

我只是安装自定义的 emacs 定义:

emacs.nix

{ pkgs ? import <nixpkgs> {} }:

let
  myEmacs = pkgs.emacs;
  emacsWithPackages = (pkgs.emacsPackagesNgGen myEmacs).emacsWithPackages;
in
  emacsWithPackages (epkgs: (with epkgs.melpaStablePackages;
  [
    solarized-theme
  ]) ++ (with epkgs.melpaPackages; [
    alchemist
    all-the-icons
    auto-complete
    auto-compile
...
  ])
)

configuration.nix

  services.emacs.enable = true;
  services.emacs.package = pkgs.callPackage ./emacs.nix { };

显然,当我切换时守护进程正在运行,因此我需要重新启动它才能emacs使用新配置:

$ sudo nixos-rebuild switch
$ systemctl --user restart emacs

在我看来,切换后您没有重新启动守护进程。

相关内容