From 5c54b182ab5ae07e98eee7d402d12060be745408 Mon Sep 17 00:00:00 2001 From: musjj <72612857+musjj@users.noreply.github.com> Date: Tue, 21 Oct 2025 20:42:53 +0700 Subject: [PATCH] zed-editor: option to generate immutable settings --- modules/programs/zed-editor.nix | 68 +++++++++++++++---- tests/modules/programs/zed-editor/default.nix | 4 ++ .../zed-editor/extensions-immutable.nix | 31 +++++++++ .../programs/zed-editor/keymap-immutable.nix | 48 +++++++++++++ .../zed-editor/settings-immutable.nix | 40 +++++++++++ .../programs/zed-editor/tasks-immutable.nix | 44 ++++++++++++ 6 files changed, 220 insertions(+), 15 deletions(-) create mode 100644 tests/modules/programs/zed-editor/extensions-immutable.nix create mode 100644 tests/modules/programs/zed-editor/keymap-immutable.nix create mode 100644 tests/modules/programs/zed-editor/settings-immutable.nix create mode 100644 tests/modules/programs/zed-editor/tasks-immutable.nix diff --git a/modules/programs/zed-editor.nix b/modules/programs/zed-editor.nix index be7ea5c0c..5b6fc4ff3 100644 --- a/modules/programs/zed-editor.nix +++ b/modules/programs/zed-editor.nix @@ -54,6 +54,33 @@ in description = "Extra packages available to Zed."; }; + mutableUserSettings = mkOption { + type = types.bool; + default = true; + example = false; + description = '' + Whether user settings (settings.json) can be updated by zed. + ''; + }; + + mutableUserKeymaps = mkOption { + type = types.bool; + default = true; + example = false; + description = '' + Whether user keymaps (keymap.json) can be updated by zed. + ''; + }; + + mutableUserTasks = mkOption { + type = types.bool; + default = true; + example = false; + description = '' + Whether user tasks (tasks.json) can be updated by zed. + ''; + }; + userSettings = mkOption { type = jsonFormat.type; default = { }; @@ -191,14 +218,14 @@ in ); home.activation = mkMerge [ - (mkIf (mergedSettings != { }) { + (mkIf (cfg.mutableUserSettings && mergedSettings != { }) { zedSettingsActivation = lib.hm.dag.entryAfter [ "linkGeneration" ] ( impureConfigMerger "{}" "$dynamic * $static" "${config.xdg.configHome}/zed/settings.json" ( jsonFormat.generate "zed-user-settings" mergedSettings ) ); }) - (mkIf (cfg.userKeymaps != [ ]) { + (mkIf (cfg.mutableUserKeymaps && cfg.userKeymaps != [ ]) { zedKeymapActivation = lib.hm.dag.entryAfter [ "linkGeneration" ] ( impureConfigMerger "[]" "$dynamic + $static | group_by(.context) | map(reduce .[] as $item ({}; . * $item))" @@ -206,7 +233,7 @@ in (jsonFormat.generate "zed-user-keymaps" cfg.userKeymaps) ); }) - (mkIf (cfg.userTasks != [ ]) { + (mkIf (cfg.mutableUserTasks && cfg.userTasks != [ ]) { zedTasksActivation = lib.hm.dag.entryAfter [ "linkGeneration" ] ( impureConfigMerger "[]" "$dynamic + $static | group_by(.label) | map(reduce .[] as $item ({}; . * $item))" @@ -216,18 +243,29 @@ in }) ]; - xdg.configFile = lib.mapAttrs' ( - n: v: - lib.nameValuePair "zed/themes/${n}.json" { - source = - if lib.isString v then - pkgs.writeText "zed-theme-${n}" v - else if builtins.isPath v || lib.isStorePath v then - v - else - jsonFormat.generate "zed-theme-${n}" v; - } - ) cfg.themes; + xdg.configFile = mkMerge [ + (lib.mapAttrs' ( + n: v: + lib.nameValuePair "zed/themes/${n}.json" { + source = + if lib.isString v then + pkgs.writeText "zed-theme-${n}" v + else if builtins.isPath v || lib.isStorePath v then + v + else + jsonFormat.generate "zed-theme-${n}" v; + } + ) cfg.themes) + (mkIf (!cfg.mutableUserSettings && mergedSettings != { }) { + "zed/settings.json".source = jsonFormat.generate "zed-user-settings" mergedSettings; + }) + (mkIf (!cfg.mutableUserKeymaps && cfg.userKeymaps != { }) { + "zed/keymap.json".source = jsonFormat.generate "zed-user-keymaps" cfg.userKeymaps; + }) + (mkIf (!cfg.mutableUserTasks && cfg.userTasks != [ ]) { + "zed/tasks.json".source = jsonFormat.generate "zed-user-tasks" cfg.userTasks; + }) + ]; assertions = [ { diff --git a/tests/modules/programs/zed-editor/default.nix b/tests/modules/programs/zed-editor/default.nix index 93869021f..1029dba99 100644 --- a/tests/modules/programs/zed-editor/default.nix +++ b/tests/modules/programs/zed-editor/default.nix @@ -1,11 +1,15 @@ { zed-extensions = ./extensions.nix; + zed-extensions-immutable = ./extensions-immutable.nix; zed-install-remote-server = ./install-remote-server.nix; zed-keymap = ./keymap.nix; + zed-keymap-immutable = ./keymap-immutable.nix; zed-keymap-empty = ./keymap-empty.nix; zed-settings = ./settings.nix; + zed-settings-immutable = ./settings-immutable.nix; zed-settings-empty = ./settings-empty.nix; zed-tasks = ./tasks.nix; + zed-tasks-immutable = ./tasks-immutable.nix; zed-tasks-empty = ./tasks-empty.nix; zed-themes = ./themes; } diff --git a/tests/modules/programs/zed-editor/extensions-immutable.nix b/tests/modules/programs/zed-editor/extensions-immutable.nix new file mode 100644 index 000000000..117c56d22 --- /dev/null +++ b/tests/modules/programs/zed-editor/extensions-immutable.nix @@ -0,0 +1,31 @@ +{ config, ... }: + +{ + programs.zed-editor = { + enable = true; + package = config.lib.test.mkStubPackage { }; + mutableUserSettings = false; + extensions = [ + "swift" + "html" + "xy-zed" + ]; + }; + + nmt.script = + let + expectedContent = builtins.toFile "expected.json" '' + { + "auto_install_extensions": { + "html": true, + "swift": true, + "xy-zed": true + } + } + ''; + in + '' + assertFileExists "home-files/.config/zed/settings.json" + assertFileContent "home-files/.config/zed/settings.json" "${expectedContent}" + ''; +} diff --git a/tests/modules/programs/zed-editor/keymap-immutable.nix b/tests/modules/programs/zed-editor/keymap-immutable.nix new file mode 100644 index 000000000..7e1b9696b --- /dev/null +++ b/tests/modules/programs/zed-editor/keymap-immutable.nix @@ -0,0 +1,48 @@ +# Test custom keymap functionality +{ config, ... }: + +{ + programs.zed-editor = { + enable = true; + package = config.lib.test.mkStubPackage { }; + mutableUserKeymaps = false; + userKeymaps = [ + { + bindings = { + up = "menu::SelectPrev"; + }; + } + { + context = "Editor"; + bindings = { + escape = "editor::Cancel"; + }; + } + ]; + }; + + nmt.script = + let + expectedContent = builtins.toFile "expected.json" '' + [ + { + "bindings": { + "up": "menu::SelectPrev" + } + }, + { + "bindings": { + "escape": "editor::Cancel" + }, + "context": "Editor" + } + ] + ''; + + keymapPath = ".config/zed/keymap.json"; + in + '' + assertFileExists "home-files/${keymapPath}" + assertFileContent "home-files/${keymapPath}" "${expectedContent}" + ''; +} diff --git a/tests/modules/programs/zed-editor/settings-immutable.nix b/tests/modules/programs/zed-editor/settings-immutable.nix new file mode 100644 index 000000000..26cf2110d --- /dev/null +++ b/tests/modules/programs/zed-editor/settings-immutable.nix @@ -0,0 +1,40 @@ +# Test custom keymap functionality +{ config, ... }: + +{ + programs.zed-editor = { + enable = true; + package = config.lib.test.mkStubPackage { }; + mutableUserSettings = false; + userSettings = { + theme = "XY-Zed"; + features = { + copilot = false; + }; + vim_mode = false; + ui_font_size = 16; + buffer_font_size = 16; + }; + }; + + nmt.script = + let + expectedContent = builtins.toFile "expected.json" '' + { + "buffer_font_size": 16, + "features": { + "copilot": false + }, + "theme": "XY-Zed", + "ui_font_size": 16, + "vim_mode": false + } + ''; + + settingsPath = ".config/zed/settings.json"; + in + '' + assertFileExists "home-files/${settingsPath}" + assertFileContent "home-files/${settingsPath}" "${expectedContent}" + ''; +} diff --git a/tests/modules/programs/zed-editor/tasks-immutable.nix b/tests/modules/programs/zed-editor/tasks-immutable.nix new file mode 100644 index 000000000..c47c37be1 --- /dev/null +++ b/tests/modules/programs/zed-editor/tasks-immutable.nix @@ -0,0 +1,44 @@ +# Test custom keymap functionality +{ config, ... }: + +{ + programs.zed-editor = { + enable = true; + package = config.lib.test.mkStubPackage { }; + mutableUserTasks = false; + userTasks = [ + { + label = "Format Code"; + command = "nix"; + args = [ + "fmt" + "$ZED_WORKTREE_ROOT" + ]; + allow_concurrent_runs = false; + } + ]; + }; + + nmt.script = + let + expectedContent = builtins.toFile "expected.json" '' + [ + { + "allow_concurrent_runs": false, + "args": [ + "fmt", + "$ZED_WORKTREE_ROOT" + ], + "command": "nix", + "label": "Format Code" + } + ] + ''; + + settingsPath = ".config/zed/tasks.json"; + in + '' + assertFileExists "home-files/${settingsPath}" + assertFileContent "home-files/${settingsPath}" "${expectedContent}" + ''; +}