zsh: support attrsets as associative arrays in programs.zsh.localVariables

This commit is contained in:
Giel van Schijndel 2024-04-12 14:14:03 +02:00
parent 8db990e559
commit c67b06ff92
No known key found for this signature in database
GPG Key ID: 3E52E1D396DFB43B
3 changed files with 31 additions and 9 deletions

View File

@ -9,11 +9,20 @@ rec {
''"${v}"''
else if builtins.isList v then
"(${lib.concatStringsSep " " (map toZshValue v)})"
else if builtins.isAttrs v then
"(${
lib.concatStringsSep " "
(lib.mapAttrsToList (n: v: "[${lib.escapeShellArg n}]=${toZshValue v}")
v)
})"
else
''"${toString v}"'';
# Produces a Zsh shell like definition statement
define = n: v: "${n}=${toZshValue v}";
define = n: v:
"${lib.optionalString (builtins.isAttrs v) "typeset -A "}${n}=${
toZshValue v
}";
# Given an attribute set containing shell variable names and their
# assignments, this function produces a string containing a definition

View File

@ -501,7 +501,10 @@ in
localVariables = mkOption {
type = types.attrs;
default = {};
example = { POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=["dir" "vcs"]; };
example = {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=["dir" "vcs"];
ZSH_HIGHLIGHT_STYLES={unknown-token="bg=red,fg=white,bold";};
};
description = ''
Extra local variables defined at the top of {file}`.zshrc`.
'';

View File

@ -12,7 +12,13 @@ with lib;
V2 = false;
V3 = "some-string";
V4 = 42;
V5 = [ V1 V2 V3 V4 ];
V5 = builtins.attrValues V6;
V6 = {
a = V1;
b = V2;
c = V3;
d = V4;
};
};
};
@ -20,11 +26,15 @@ with lib;
nmt.script = ''
assertFileExists home-files/.zshrc
assertFileContains home-files/.zshrc 'V1=true'
assertFileContains home-files/.zshrc 'V2=false'
assertFileContains home-files/.zshrc 'V3="some-string"'
assertFileContains home-files/.zshrc 'V4="42"'
assertFileContains home-files/.zshrc 'V5=(true false "some-string" "42")'
'';
assertFileRegex home-files/.zshrc '^V1=true$'
assertFileRegex home-files/.zshrc '^V2=false$'
assertFileRegex home-files/.zshrc '^V3="some-string"$'
assertFileRegex home-files/.zshrc '^V4="42"$'
assertFileRegex home-files/.zshrc '^V5=[(]true false "some-string" "42"[)]$'
assertFileContains home-files/.zshrc ${
lib.escapeShellArg ''
typeset -A V6=(['a']=true ['b']=false ['c']="some-string" ['d']="42")''
}
'';
};
}