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}"'' ''"${v}"''
else if builtins.isList v then else if builtins.isList v then
"(${lib.concatStringsSep " " (map toZshValue v)})" "(${lib.concatStringsSep " " (map toZshValue v)})"
else if builtins.isAttrs v then
"(${
lib.concatStringsSep " "
(lib.mapAttrsToList (n: v: "[${lib.escapeShellArg n}]=${toZshValue v}")
v)
})"
else else
''"${toString v}"''; ''"${toString v}"'';
# Produces a Zsh shell like definition statement # 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 # Given an attribute set containing shell variable names and their
# assignments, this function produces a string containing a definition # assignments, this function produces a string containing a definition

View file

@ -501,7 +501,10 @@ in
localVariables = mkOption { localVariables = mkOption {
type = types.attrs; type = types.attrs;
default = {}; 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 = '' description = ''
Extra local variables defined at the top of {file}`.zshrc`. Extra local variables defined at the top of {file}`.zshrc`.
''; '';

View file

@ -12,7 +12,13 @@ with lib;
V2 = false; V2 = false;
V3 = "some-string"; V3 = "some-string";
V4 = 42; 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 = '' nmt.script = ''
assertFileExists home-files/.zshrc assertFileExists home-files/.zshrc
assertFileContains home-files/.zshrc 'V1=true' assertFileRegex home-files/.zshrc '^V1=true$'
assertFileContains home-files/.zshrc 'V2=false' assertFileRegex home-files/.zshrc '^V2=false$'
assertFileContains home-files/.zshrc 'V3="some-string"' assertFileRegex home-files/.zshrc '^V3="some-string"$'
assertFileContains home-files/.zshrc 'V4="42"' assertFileRegex home-files/.zshrc '^V4="42"$'
assertFileContains home-files/.zshrc 'V5=(true false "some-string" "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")''
}
'';
}; };
} }