Compare commits

...

34 commits

Author SHA1 Message Date
Ching Pei Yang
43e6e673af add TODO 2024-08-15 15:53:45 +02:00
Ching Pei Yang
1b82b13dc7 lib: allow luaInline in lz.n map action 2024-08-15 15:53:45 +02:00
Ching Pei Yang
f5850432a8 flake: update lzn-auto-require 2024-08-15 15:53:45 +02:00
Ching Pei Yang
f672689023 fixup! wrapper: use lzn-auto-require loader 2024-08-15 15:53:45 +02:00
Ching Pei Yang
669088244d lib: add mkSetLuaBinding 2024-08-15 15:53:45 +02:00
Ching Pei Yang
769e07e7cc wrapper: use lzn-auto-require loader 2024-08-15 15:53:45 +02:00
Ching Pei Yang
0b9f69a20f flake: add plugin lzn-auto-require 2024-08-15 15:52:34 +02:00
Ching Pei Yang
9dd2a11e4d lz.n: generate less code 2024-08-15 15:52:34 +02:00
Ching Pei Yang
09e83a6cec lz.n: wrap lua code in function 2024-08-15 15:52:34 +02:00
Ching Pei Yang
c027a87527 lib: add mkLznBinding 2024-08-15 15:52:34 +02:00
Ching Pei Yang
abd76db843 nvim-tree: load nvim-tree if openOnSetup 2024-08-15 15:52:34 +02:00
Ching Pei Yang
85c0839105 nvim-tree: move to lz.n keymaps 2024-08-15 15:52:34 +02:00
Ching Pei Yang
6fc691a7c3 lib: add mkLznBinding 2024-08-15 15:52:34 +02:00
Ching Pei Yang
14bc100a5e lib: change lz.n spec "inlineLua" types to str 2024-08-15 15:50:16 +02:00
Ching Pei Yang
290de58ae9 lz.n: missing type check 2024-08-15 15:50:16 +02:00
Ching Pei Yang
1ee0a513cc lib: add lznKeySpec example 2024-08-15 15:50:16 +02:00
Ching Pei Yang
346f536737 lz.n: process key maps 2024-08-15 15:50:16 +02:00
Ching Pei Yang
ee5a157894 remove unused 2024-08-15 15:50:16 +02:00
Pei Yang Ching
805dd05b39 lib: fix lz.n map type 2024-08-15 15:50:16 +02:00
Ching Pei Yang
d3e39d10b0 lib: add lz.n KeySpec 2024-08-15 15:50:16 +02:00
Pei Yang Ching
14061c6db5 nvim-tree: use lazy 2024-08-15 15:50:16 +02:00
Pei Yang Ching
5c105b8182 lazy: add setupOpts support 2024-08-15 15:50:16 +02:00
Pei Yang Ching
b10c525ffe fix: broken optPlugins 2024-08-15 15:50:16 +02:00
Pei Yang Ching
9b4332ed77 switch to other hacky array-table syntax 2024-08-15 15:50:16 +02:00
Pei Yang Ching
f632fa1a92 wrap lazy init code in function 2024-08-15 15:50:16 +02:00
Ching Pei Yang
0faf4b923b flake: update lz.n 2024-08-15 15:50:16 +02:00
Ching Pei Yang
205582135d lib: add lznPluginTableType 2024-08-15 15:50:16 +02:00
Ching Pei Yang
1988203073 lib: export lznPluginType 2024-08-15 15:50:16 +02:00
Ching Pei Yang
d1d91ff8a5 lz.n: load lz.n 2024-08-15 15:50:16 +02:00
Ching Pei Yang
b552b33077 lz.n: add basic lazy.plugins option 2024-08-15 15:50:16 +02:00
Pei Yang Ching
920e0bad5e lib: add basic lz.n plugin spec type 2024-08-15 15:50:16 +02:00
Pei Yang Ching
f3ce59ed40 add lazy module skeleton 2024-08-15 15:50:16 +02:00
Pei Yang Ching
50efc3b557 flake: add lz.n plugin 2024-08-15 15:50:16 +02:00
Ching Pei Yang
2fc7dc798b
Re-add old maps API (#356)
* wrapper: fix wrong import source

* wrapper: fix typo

* Revert "lib/binds: improve code, adjust functions to new api"

This reverts commit 6cb57e1d26.

* mappings: re-add legacy vim.maps API

* mappings: fix wrong submodule syntax

* docs: fix missing section id
2024-08-13 00:27:05 +02:00
14 changed files with 505 additions and 105 deletions

View file

@ -4,7 +4,7 @@ Release notes for release 0.7
## Breaking Changes and Migration Guide {#sec-breaking-changes-and-migration-guide-0-7} ## Breaking Changes and Migration Guide {#sec-breaking-changes-and-migration-guide-0-7}
### `vim.configRC` removed ### `vim.configRC` removed {#sec-vim-configrc-removed}
In v0.7 we are removing `vim.configRC` in favor of making `vim.luaConfigRC` the In v0.7 we are removing `vim.configRC` in favor of making `vim.luaConfigRC` the
top-level DAG, and thereby making the entire configuration Lua based. This top-level DAG, and thereby making the entire configuration Lua based. This
@ -26,7 +26,7 @@ making good use of its extensive Lua API. Additionally, Vimscript is slow and
brings unnecessary performance overhead while working with different brings unnecessary performance overhead while working with different
configuration formats. configuration formats.
### `vim.maps` rewrite ### `vim.maps` rewrite {#sec-vim-maps-rewrite}
Instead of specifying map modes using submodules (eg.: `vim.maps.normal`), a new Instead of specifying map modes using submodules (eg.: `vim.maps.normal`), a new
`mode` option has mode has been introduced. It can be either a string, or a list `mode` option has mode has been introduced. It can be either a string, or a list

View file

@ -843,6 +843,38 @@
"type": "github" "type": "github"
} }
}, },
"plugin-lz-n": {
"flake": false,
"locked": {
"lastModified": 1719989949,
"narHash": "sha256-oHwmlLgdJJDz5+gs1KLAa2MHQAadM/JYmHGfep9yl28=",
"owner": "nvim-neorocks",
"repo": "lz.n",
"rev": "4c790ba2c3789f580aa019712bbe3112f85e73a0",
"type": "github"
},
"original": {
"owner": "nvim-neorocks",
"repo": "lz.n",
"type": "github"
}
},
"plugin-lzn-auto-require": {
"flake": false,
"locked": {
"lastModified": 1722727896,
"narHash": "sha256-h7Dx3zBkUYamQY6lcuQrwAMgBpPqskLnA6WsbefHzMU=",
"owner": "horriblename",
"repo": "lzn-auto-require",
"rev": "c6b47e148a1ff9709e802f68c2c8b558a9a8de9b",
"type": "github"
},
"original": {
"owner": "horriblename",
"repo": "lzn-auto-require",
"type": "github"
}
},
"plugin-mind-nvim": { "plugin-mind-nvim": {
"flake": false, "flake": false,
"locked": { "locked": {
@ -1872,6 +1904,8 @@
"plugin-lspkind": "plugin-lspkind", "plugin-lspkind": "plugin-lspkind",
"plugin-lspsaga": "plugin-lspsaga", "plugin-lspsaga": "plugin-lspsaga",
"plugin-lualine": "plugin-lualine", "plugin-lualine": "plugin-lualine",
"plugin-lz-n": "plugin-lz-n",
"plugin-lzn-auto-require": "plugin-lzn-auto-require",
"plugin-mind-nvim": "plugin-mind-nvim", "plugin-mind-nvim": "plugin-mind-nvim",
"plugin-minimap-vim": "plugin-minimap-vim", "plugin-minimap-vim": "plugin-minimap-vim",
"plugin-modes-nvim": "plugin-modes-nvim", "plugin-modes-nvim": "plugin-modes-nvim",

View file

@ -102,6 +102,17 @@
}; };
## Plugins ## Plugins
# Lazy loading
plugin-lz-n = {
url = "github:nvim-neorocks/lz.n";
flake = false;
};
plugin-lzn-auto-require = {
url = "github:horriblename/lzn-auto-require";
flake = false;
};
# LSP plugins # LSP plugins
plugin-nvim-lspconfig = { plugin-nvim-lspconfig = {
url = "github:neovim/nvim-lspconfig"; url = "github:neovim/nvim-lspconfig";

View file

@ -3,30 +3,32 @@
inherit (lib.modules) mkIf mkDefault; inherit (lib.modules) mkIf mkDefault;
inherit (lib.types) nullOr str; inherit (lib.types) nullOr str;
inherit (lib.attrsets) isAttrs mapAttrs; inherit (lib.attrsets) isAttrs mapAttrs;
inherit (lib.generators) mkLuaInline;
mkLuaBinding = mode: key: action: desc: binds = rec {
mkLuaBinding = key: action: desc:
mkIf (key != null) { mkIf (key != null) {
${key} = { "${key}" = {
inherit mode action desc; inherit action desc;
lua = true; lua = true;
silent = true; silent = true;
}; };
}; };
mkExprBinding = mode: key: action: desc: mkExprBinding = key: action: desc:
mkIf (key != null) { mkIf (key != null) {
${key} = { "${key}" = {
inherit mode action desc; inherit action desc;
lua = true; lua = true;
silent = true; silent = true;
expr = true; expr = true;
}; };
}; };
mkBinding = mode: key: action: desc: mkBinding = key: action: desc:
mkIf (key != null) { mkIf (key != null) {
${key} = { "${key}" = {
inherit mode action desc; inherit action desc;
silent = true; silent = true;
}; };
}; };
@ -47,25 +49,41 @@
isNested = isAttrs value; isNested = isAttrs value;
returnedValue = returnedValue =
if isNested if isNested
then addDescriptionsToMappings actualMappings.${name} mappingDefinitions.${name} then addDescriptionsToMappings actualMappings."${name}" mappingDefinitions."${name}"
else { else {
inherit value; inherit value;
inherit (mappingDefinitions.${name}) description; inherit (mappingDefinitions."${name}") description;
}; };
in in
returnedValue) returnedValue)
actualMappings; actualMappings;
mkSetBinding = mode: binding: action: mkSetBinding = binding: action:
mkBinding mode binding.value action binding.description; mkBinding binding.value action binding.description;
mkSetExprBinding = mode: binding: action: mkSetExprBinding = binding: action:
mkExprBinding mode binding.value action binding.description; mkExprBinding binding.value action binding.description;
mkSetLuaBinding = mode: binding: action: mkSetLuaBinding = binding: action:
mkLuaBinding mode binding.value action binding.description; mkLuaBinding binding.value action binding.description;
pushDownDefault = attr: mapAttrs (_: mkDefault) attr; pushDownDefault = attr: mapAttrs (_: mkDefault) attr;
in {
inherit mkLuaBinding mkExprBinding mkBinding mkMappingOption addDescriptionsToMappings mkSetBinding mkSetExprBinding mkSetLuaBinding pushDownDefault; mkLznBinding = mode: lhs: rhs: desc: {
} inherit mode lhs rhs desc;
};
mkSetLznBinding = binding: action: {
lhs = binding.value;
rhs = action;
desc = binding.description;
};
mkSetLuaLznBinding = binding: action: {
lhs = binding.value;
rhs = mkLuaInline "function() ${action} end";
desc = binding.description;
};
};
in
binds

View file

@ -9,7 +9,7 @@
typesCustom = import ./custom.nix {inherit lib;}; typesCustom = import ./custom.nix {inherit lib;};
in { in {
inherit (typesDag) dagOf; inherit (typesDag) dagOf;
inherit (typesPlugin) pluginsOpt extraPluginType mkPluginSetupOption luaInline pluginType; inherit (typesPlugin) pluginsOpt extraPluginType mkPluginSetupOption luaInline pluginType lznPluginType lznPluginTableType;
inherit (typesLanguage) diagnostics mkGrammarOption; inherit (typesLanguage) diagnostics mkGrammarOption;
inherit (typesCustom) anythingConcatLists char; inherit (typesCustom) anythingConcatLists char;
} }

View file

@ -6,8 +6,7 @@
inherit (lib.options) mkOption; inherit (lib.options) mkOption;
inherit (lib.attrsets) attrNames mapAttrs' filterAttrs nameValuePair; inherit (lib.attrsets) attrNames mapAttrs' filterAttrs nameValuePair;
inherit (lib.strings) hasPrefix removePrefix; inherit (lib.strings) hasPrefix removePrefix;
inherit (lib.types) submodule either package enum str lines attrsOf anything listOf nullOr; inherit (lib.types) submodule either package enum str lines attrsOf anything listOf nullOr oneOf bool;
# Get the names of all flake inputs that start with the given prefix. # Get the names of all flake inputs that start with the given prefix.
fromInputs = { fromInputs = {
inputs, inputs,
@ -51,8 +50,156 @@
}; };
}; };
}; };
luaInline = lib.mkOptionType {
name = "luaInline";
check = x: lib.nvim.lua.isLuaInline x;
};
lznKeysSpec = submodule {
options = {
desc = mkOption {
description = "Description of the key map";
type = nullOr str;
default = null;
};
noremap = mkOption {
description = "TBD";
type = bool;
default = false;
};
expr = mkOption {
description = "TBD";
type = bool;
default = false;
};
nowait = mkOption {
description = "TBD";
type = bool;
default = false;
};
ft = mkOption {
description = "TBD";
type = nullOr (listOf str);
default = null;
};
lhs = mkOption {
type = str;
description = "Key to bind to";
};
rhs = mkOption {
type = nullOr (either str luaInline);
default = null;
# FIXME: use a separate flag to indicate lua instead of luaInline
description = "Action to trigger. luaInline code will be wrapped in a function.";
};
mode = mkOption {
description = "Modes to bind in";
type = listOf str;
default = ["n" "x" "s" "o"];
};
};
};
lznPluginTableType = attrsOf lznPluginType;
lznPluginType = submodule {
options = {
## Should probably infer from the actual plugin somehow
## In general this is the name passed to packadd, so the dir name of the plugin
# name = mkOption {
# type= str;
# }
# Non-lz.n options
package = mkOption {
type = pluginType;
description = "Plugin package";
};
setupModule = mkOption {
type = nullOr str;
description = "Lua module to run setup function on.";
default = null;
};
setupOpts = mkOption {
type = submodule {freeformType = attrsOf anything;};
description = "Options to pass to the setup function";
default = {};
};
# lz.n options
before = mkOption {
type = nullOr str;
description = "Lua code to run before plugin is loaded. This will be wrapped in a function.";
default = null;
};
after = mkOption {
type = nullOr str;
description = "Lua code to run after plugin is loaded. This will be wrapped in a function.";
default = null;
};
event = mkOption {
description = "Lazy-load on event";
default = null;
type = let
event = submodule {
options = {
event = mkOption {
type = nullOr (either str (listOf str));
description = "Exact event name";
example = "BufEnter";
};
pattern = mkOption {
type = nullOr (either str (listOf str));
description = "Event pattern";
example = "BufEnter *.lua";
};
};
};
in
nullOr (oneOf [str (listOf str) event]);
};
cmd = mkOption {
description = "Lazy-load on command";
default = null;
type = nullOr (either str (listOf str));
};
ft = mkOption {
description = "Lazy-load on filetype";
default = null;
type = nullOr (either str (listOf str));
};
keys = mkOption {
description = "Lazy-load on key mapping";
default = null;
type = nullOr (oneOf [str (listOf lznKeysSpec) (listOf str)]);
example = ''
keys = [
{lhs = "<leader>s"; rhs = ":NvimTreeToggle<cr>"; desc = "Toggle NvimTree"}
]
'';
};
# TODO: enabled, beforeAll, colorscheme, priority, load
};
};
in { in {
inherit extraPluginType fromInputs pluginType; inherit extraPluginType fromInputs pluginType luaInline lznPluginType lznPluginTableType;
pluginsOpt = { pluginsOpt = {
description, description,
@ -64,11 +211,6 @@ in {
type = pluginsType; type = pluginsType;
}; };
luaInline = lib.mkOptionType {
name = "luaInline";
check = x: lib.nvim.lua.isLuaInline x;
};
/* /*
opts is a attrset of options, example: opts is a attrset of options, example:
``` ```

View file

@ -69,10 +69,7 @@ inputs: {
# built (or "normalized") plugins that are modified # built (or "normalized") plugins that are modified
builtStartPlugins = buildConfigPlugins vimOptions.startPlugins; builtStartPlugins = buildConfigPlugins vimOptions.startPlugins;
builtOptPlugins = map (package: { builtOptPlugins = map (package: package // {optional = true;}) (buildConfigPlugins vimOptions.optPlugins);
plugin = package;
optional = true;
}) (buildConfigPlugins vimOptions.optPlugins);
# additional Lua and Python3 packages, mapped to their respective functions # additional Lua and Python3 packages, mapped to their respective functions
# to conform to the format mnw expects. end user should # to conform to the format mnw expects. end user should

View file

@ -50,6 +50,7 @@
wrapper = map (p: ./wrapper + "/${p}") [ wrapper = map (p: ./wrapper + "/${p}") [
"build" "build"
"rc" "rc"
"lazy"
"warnings" "warnings"
]; ];

View file

@ -1,17 +1,9 @@
{lib, ...}: let {lib, ...}: let
inherit (lib.options) mkOption; inherit (lib.options) mkOption;
inherit (lib.types) either str listOf attrsOf nullOr submodule; inherit (lib.types) either str listOf attrsOf nullOr submodule bool;
inherit (lib.nvim.config) mkBool; inherit (lib.nvim.config) mkBool;
mapType = submodule { mapConfigOptions = {
mode = mkOption {
type = either str (listOf str);
description = ''
The short-name of the mode to set the keymapping for. Passing an empty string is the equivalent of `:map`.
See `:help map-modes` for a list of modes.
'';
};
desc = mkOption { desc = mkOption {
type = nullOr str; type = nullOr str;
default = null; default = null;
@ -34,10 +26,69 @@
unique = mkBool false "Whether to fail if the map is already defined. Equivalent to adding <unique> to a map."; unique = mkBool false "Whether to fail if the map is already defined. Equivalent to adding <unique> to a map.";
noremap = mkBool true "Whether to use the 'noremap' variant of the command, ignoring any custom mappings on the defined action. It is highly advised to keep this on, which is the default."; noremap = mkBool true "Whether to use the 'noremap' variant of the command, ignoring any custom mappings on the defined action. It is highly advised to keep this on, which is the default.";
}; };
mapType = submodule {
options =
mapConfigOptions
// {
mode = mkOption {
type = either str (listOf str);
description = ''
The short-name of the mode to set the keymapping for. Passing an empty string is the equivalent of `:map`.
See `:help map-modes` for a list of modes.
'';
};
};
};
# legacy stuff
mapOption = submodule {
options =
mapConfigOptions
// {
action = mkOption {
type = str;
description = "The action to execute.";
};
lua = mkOption {
type = bool;
description = ''
If true, `action` is considered to be lua code.
Thus, it will not be wrapped in `""`.
'';
default = false;
};
};
};
mapOptions = mode:
mkOption {
description = "Mappings for ${mode} mode";
type = attrsOf mapOption;
default = {};
};
in { in {
options.vim = { options.vim = {
maps = mkOption { maps = mkOption {
type = attrsOf mapType; type = submodule {
freeformType = attrsOf mapType;
options = {
normal = mapOptions "normal";
insert = mapOptions "insert";
select = mapOptions "select";
visual = mapOptions "visual and select";
terminal = mapOptions "terminal";
normalVisualOp = mapOptions "normal, visual, select and operator-pending (same as plain 'map')";
visualOnly = mapOptions "visual only";
operator = mapOptions "operator-pending";
insertCommand = mapOptions "insert and command-line";
lang = mapOptions "insert, command-line and lang-arg";
command = mapOptions "command-line";
};
};
default = {}; default = {};
description = "Custom keybindings."; description = "Custom keybindings.";
example = '' example = ''

View file

@ -4,11 +4,11 @@
pkgs, pkgs,
... ...
}: let }: let
inherit (builtins) filter;
inherit (lib.strings) optionalString; inherit (lib.strings) optionalString;
inherit (lib.modules) mkIf mkMerge; inherit (lib.modules) mkIf;
inherit (lib.nvim.binds) mkBinding; inherit (lib.nvim.binds) mkLznBinding;
inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.dag) entryAnywhere;
inherit (lib.nvim.lua) toLuaObject;
inherit (lib.nvim.binds) pushDownDefault; inherit (lib.nvim.binds) pushDownDefault;
cfg = config.vim.filetree.nvimTree; cfg = config.vim.filetree.nvimTree;
@ -16,19 +16,28 @@
inherit (self.options.vim.filetree.nvimTree) mappings; inherit (self.options.vim.filetree.nvimTree) mappings;
in { in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim.startPlugins = ["nvim-tree-lua"];
vim.maps.normal = mkMerge [
(mkBinding cfg.mappings.toggle ":NvimTreeToggle<cr>" mappings.toggle.description)
(mkBinding cfg.mappings.refresh ":NvimTreeRefresh<cr>" mappings.refresh.description)
(mkBinding cfg.mappings.findFile ":NvimTreeFindFile<cr>" mappings.findFile.description)
(mkBinding cfg.mappings.focus ":NvimTreeFocus<cr>" mappings.focus.description)
];
vim.binds.whichKey.register = pushDownDefault { vim.binds.whichKey.register = pushDownDefault {
"<leader>t" = "+NvimTree"; "<leader>t" = "+NvimTree";
}; };
vim.lazy = {
plugins = {
nvim-tree-lua = {
package = "nvim-tree-lua";
setupModule = "nvim-tree";
inherit (cfg) setupOpts;
cmd = ["NvimTreeClipboard" "NvimTreeClose" "NvimTreeCollapse" "NvimTreeCollapseKeepBuffers" "NvimTreeFindFile" "NvimTreeFindFileToggle" "NvimTreeFocus" "NvimTreeHiTest" "NvimTreeOpen" "NvimTreeRefresh" "NvimTreeResize" "NvimTreeToggle"];
keys = filter ({lhs, ...}: lhs != null) [
(mkLznBinding ["n"] cfg.mappings.toggle ":NvimTreeToggle<cr>" mappings.toggle.description)
(mkLznBinding ["n"] cfg.mappings.refresh ":NvimTreeRefresh<cr>" mappings.refresh.description)
(mkLznBinding ["n"] cfg.mappings.findFile ":NvimTreeFindFile<cr>" mappings.findFile.description)
(mkLznBinding ["n"] cfg.mappings.focus ":NvimTreeFocus<cr>" mappings.focus.description)
];
};
};
};
vim.pluginRC.nvimtreelua = entryAnywhere '' vim.pluginRC.nvimtreelua = entryAnywhere ''
${ ${
optionalString cfg.setupOpts.disable_netrw '' optionalString cfg.setupOpts.disable_netrw ''
@ -38,10 +47,9 @@ in {
'' ''
} }
require'nvim-tree'.setup(${toLuaObject cfg.setupOpts})
${ ${
optionalString cfg.openOnSetup '' optionalString cfg.openOnSetup ''
require('lz.n').trigger_load("nvim-tree-lua")
-- autostart behaviour -- autostart behaviour
-- Open on startup has been deprecated -- Open on startup has been deprecated
-- see https://github.com/nvim-tree/nvim-tree.lua/wiki/Open-At-Startup -- see https://github.com/nvim-tree/nvim-tree.lua/wiki/Open-At-Startup

View file

@ -0,0 +1,74 @@
{
lib,
config,
...
}: let
inherit (builtins) toJSON typeOf head length;
inherit (lib.modules) mkIf;
inherit (lib.attrsets) mapAttrsToList;
inherit (lib.generators) mkLuaInline;
inherit (lib.strings) optionalString;
inherit (lib.nvim.lua) toLuaObject;
inherit (lib.nvim.dag) entryBefore;
cfg = config.vim.lazy;
toLuzLznKeySpec = {
desc,
noremap,
expr,
nowait,
ft,
lhs,
rhs,
mode,
}: {
"@1" = lhs;
"@2" = rhs;
inherit desc noremap expr nowait ft mode;
};
toLuaLznSpec = name: spec:
(removeAttrs spec ["package" "setupModule" "setupOpts" "keys"])
// {
"@1" = name;
before =
if spec.before != null
then
mkLuaInline ''
function()
${spec.before}
end
''
else null;
after =
if spec.setupModule == null && spec.after == null
then null
else
mkLuaInline ''
function()
${
optionalString (spec.setupModule != null)
"require(${toJSON spec.setupModule}).setup(${toLuaObject spec.setupOpts})"
}
${optionalString (spec.after != null) spec.after}
end
'';
keys =
if typeOf spec.keys == "list" && length spec.keys > 0 && typeOf (head spec.keys) == "set"
then map toLuzLznKeySpec spec.keys
else spec.keys;
};
lznSpecs = mapAttrsToList toLuaLznSpec cfg.plugins;
in {
config.vim = mkIf cfg.enable {
startPlugins = ["lz-n" "lzn-auto-require"];
optPlugins = mapAttrsToList (_: plugin: plugin.package) cfg.plugins;
luaConfigRC.lzn-load = entryBefore ["pluginConfigs"] ''
require('lz.n').load(${toLuaObject lznSpecs})
'';
};
}

View file

@ -0,0 +1,6 @@
_: {
imports = [
./lazy.nix
./config.nix
];
}

View file

@ -0,0 +1,29 @@
{lib, ...}: let
inherit (lib.options) mkOption mkEnableOption;
inherit (lib.types) enum;
inherit (lib.nvim.types) lznPluginTableType;
in {
options.vim.lazy = {
enable = mkEnableOption "plugin lazy-loading" // {default = true;};
loader = mkOption {
description = "Lazy loader to use";
type = enum ["lz.n"];
default = "lz.n";
};
plugins = mkOption {
default = {};
type = lznPluginTableType;
description = "list of plugins to lazy load";
example = ''
{
toggleterm-nvim = {
package = "toggleterm-nvim";
after = lib.generators.mkLuaInline "function() require('toggleterm').setup{} end";
cmd = ["ToggleTerm"];
};
}
'';
};
};
}

View file

@ -3,10 +3,9 @@
lib, lib,
... ...
}: let }: let
inherit (builtins) map mapAttrs filter; inherit (builtins) map mapAttrs filter removeAttrs attrNames;
inherit (lib.options) mkOption; inherit (lib.attrsets) mapAttrsToList filterAttrs attrsToList;
inherit (lib.attrsets) mapAttrsToList filterAttrs getAttrs attrValues attrNames; inherit (lib.strings) concatLines concatMapStringsSep optionalString;
inherit (lib.strings) concatLines concatMapStringsSep;
inherit (lib.trivial) showWarnings; inherit (lib.trivial) showWarnings;
inherit (lib.generators) mkLuaInline; inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.dag) entryAfter mkLuarcSection resolveDag entryAnywhere; inherit (lib.nvim.dag) entryAfter mkLuarcSection resolveDag entryAnywhere;
@ -46,7 +45,35 @@ in {
value, value,
}: "vim.keymap.set(${toLuaObject value.mode}, ${toLuaObject name}, ${toLuaObject (getAction value)}, ${toLuaObject (getOpts value)})"; }: "vim.keymap.set(${toLuaObject value.mode}, ${toLuaObject name}, ${toLuaObject (getAction value)}, ${toLuaObject (getOpts value)})";
keymaps = concatLines (map toLuaKeymap (attrsToList (filterNonNull config.maps))); namedModes = {
"normal" = ["n"];
"insert" = ["i"];
"select" = ["s"];
"visual" = ["v"];
"terminal" = ["t"];
"normalVisualOp" = ["n" "v" "o"];
"visualOnly" = ["n" "x"];
"operator" = ["o"];
"insertCommand" = ["i" "c"];
"lang" = ["l"];
"command" = ["c"];
};
maps =
removeAttrs cfg.maps (attrNames namedModes)
// mapAttrs (_: legacyMap: legacyMap // {mode = namedModes.normal;}) cfg.maps.normal
// mapAttrs (_: legacyMap: legacyMap // {mode = namedModes.insert;}) cfg.maps.insert
// mapAttrs (_: legacyMap: legacyMap // {mode = namedModes.select;}) cfg.maps.select
// mapAttrs (_: legacyMap: legacyMap // {mode = namedModes.visual;}) cfg.maps.visual
// mapAttrs (_: legacyMap: legacyMap // {mode = namedModes.terminal;}) cfg.maps.terminal
// mapAttrs (_: legacyMap: legacyMap // {mode = namedModes.normalVisualOp;}) cfg.maps.normalVisualOp
// mapAttrs (_: legacyMap: legacyMap // {mode = namedModes.visualOnly;}) cfg.maps.visualOnly
// mapAttrs (_: legacyMap: legacyMap // {mode = namedModes.operator;}) cfg.maps.operator
// mapAttrs (_: legacyMap: legacyMap // {mode = namedModes.insertCommand;}) cfg.maps.insertCommand
// mapAttrs (_: legacyMap: legacyMap // {mode = namedModes.lang;}) cfg.maps.lang
// mapAttrs (_: legacyMap: legacyMap // {mode = namedModes.command;}) cfg.maps.command;
keymaps = concatLines (map toLuaKeymap (attrsToList (filterNonNull maps)));
in { in {
vim = { vim = {
luaConfigRC = { luaConfigRC = {
@ -55,6 +82,8 @@ in {
pluginConfigs = entryAfter ["theme"] pluginConfigs; pluginConfigs = entryAfter ["theme"] pluginConfigs;
extraPluginConfigs = entryAfter ["pluginConfigs"] extraPluginConfigs; extraPluginConfigs = entryAfter ["pluginConfigs"] extraPluginConfigs;
mappings = entryAfter ["extraPluginConfigs"] keymaps; mappings = entryAfter ["extraPluginConfigs"] keymaps;
# FIXME: put this somewhere less stupid
footer = entryAfter ["mappings"] (optionalString config.vim.lazy.enable "require('lzn-auto-require.loader').register_loader()");
}; };
builtLuaConfigRC = let builtLuaConfigRC = let