From ab9a7c16003b245f0f0076aaf0480b525ad5f94b Mon Sep 17 00:00:00 2001 From: raf Date: Sat, 28 Sep 2024 18:28:17 +0000 Subject: [PATCH] modules/wrapper: add `vim.options` (#386) * wrapper/rc: add `vim.options` Translates an attribute set of values into `vim.o` values in a key-value format. * docs: document addition of optionsScript * wrapper/rc: don't filter null values in {options,global}Script * wrapper/rc: add examples to vim.options & vim.globals; wording --- docs/manual/configuring/dag-entries.md | 17 +++++++++------ modules/wrapper/rc/config.nix | 14 +++++++----- modules/wrapper/rc/options.nix | 30 ++++++++++++++++++++++---- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/docs/manual/configuring/dag-entries.md b/docs/manual/configuring/dag-entries.md index d5afa9b..402cde6 100644 --- a/docs/manual/configuring/dag-entries.md +++ b/docs/manual/configuring/dag-entries.md @@ -5,16 +5,19 @@ can add code that relies on other code. However, if you don't know what the entries are called, it's hard to do that, so here is a list of the internal entries in nvf: -`vim.luaConfigRC` (top-level DAG): +## `vim.luaConfigRC` (top-level DAG) {#ch-vim-luaconfigrc} 1. (`luaConfigPre`) - not a part of the actual DAG, instead, it's simply inserted before the rest of the DAG 2. `globalsScript` - used to set globals defined in `vim.globals` 3. `basic` - used to set basic configuration options -4. `theme` (this is simply placed before `pluginConfigs`, meaning that surrounding entries don't depend on it) - used to set up the theme, which has to be done before other plugins -5. `pluginConfigs` - the result of the nested `vim.pluginRC` (internal option, - see the [Custom Plugins](/index.xhtml#ch-custom-plugins) page for adding your own - plugins) DAG, used to set up internal plugins -6. `extraPluginConfigs` - the result of `vim.extraPlugins`, which is not a +4. `optionsScript` - used to set options defined in `vim.o` +5. `theme` (this is simply placed before `pluginConfigs`, meaning that + surrounding entries don't depend on it) - used to set up the theme, which has + to be done before other plugins +6. `pluginConfigs` - the result of the nested `vim.pluginRC` (internal option, + see the [Custom Plugins](/index.xhtml#ch-custom-plugins) page for adding your + own plugins) DAG, used to set up internal plugins +7. `extraPluginConfigs` - the result of `vim.extraPlugins`, which is not a direct DAG, but is converted to, and resolved as one internally -7. `mappings` - the result of `vim.maps` +8. `mappings` - the result of `vim.maps` diff --git a/modules/wrapper/rc/config.nix b/modules/wrapper/rc/config.nix index 8ebf1c2..193be3f 100644 --- a/modules/wrapper/rc/config.nix +++ b/modules/wrapper/rc/config.nix @@ -80,10 +80,11 @@ maps); in { config = let - filterNonNull = attrs: filterAttrs (_: value: value != null) attrs; globalsScript = - mapAttrsToList (name: value: "vim.g.${name} = ${toLuaObject value}") - (filterNonNull cfg.globals); + mapAttrsToList (name: value: "vim.g.${name} = ${toLuaObject value}") cfg.globals; + + optionsScript = + mapAttrsToList (name: value: "vim.o.${name} = ${toLuaObject value}") cfg.options; extraPluginConfigs = resolveDag { name = "extra plugin configs"; @@ -132,9 +133,12 @@ in { in { vim = { luaConfigRC = { + # `vim.g` and `vim.o` globalsScript = entryAnywhere (concatLines globalsScript); - # basic - pluginConfigs = entryAfter ["basic"] pluginConfigs; + optionsScript = entryAfter ["basic"] (concatLines optionsScript); + + # Basic + pluginConfigs = entryAfter ["optionsScript"] pluginConfigs; extraPluginConfigs = entryAfter ["pluginConfigs"] extraPluginConfigs; mappings = entryAfter ["extraPluginConfigs"] mappings; }; diff --git a/modules/wrapper/rc/options.nix b/modules/wrapper/rc/options.nix index 4165da6..70ab2a8 100644 --- a/modules/wrapper/rc/options.nix +++ b/modules/wrapper/rc/options.nix @@ -129,16 +129,38 @@ in { globals = mkOption { type = attrs; default = {}; + example = {"some_variable" = 42;}; description = '' An attribute set containing global variable values for storing vim variables as early as possible. If populated, this option will set vim variables in the built luaConfigRC as the first item. - E.g. {foo = "bar"} will set `vim.g.foo` to "bar" where - the type of `bar` in the resulting vimscript will be - infered from the type of the value in the `{name = value}` - pair. + ::: {.note} + `{foo = "bar";}` will set `vim.g.foo` to "bar", where + the type of `bar` in the resulting Lua value will be + inferred from the type of the value in the `{name = value;}` + pair passed to the option. + ::: + ''; + }; + + options = mkOption { + type = attrs; + default = {}; + example = {visualbell = true;}; + description = '' + An attribute set containing vim options to be set + as early as possible. If populated, this option will + set vim options in the built luaConfigRC after `basic` + and before `pluginConfigs` DAG entries. + + ::: {.note} + `{foo = "bar";}` will set `vim.o.foo` to "bar", where + the type of `bar` in the resulting Lua value will be + inferred from the type of the value in the`{name = value;}` + pair passed to the option. + ::: ''; };