From f3be3cda6a69365f2acecc201b3cd1ee4f6d4614 Mon Sep 17 00:00:00 2001 From: rcerc <88944439+rcerc@users.noreply.github.com> Date: Mon, 10 Jan 2022 02:17:13 -0500 Subject: [PATCH] services/emacs: add option to set `emacsclient` as the default editor (#2545) * services/emacs: add `defaultEditor` option Sets `emacsclient` as the default editor using the `EDITOR` environment variable. --- modules/services/emacs.nix | 21 +++++++++++++++- tests/modules/services/emacs/default.nix | 1 + .../services/emacs/emacs-default-editor.nix | 24 +++++++++++++++++++ .../services/emacs/emacs-default-editor.sh | 18 ++++++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 tests/modules/services/emacs/emacs-default-editor.nix create mode 100644 tests/modules/services/emacs/emacs-default-editor.sh diff --git a/modules/services/emacs.nix b/modules/services/emacs.nix index 1631275ba..382671515 100644 --- a/modules/services/emacs.nix +++ b/modules/services/emacs.nix @@ -80,6 +80,16 @@ in { socketActivation = { enable = mkEnableOption "systemd socket activation for the Emacs service"; }; + + defaultEditor = mkOption rec { + type = types.bool; + default = false; + example = !default; + description = '' + Whether to configure emacsclient as the default + editor using the EDITOR environment variable. + ''; + }; }; config = mkIf cfg.enable (mkMerge [ @@ -139,7 +149,16 @@ in { Install = { WantedBy = [ "default.target" ]; }; }; - home.packages = optional cfg.client.enable (hiPrio clientDesktopItem); + home = { + packages = optional cfg.client.enable (hiPrio clientDesktopItem); + + sessionVariables = mkIf cfg.defaultEditor { + EDITOR = getBin (pkgs.writeShellScript "editor" '' + exec ${ + getBin cfg.package + }/bin/emacsclient "''${@:---create-frame}"''); + }; + }; } (mkIf cfg.socketActivation.enable { diff --git a/tests/modules/services/emacs/default.nix b/tests/modules/services/emacs/default.nix index 86f68c4c8..47493207f 100644 --- a/tests/modules/services/emacs/default.nix +++ b/tests/modules/services/emacs/default.nix @@ -3,4 +3,5 @@ emacs-service-28 = ./emacs-service-28.nix; emacs-socket-27 = ./emacs-socket-27.nix; emacs-socket-28 = ./emacs-socket-28.nix; + emacs-default-editor = ./emacs-default-editor.nix; } diff --git a/tests/modules/services/emacs/emacs-default-editor.nix b/tests/modules/services/emacs/emacs-default-editor.nix new file mode 100644 index 000000000..77897a5b1 --- /dev/null +++ b/tests/modules/services/emacs/emacs-default-editor.nix @@ -0,0 +1,24 @@ +{ config, lib, pkgs, ... }: + +{ + nixpkgs.overlays = [ + (self: super: { + # Use `cat` instead of `echo` to prevent arguments from being + # interpreted as an option. + emacs = pkgs.writeShellScriptBin "emacsclient" + ''${pkgs.coreutils}/bin/cat <<< "$*"''; + }) + ]; + + services.emacs = { + defaultEditor = true; + enable = true; + }; + + nmt.script = "source ${ + pkgs.substituteAll { + inherit (pkgs) coreutils; + src = ./emacs-default-editor.sh; + } + }"; +} diff --git a/tests/modules/services/emacs/emacs-default-editor.sh b/tests/modules/services/emacs/emacs-default-editor.sh new file mode 100644 index 000000000..b1aafaac1 --- /dev/null +++ b/tests/modules/services/emacs/emacs-default-editor.sh @@ -0,0 +1,18 @@ +set +u +source $TESTED/home-path/etc/profile.d/hm-session-vars.sh +set -u + +check_arguments () { + if [ "$1" != "$2" ]; then + @coreutils@/bin/cat <<- EOF + Expected arguments: + $1 + but got: + $2 + EOF + exit 1 + fi +} + +check_arguments "--create-frame" "$($EDITOR)" +check_arguments "foo bar baz" "$($EDITOR foo bar baz)"