在 Nix 中,如何重构此配置?
In Nix, how can I refactor this configuration?
所以我正在使用 NixOS 中的 home-manager 来管理我的点文件。我的一个点文件中有如下内容:
my_color0 = ${xrdb:color0}
my_color1 = ${xrdb:color1}
my_color2 = ${xrdb:color2}
my_color3 = ${xrdb:color3}
my_color4 = ${xrdb:color4}
my_color5 = ${xrdb:color5}
my_color6 = ${xrdb:color6}
my_color7 = ${xrdb:color7}
my_color8 = ${xrdb:color8}
my_color9 = ${xrdb:color9}
my_color10 = ${xrdb:color10}
my_color11 = ${xrdb:color11}
my_color12 = ${xrdb:color12}
my_color13 = ${xrdb:color13}
my_color14 = ${xrdb:color14}
my_color15 = ${xrdb:color15}
既然 Nix 是功能性的,我想一定有一种简单的方法可以让它更干。我似乎找不到与 Python 的 range(0, 16)
等效的函数。我想有一种方法可以映射某种模板。
可以做到。 Nixpkgs 中的 lib
属性有许多功能,有时会派上用场。
我有点担心你的例子,因为在我看来,将其重写为算法并没有提供任何价值。我假设这样的解决方案确实为您的实际问题提供了价值。
这里有一点nix repl
session的解决方法:
~ $ nix repl '<nixpkgs>'
Welcome to Nix version 2.0.4. Type :? for help.
Loading '<nixpkgs>'...
Added 8623 variables.
nix-repl> :p lib.concatMapStringsSep "\n" (i: "my_color${toString i} = ${xrdb:color${toString i}}") (lib.range 0 15)
"my_color0 = ${xrdb:color0}\nmy_color1 = ${xrdb:color1}\nmy_color2 = ${xrdb:color2}\nmy_color3 = ${xrdb:color3}\nmy_color4 = ${xrdb:color4}\nmy_color5 = ${xrdb:color5}\nmy_color6 = ${xrdb:color6}\nmy_color7 = ${xrdb:color7}\nmy_color8 = ${xrdb:color8}\nmy_color9 = ${xrdb:color9}\nmy_color10 = ${xrdb:color10}\nmy_color11 = ${xrdb:color11}\nmy_color12 = ${xrdb:color12}\nmy_color13 = ${xrdb:color13}\nmy_color14 = ${xrdb:color14}\nmy_color15 = ${xrdb:color15}"
'<nixpkgs>'
参数从 NIX_PATH
中的 nixpkgs
加载所有属性。
:p
命令使值的打印变得不那么懒惰,但在这里并不是真正必要的,因为不能部分评估字符串。当你处理属性集时,你可能想使用 :p
.
其他有用的函数包括 lib.concatStringsSep
和 map
。
所以我正在使用 NixOS 中的 home-manager 来管理我的点文件。我的一个点文件中有如下内容:
my_color0 = ${xrdb:color0}
my_color1 = ${xrdb:color1}
my_color2 = ${xrdb:color2}
my_color3 = ${xrdb:color3}
my_color4 = ${xrdb:color4}
my_color5 = ${xrdb:color5}
my_color6 = ${xrdb:color6}
my_color7 = ${xrdb:color7}
my_color8 = ${xrdb:color8}
my_color9 = ${xrdb:color9}
my_color10 = ${xrdb:color10}
my_color11 = ${xrdb:color11}
my_color12 = ${xrdb:color12}
my_color13 = ${xrdb:color13}
my_color14 = ${xrdb:color14}
my_color15 = ${xrdb:color15}
既然 Nix 是功能性的,我想一定有一种简单的方法可以让它更干。我似乎找不到与 Python 的 range(0, 16)
等效的函数。我想有一种方法可以映射某种模板。
可以做到。 Nixpkgs 中的 lib
属性有许多功能,有时会派上用场。
我有点担心你的例子,因为在我看来,将其重写为算法并没有提供任何价值。我假设这样的解决方案确实为您的实际问题提供了价值。
这里有一点nix repl
session的解决方法:
~ $ nix repl '<nixpkgs>'
Welcome to Nix version 2.0.4. Type :? for help.
Loading '<nixpkgs>'...
Added 8623 variables.
nix-repl> :p lib.concatMapStringsSep "\n" (i: "my_color${toString i} = ${xrdb:color${toString i}}") (lib.range 0 15)
"my_color0 = ${xrdb:color0}\nmy_color1 = ${xrdb:color1}\nmy_color2 = ${xrdb:color2}\nmy_color3 = ${xrdb:color3}\nmy_color4 = ${xrdb:color4}\nmy_color5 = ${xrdb:color5}\nmy_color6 = ${xrdb:color6}\nmy_color7 = ${xrdb:color7}\nmy_color8 = ${xrdb:color8}\nmy_color9 = ${xrdb:color9}\nmy_color10 = ${xrdb:color10}\nmy_color11 = ${xrdb:color11}\nmy_color12 = ${xrdb:color12}\nmy_color13 = ${xrdb:color13}\nmy_color14 = ${xrdb:color14}\nmy_color15 = ${xrdb:color15}"
'<nixpkgs>'
参数从 NIX_PATH
中的 nixpkgs
加载所有属性。
:p
命令使值的打印变得不那么懒惰,但在这里并不是真正必要的,因为不能部分评估字符串。当你处理属性集时,你可能想使用 :p
.
其他有用的函数包括 lib.concatStringsSep
和 map
。