2.3 KiB
Default value priority in listOf
and attrsOf
options
When defining options of type listOf
and attrsOf
, you should pay close
attention to how the default value is defined.
Default values that should be extended
In most cases, you want user configuration to "extend" your default value, in
this case, your "default" value should be defined using normal priority, i.e. in
a config
block:
{lib, ...}: let
inherit (lib.types) listOf str;
inherit (lib.options) literalExpression;
in {
options = {
vim.telescope.setupOpts.file_ignore_patterns = mkOption {
type = listOf str;
# provide a useful defaultText so users are aware of defaults
defaultText = literalExpression ''
["node_modules" "%.git/" "dist/" "build/" "target/" "result/"];
'';
};
};
}
This way, when users specify:
config.vim.telescope.setupOpts.file_ignore_patterns = [".vscode/"];
The final value is
["node_modules" "%.git/" "dist/" "build/" "target/" "result/" ".vscode/"]
.
::: {.note}
Users can still get rid of the default value by assigning a mkForce
value to
the option:
{lib, ...}: {
config.vim.telescope.setupOpts.file_ignore_patterns = lib.mkForce [];
}
:::
Default values that should be overridden
In some cases, it makes sense to let any user value "override" your default, in
these cases, you should assign default values using default priority, i.e. using
the default
key of mkOption
:
{lib, ...}: let
inherit (lib.types) listOf str;
inherit (lib.options) mkOption;
in {
vim.telescope.setupOpts.pickers.find_files.find_command = mkOption {
description = "cmd to use for finding files";
type = listOf str;
default = ["${pkgs.fd}/bin/fd" "--type=file"];
}
}
This way, when users specify:
{
config.vim.telescope.setupOpts.pickers.find_files.find_command = [
"fd"
"--type=file"
"--some-other-option"
];
}
The final value of the option is ["fd" "--type=file" "--some-other-option"]
.
Users can still choose to "extend" our default value by using mkDefault
,
possibly with mkAfter
/mkBefore
:
{lib, ...}: {
config.vim.telescope.setupOpts.pickers.find_files.find_command =
lib.mkDefault (lib.mkBefore ["--max-depth=10"]);
}