nix-community.nixvim/plugins/snippets/luasnip/default.nix

175 lines
4.4 KiB
Nix
Raw Normal View History

{
lib,
helpers,
config,
pkgs,
...
}:
2024-05-05 19:39:35 +02:00
with lib;
let
cfg = config.plugins.luasnip;
2024-05-05 19:39:35 +02:00
in
{
options.plugins.luasnip = {
enable = mkEnableOption "luasnip";
package = helpers.mkPackageOption "luasnip" pkgs.vimPlugins.luasnip;
extraConfig = mkOption {
type = types.attrsOf types.anything;
description = ''
Extra config options for luasnip.
Example:
{
enable_autosnippets = true,
store_selection_keys = "<Tab>",
}
'';
2024-05-05 19:39:35 +02:00
default = { };
};
fromVscode = mkOption {
2024-05-05 19:39:35 +02:00
default = [ ];
example = ''
[
{}
{
paths = ./path/to/snippets;
}
]
# generates:
#
# require("luasnip.loaders.from_vscode").lazy_load({})
# require("luasnip.loaders.from_vscode").lazy_load({['paths'] = {'/nix/store/.../path/to/snippets'}})
#
'';
2024-05-05 19:39:35 +02:00
type = types.listOf (
types.submodule {
options = {
lazyLoad = mkOption {
type = types.bool;
default = true;
description = ''
Whether or not to lazy load the snippets
'';
};
2024-05-05 19:39:35 +02:00
# TODO: add option to also include the default runtimepath
paths = mkOption {
default = null;
type =
with types;
nullOr (oneOf [
str
path
helpers.nixvimTypes.rawLua
2024-05-05 19:39:35 +02:00
(listOf (oneOf [
str
path
helpers.nixvimTypes.rawLua
]))
]);
2024-05-05 19:39:35 +02:00
};
2024-05-05 19:39:35 +02:00
exclude = mkOption {
type = types.nullOr (types.listOf types.str);
default = null;
description = ''
List of languages to exclude, by default is empty.
'';
};
2024-05-05 19:39:35 +02:00
include = mkOption {
type = types.nullOr (types.listOf types.str);
default = null;
description = ''
List of languages to include, by default is not set.
'';
};
};
2024-05-05 19:39:35 +02:00
}
);
};
# TODO: add support for snipmate
fromLua = mkOption {
2024-05-05 19:39:35 +02:00
default = [ ];
description = ''
Load lua snippets with the lua loader.
Check https://github.com/L3MON4D3/LuaSnip/blob/master/DOC.md#lua for the necessary file structure.
'';
example = ''
[
{}
{
paths = ./path/to/snippets;
}
]
'';
2024-05-05 19:39:35 +02:00
type = types.listOf (
types.submodule {
options = {
lazyLoad = mkOption {
type = types.bool;
default = true;
description = ''
Whether or not to lazy load the snippets
'';
};
paths = helpers.defaultNullOpts.mkNullable (
with types;
2024-05-05 19:39:35 +02:00
nullOr (oneOf [
str
path
helpers.nixvimTypes.rawLua
(listOf (oneOf [
str
path
helpers.nixvimTypes.rawLua
]))
])
) "" "Paths with snippets specified with native lua";
};
}
);
};
};
2024-05-05 19:39:35 +02:00
config =
let
fromVscodeLoaders = lists.map (
loader:
let
options = attrsets.getAttrs [
"paths"
"exclude"
"include"
] loader;
in
''
require("luasnip.loaders.from_vscode").${optionalString loader.lazyLoad "lazy_"}load(${helpers.toLuaObject options})
''
) cfg.fromVscode;
fromLuaLoaders = lists.map (
loader:
let
options = attrsets.getAttrs [ "paths" ] loader;
in
''
require("luasnip.loaders.from_lua").${optionalString loader.lazyLoad "lazy_"}load(${helpers.toLuaObject options})
''
2024-05-05 19:39:35 +02:00
) cfg.fromLua;
extraConfig = [
''
require("luasnip").config.set_config(${helpers.toLuaObject cfg.extraConfig})
''
];
in
mkIf cfg.enable {
2024-05-05 19:39:35 +02:00
extraPlugins = [ cfg.package ];
extraLuaPackages = ps: [ ps.jsregexp ];
extraConfigLua = concatStringsSep "\n" (extraConfig ++ fromVscodeLoaders ++ fromLuaLoaders);
};
}