Change:
Several users are manually adding a systemd user service to their . It would be better to create a NixOS module so that people don't copy/paste half-baked definitions. What do you think?
/cc
Versions of such a user service can be found at: Please tell me where I can find your version so we merge them all
On a related note, I use an XDG autostart to start the Emacs daemon. This may be preferable for some people because the environment will be set up correctly, though there are of course other ways to achieve this.
Sounds like a great idea to me. Those versions look quite similar to mine. build my emacs with GTK3 enabled. So there would obviously need to be a config option. there be a configuration option for the list of Melpa packages, or would this be handled using and the option? : Tikon's config. Having will result in starting emacs for every user who logs in. For a general NixOS module it would be best to leave empty and let the user enable the service with (or adding a symlink in ). : Damien's config, You probably already know, but setting the variable could be achieved by putting this in your configuration: Other variables such as should already be taken care of by sourcing . note that systemd socket activation for Emacs server was implemented in April and should appear in Emacs 25.2.
Please see PR . thanks for your feedback. I didn't do anything special yet. I have the impression allowing that would just duplicate features. But I really don't know. Any opinion?
Yes, it does overlap a little. I am trying to find out if it's possible to make the configuration of emacs any simpler for newcomers. In this case, I think not.

Discussion:
./services/desktops/profile-sync-daemon.nix ./services/desktops/telepathy.nix ./services/development/hoogle.nix <ins> ./services/editors/emacs.nix </ins> ./services/games/factorio.nix ./services/games/ghost-one.nix ./services/games/minecraft-server.nix

<ins> { config, lib, pkgs, ... }: with lib; let cfg = config.services.emacs; editorScript = pkgs.writeScriptBin "emacseditor" '' #!${pkgs.stdenv.shell} if [ -z "$1" ]; then exec ${cfg.package}/bin/emacsclient --create-frame --alternate-editor ${cfg.package}/bin/emacs else exec ${cfg.package}/bin/emacsclient --alternate-editor ${cfg.package}/bin/emacs "$@" fi ''; in { options.services.emacs = { enable = mkOption { type = types.bool; default = false; example = true; description = '' Whether to enable a user service for the Emacs daemon. Use <literal>emacsclient</literal> to connect to the daemon. If <literal>true</literal>, <varname>services.emacs.install</varname> is considered <literal>true</literal>, whatever its value. ''; }; install = mkOption { type = types.bool; default = false; example = true; description = '' Whether to install a user service for the Emacs daemon. Once the service is started, use emacsclient to connect to the daemon. The service must be manually started for each user with "systemctl --user start emacs" or globally through <varname>services.emacs.enable</varname>. ''; }; package = mkOption { type = types.package; default = pkgs.emacs; defaultText = "pkgs.emacs"; description = '' emacs derivation to use. ''; }; defaultEditor = mkOption { type = types.bool; default = false; example = true; description = '' When enabled, configures emacsclient to be the default editor using the EDITOR environment variable. ''; }; }; config = mkIf (cfg.enable || cfg.install) { systemd.user.services.emacs = { description = "Emacs: the extensible, self-documenting text editor"; serviceConfig = { Type      = "forking"; ExecStart = "${pkgs.bash}/bin/bash -c 'source ${config.system.build.setEnvironment}; exec ${cfg.package}/bin/emacs --daemon'"; ExecStop  = "${cfg.package}/bin/emacsclient --eval (kill-emacs)"; Restart   = "always"; }; } // optionalAttrs cfg.enable { wantedBy = [ "default.target" ]; }; environment.systemPackages = [ cfg.package editorScript ]; environment.variables = if cfg.defaultEditor then { EDITOR = mkOverride 900 "${editorScript}/bin/emacseditor"; } else {}; }; } </ins>

<ins> import ./make-test.nix ({ pkgs, ...} : { name = "emacs-daemon"; meta = with pkgs.stdenv.lib.maintainers; { maintainers = [ DamienCassou ]; }; enableOCR = true; machine = { config, pkgs, ... }: { imports = [ ./common/x11.nix ]; services.emacs = { enable = true; defaultEditor = true; }; # Important to get the systemd service running for root environment.variables.XDG_RUNTIME_DIR = "/run/user/0"; environment.variables.TEST_SYSTEM_VARIABLE = "system variable"; }; testScript = '' $machine->waitForUnit("multi-user.target"); # checks that the EDITOR environment variable is set $machine->succeed("test $(basename "$EDITOR") = emacseditor"); # waits for the emacs service to be ready $machine->waitUntilSucceeds("systemctl --user status emacs.service | grep 'Active: active'"); # connects to the daemon $machine->succeed("emacsclient --create-frame $EDITOR &"); # checks that Emacs shows the edited filename $machine->waitForText("emacseditor"); # makes sure environment variables are accessible from Emacs $machine->succeed("emacsclient --eval '(getenv "TEST_SYSTEM_VARIABLE")'") =~ /system variable/ or die; $machine->screenshot("emacsclient"); ''; }) </ins>