diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index be72c0ef29c0..49e3e2d4a948 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -164,6 +164,7 @@
./services/desktops/profile-sync-daemon.nix
./services/desktops/telepathy.nix
./services/development/hoogle.nix
+ ./services/editors/emacs.nix
./services/games/factorio.nix
./services/games/ghost-one.nix
./services/games/minecraft-server.nix
diff --git a/nixos/modules/services/editors/emacs.nix b/nixos/modules/services/editors/emacs.nix
new file mode 100644
index 000000000000..5b65dff03c31
--- /dev/null
+++ b/nixos/modules/services/editors/emacs.nix
@@ -0,0 +1,65 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.emacs;
+
+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 emacsclient to connect to the
+ daemon. If true, services.emacs.install is
+ considered true, 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
+ services.emacs.enable.
+ '';
+ };
+
+
+ package = mkOption {
+ type = types.package;
+ default = pkgs.emacs;
+ defaultText = "pkgs.emacs";
+ description = ''
+ emacs derivation to use.
+ '';
+ };
+
+ };
+
+ 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 ];
+ };
+
+}