From f2d1964b10f1d86683d2ee5fe465bd6dcfb8fa19 Mon Sep 17 00:00:00 2001 From: Dietrich Daroch Date: Wed, 13 Nov 2024 02:55:06 -0700 Subject: [PATCH] zellij: Add extraConfig This allows working around [#4659](https://github.com/nix-community/home-manager/issues/4659) While fixing `toKDL` might be fun, I just don't think it's a good use of anyone's time. --- This is still untested. --- modules/programs/zellij.nix | 43 +++++++++++++++++++++-- tests/modules/programs/zellij/config.nix | 33 +++++++++++++++++ tests/modules/programs/zellij/default.nix | 5 ++- 3 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 tests/modules/programs/zellij/config.nix diff --git a/modules/programs/zellij.nix b/modules/programs/zellij.nix index 0906a028d..f5885d327 100644 --- a/modules/programs/zellij.nix +++ b/modules/programs/zellij.nix @@ -34,12 +34,44 @@ in { ''; description = '' Configuration written to - {file}`$XDG_CONFIG_HOME/zellij/config.yaml`. + {file}`$XDG_CONFIG_HOME/zellij/config.kdl`. See for the full list of options. ''; }; + extraConfig = lib.mkOption { + description = '' + Extra configuration lines to add to `$XDG_CONFIG_HOME/zellij/config.kdl`. + + This does not support zellij.yaml and it's mostly a workaround for https://github.com/nix-community/home-manager/issues/4659. + ''; + type = lib.types.lines; + default = ""; + example = '' + keybinds { + // keybinds are divided into modes + normal { + // bind instructions can include one or more keys (both keys will be bound separately) + // bind keys can include one or more actions (all actions will be performed with no sequential guarantees) + bind "Ctrl g" { SwitchToMode "locked"; } + bind "Ctrl p" { SwitchToMode "pane"; } + bind "Alt n" { NewPane; } + bind "Alt h" "Alt Left" { MoveFocusOrTab "Left"; } + } + pane { + bind "h" "Left" { MoveFocus "Left"; } + bind "l" "Right" { MoveFocus "Right"; } + bind "j" "Down" { MoveFocus "Down"; } + bind "k" "Up" { MoveFocus "Up"; } + bind "p" { SwitchFocus; } + } + locked { + bind "Ctrl g" { SwitchToMode "normal"; } + } + } + ''; + }; enableBashIntegration = mkEnableOption "Bash integration" // { default = false; @@ -61,12 +93,17 @@ in { # https://github.com/zellij-org/zellij/releases/tag/v0.32.0 xdg.configFile."zellij/config.yaml" = mkIf (cfg.settings != { } && (versionOlder cfg.package.version "0.32.0")) { - source = yamlFormat.generate "zellij.yaml" cfg.settings; + source = (yamlFormat.generate "zellij.yaml" cfg.settings); }; xdg.configFile."zellij/config.kdl" = mkIf (cfg.settings != { } && (versionAtLeast cfg.package.version "0.32.0")) { - text = lib.hm.generators.toKDL { } cfg.settings; + text = (lib.hm.generators.toKDL { } cfg.settings) + + lib.optionalString (cfg.extraConfig != "") ('' + + // extraConfig + + '' + cfg.extraConfig); }; programs.bash.initExtra = mkIf cfg.enableBashIntegration (mkOrder 200 '' diff --git a/tests/modules/programs/zellij/config.nix b/tests/modules/programs/zellij/config.nix new file mode 100644 index 000000000..81840ae36 --- /dev/null +++ b/tests/modules/programs/zellij/config.nix @@ -0,0 +1,33 @@ +{ lib, ... }: + +{ + programs = { + zellij = { + enable = true; + + settings = { default_layout = "welcome"; }; + extraConfig = '' + This_could_have_been_json { + } + ''; + }; + }; + + test.stubs = { zellij = { }; }; + + nmt.script = '' + assertFileExists home-files/.config/zellij/config.kdl + + assertFileContains \ + home-files/.config/zellij/config.kdl \ + 'default_layout "welcome"' + + assertFileContains \ + home-files/.config/zellij/config.kdl \ + '// extraConfig' + + assertFileContains \ + home-files/.config/zellij/config.kdl \ + 'This_could_have_been_json' + ''; +} diff --git a/tests/modules/programs/zellij/default.nix b/tests/modules/programs/zellij/default.nix index f4b521386..f5c025a5f 100644 --- a/tests/modules/programs/zellij/default.nix +++ b/tests/modules/programs/zellij/default.nix @@ -1 +1,4 @@ -{ zellij-enable-shells = ./enable-shells.nix; } +{ + zellij-config = ./config.nix; + zellij-enable-shells = ./enable-shells.nix; +}