From 938ecd797f17b5baa408f7a0af01747a81e4bed6 Mon Sep 17 00:00:00 2001 From: Austin Horstman Date: Mon, 28 Jul 2025 09:35:21 -0500 Subject: [PATCH] zsh: fix lib function for env var path parsing Allow env variables to be used and avoid mangling path. Signed-off-by: Austin Horstman --- modules/programs/zsh/history.nix | 4 ++-- modules/programs/zsh/lib.nix | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/modules/programs/zsh/history.nix b/modules/programs/zsh/history.nix index d32d5da6..3c47d2e9 100644 --- a/modules/programs/zsh/history.nix +++ b/modules/programs/zsh/history.nix @@ -9,7 +9,7 @@ let inherit (lib) literalExpression mkOption types; - inherit (import ./lib.nix { inherit config lib; }) dotDirAbs mkAbsPathStr; + inherit (import ./lib.nix { inherit config lib; }) dotDirAbs mkShellVarPathStr; in { options = @@ -180,7 +180,7 @@ in ${lib.optionalString ( cfg.history.ignorePatterns != [ ] ) "HISTORY_IGNORE=${lib.escapeShellArg "(${lib.concatStringsSep "|" cfg.history.ignorePatterns})"}"} - HISTFILE="${mkAbsPathStr cfg.history.path}" + HISTFILE="${mkShellVarPathStr cfg.history.path}" mkdir -p "$(dirname "$HISTFILE")" setopt HIST_FCNTL_LOCK diff --git a/modules/programs/zsh/lib.nix b/modules/programs/zsh/lib.nix index 96525f85..bfb896f0 100644 --- a/modules/programs/zsh/lib.nix +++ b/modules/programs/zsh/lib.nix @@ -33,6 +33,20 @@ rec { mkAbsPathStr = pathStr: cleanPathStr ((lib.optionalString (!lib.hasPrefix "/" pathStr) "${homeDir}/") + pathStr); + # For shell variable paths like history.path that get expanded at runtime + mkShellVarPathStr = + pathStr: + let + cleanPath = lib.removeSuffix "/" pathStr; + hasShellVars = lib.hasInfix "$" cleanPath; + in + if hasShellVars then + # Does not escape shell variables, allowing them to be expanded at runtime + cleanPath + else + # For literal paths, make them absolute if needed and escape them + cleanPathStr ((lib.optionalString (!lib.hasPrefix "/" cleanPath) "${homeDir}/") + cleanPath); + dotDirAbs = mkAbsPathStr cfg.dotDir; dotDirRel = mkRelPathStr cfg.dotDir;