modules/luasnip: add snippets

This commit is contained in:
Dmitriy Pleshevskiy 2024-05-20 17:37:37 +03:00
parent e6ffc77378
commit 463a4f2d43
Signed by: pleshevskiy
GPG key ID: 17041163DA10A9A2
2 changed files with 197 additions and 5 deletions

View file

@ -20,11 +20,11 @@
}, },
"nix2lua": { "nix2lua": {
"locked": { "locked": {
"lastModified": 1716204167, "lastModified": 1716215210,
"narHash": "sha256-Jo1bjYIMy0Zj4zrkcMrcG0N2Qnhc75OnxL6fnqBG+mg=", "narHash": "sha256-GjwpjhNGdrGH0dElAvcKSFY3nbRw4JYOKtKMmhMsEWw=",
"ref": "refs/heads/main", "ref": "refs/heads/main",
"rev": "654eda07372a9a2a03e746d9758f6b39de396a83", "rev": "4d3ae67617c2c1301a1a90601e20e15614d20319",
"revCount": 51, "revCount": 52,
"type": "git", "type": "git",
"url": "https://git.pleshevski.ru/mynix/nix2lua" "url": "https://git.pleshevski.ru/mynix/nix2lua"
}, },

View file

@ -1,7 +1,177 @@
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
let let
inherit (lib.nix2lua) LuaNil scope lset pipe1 call call1;
cfg = config.plugins.snippet.luasnip; cfg = config.plugins.snippet.luasnip;
jump = lib.mkOption {
type = with lib.types; nullOr number;
default = null;
description = ''
This determines when this node will be jumped to.
`:help luasnip-insertnode`
`:help luasnip-basics-jump-index`
'';
};
unwrapJump = index: if index == null then LuaNil else index;
nodes = lib.mkOption {
type = with lib.types; listOf (submodule snippetNodeOpts);
};
unwrapNodes = map (n: n.genConfig);
genConfig = lib.mkOption {
type = lib.types.attrs;
internal = true;
};
snippetNodeOpts = { config, ... }: {
options = with lib; with types; {
text = mkOption {
type = nullOr (either str (listOf str));
default = null;
};
insert = mkOption {
type = nullOr (either number (submodule ({ ... }: {
options = {
inherit jump;
text = mkOption {
type = nullOr (either str (listOf str));
default = null;
description = ''
A single string for just one line, a list with entries for multiple lines.
This text will be SELECTed when the `insertNode` is jumped into.
`:help luasnip-insertnode`
'';
};
};
})));
default = null;
};
choice = mkOption {
type = nullOr (submodule ({ ... }: {
options = { inherit jump nodes; };
}));
default = null;
};
snippet = mkOption {
type = nullOr (submodule ({ ... }: {
options = {
inherit jump nodes;
indent = mkOption {
type = types.str;
default = "";
};
};
}));
default = null;
};
inherit genConfig;
};
config = {
genConfig =
let
ins = config.insert;
ch = config.choice;
sn = config.snippet;
in
if config.text != null then call1 "t" config.text
else if ins != null then
if builtins.isInt ins then call "i" [ ins ]
else call "i" [ (unwrapJump ins.jump) ins.text ]
else if ch != null then
call "c" [ (unwrapJump ch.jump) (unwrapNodes ch.nodes) ]
else if sn != null then
if sn.indent != "" then
call "isn" [ (unwrapJump sn.jump) (unwrapNodes sn.nodes) sn.indent ]
else call "sn" [ (unwrapJump sn.jump) (unwrapNodes sn.nodes) ]
else null;
};
};
snippetOpts = { name, ... } @ sub: {
options = with lib; with types; {
context = mkOption {
type = either str attrs;
description = ''
`:help luasnip-snippets';
'';
};
nodes = nodes // { default = [ ]; };
inherit genConfig;
};
config = {
context = lib.mkDefault name;
genConfig = call "s" [ sub.config.context (unwrapNodes sub.config.nodes) ];
};
};
snippetGroupOpts = { ... } @ sub: {
options = with lib; {
filetype = mkOption {
type = types.str;
};
opts = {
type = mkOption {
type = types.nullOr (types.enum [ "snippets" "autosnippets" ]);
default = null;
};
key = mkOption {
type = types.nullOr types.str;
default = null;
};
override_priority = mkOption {
type = types.nullOr types.number;
default = null;
description = ''
Set priority for all snippets.
`:help luasnip-api`
'';
};
default_priority = mkOption {
type = types.nullOr types.number;
default = null;
description = ''
Set priority only for snippets without snippet priority.
`:help luasnip-api`
'';
};
};
snippets = mkOption {
type = types.attrsOf (types.submodule snippetOpts);
default = { };
};
inherit genConfig;
};
config = {
genConfig =
let plugin = config.plugin.luasnip; in
let inherit (sub.config) filetype snippets opts; in
pipe1 plugin.var (call "add_snippets" [
filetype
(map (s: s.genConfig) (builtins.attrValues snippets))
opts
]);
};
};
in in
{ {
options.plugins.snippet.luasnip = with lib; { options.plugins.snippet.luasnip = with lib; {
@ -13,12 +183,34 @@ in
type = types.attrs; type = types.attrs;
default = { }; default = { };
}; };
snippetGroups = mkOption {
type = types.listOf (types.submodule snippetGroupOpts);
default = [ ];
};
}; };
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
plugin.luasnip = { plugin.luasnip = rec {
inherit (cfg) package; inherit (cfg) package;
varName = "luasnip";
setupSettings = cfg.settings; setupSettings = cfg.settings;
afterSetup = lib.mkIf (cfg.snippetGroups != [ ]) [
(scope (lib.flatten [
(lib.mapAttrsToList (k: v: lset k (pipe1 varName v)) {
s = "snippet";
sn = "snippet_node";
isn = "indent_snippet_node";
t = "text_node";
i = "insert_node";
f = "function_node";
c = "choice_node";
d = "dynamic_node";
r = "restore_node";
})
(map (sg: sg.genConfig) cfg.snippetGroups)
]))
];
}; };
}; };
} }