From b3ccd4bb262f4e6d3248b46cede92b90c4a42094 Mon Sep 17 00:00:00 2001 From: MrTipson Date: Fri, 16 Jan 2026 23:22:26 +0100 Subject: [PATCH] fish: source event handling functions on shell init Functions that contain event handler switches should be sourced during init, otherwise they become active only after being called manually. --- modules/programs/fish.nix | 17 ++++++++ tests/modules/programs/fish/default.nix | 1 + .../modules/programs/fish/source-handlers.nix | 42 +++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 tests/modules/programs/fish/source-handlers.nix diff --git a/modules/programs/fish.nix b/modules/programs/fish.nix index 57ada99c..0e5176bc 100644 --- a/modules/programs/fish.nix +++ b/modules/programs/fish.nix @@ -397,6 +397,20 @@ let echo "end" echo "setup_hm_session_vars") > $out/${sessionVarsFile} ''; + sourceHandlersStr = + let + handlerAttrs = [ + "onJobExit" + "onProcessExit" + "onVariable" + "onSignal" + "onEvent" + ]; + isHandler = name: def: isAttrs def && builtins.any (attr: builtins.hasAttr attr def) handlerAttrs; + handlerFunctions = lib.filterAttrs isHandler cfg.functions; + sourceFunction = name: def: "source ${config.xdg.configHome}/fish/functions/${name}.fish"; + in + builtins.concatStringsSep "\n" (lib.mapAttrsToList sourceFunction handlerFunctions); in { @@ -726,6 +740,9 @@ in source ${cfg.sessionVariablesPackage}/${sessionVarsFile} + # Source handler functions + ${sourceHandlersStr} + ${cfg.shellInit} status is-login; and begin diff --git a/tests/modules/programs/fish/default.nix b/tests/modules/programs/fish/default.nix index 1e7353a0..0b562fc1 100644 --- a/tests/modules/programs/fish/default.nix +++ b/tests/modules/programs/fish/default.nix @@ -4,6 +4,7 @@ fish-functions = ./functions.nix; fish-completions = ./completions.nix; fish-no-functions = ./no-functions.nix; + fish-source-handlers = ./source-handlers.nix; fish-plugins = ./plugins.nix; fish-manpage = ./manpage.nix; fish-binds = ./binds.nix; diff --git a/tests/modules/programs/fish/source-handlers.nix b/tests/modules/programs/fish/source-handlers.nix new file mode 100644 index 00000000..f9690214 --- /dev/null +++ b/tests/modules/programs/fish/source-handlers.nix @@ -0,0 +1,42 @@ +{ ... }: +{ + config = { + programs.fish = { + enable = true; + + functions = { + normal-function = ""; + event-handler = { + body = ""; + onEvent = "test"; + }; + variable-handler = { + body = ""; + onVariable = "test"; + }; + job-handler = { + body = ""; + onJobExit = "10"; + }; + signal-handler = { + body = ""; + onSignal = "10"; + }; + process-handler = { + body = ""; + onProcessExit = "10"; + }; + }; + }; + + nmt.script = '' + assertFileExists home-files/.config/fish/config.fish + assertFileContains home-files/.config/fish/config.fish "source /home/hm-user/.config/fish/functions/event-handler.fish" + assertFileContains home-files/.config/fish/config.fish "source /home/hm-user/.config/fish/functions/variable-handler.fish" + assertFileContains home-files/.config/fish/config.fish "source /home/hm-user/.config/fish/functions/job-handler.fish" + assertFileContains home-files/.config/fish/config.fish "source /home/hm-user/.config/fish/functions/signal-handler.fish" + assertFileContains home-files/.config/fish/config.fish "source /home/hm-user/.config/fish/functions/process-handler.fish" + assertFileNotRegex home-files/.config/fish/config.fish "source /home/hm-user/.config/fish/functions/normal-function.fish" + ''; + }; +}