diff --git a/modules/plugins/snippet/luasnip.nix b/modules/plugins/snippet/luasnip.nix index 08645d3..b8c6152 100644 --- a/modules/plugins/snippet/luasnip.nix +++ b/modules/plugins/snippet/luasnip.nix @@ -4,24 +4,13 @@ let inherit (lib.nix2lua) LuaNil scope lset pipe1 call call1; 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); + default = [ ]; }; unwrapNodes = map (n: n.genConfig); + genConfig = lib.mkOption { type = lib.types.attrs; internal = true; @@ -29,72 +18,63 @@ let snippetNodeOpts = { config, ... }: { options = with lib; with types; { + kind = mkOption { + type = enum [ "text" "insert" "choice" "snippet" ]; + }; + 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` - ''; - }; - }; - }))); + 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` + ''; }; - choice = mkOption { - type = nullOr (submodule ({ ... }: { - options = { inherit jump nodes; }; - })); - default = null; - }; + inherit nodes; - snippet = mkOption { - type = nullOr (submodule ({ ... }: { - options = { - inherit jump nodes; - indent = mkOption { - type = types.str; - default = ""; - }; - }; - })); - default = null; + # only for kind=snippet + indentString = mkOption { + type = types.str; + default = ""; }; 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; - }; + config = + let + inherit (config) kind text jump nodes; + + unwrapJump = index: if index == null then LuaNil else index; + in + { + kind = lib.mkDefault ( + if nodes != [ ] then "snippet" + else if jump != null then "insert" + else "text" + ); + + genConfig = + if kind == "text" then + if text != null then call1 "t" text + else throw "luasnip textnode require a 'text' config" + else if kind == "insert" then call "i" [ (unwrapJump jump) text ] + else if kind == "choice" then call "c" [ (unwrapJump jump) (unwrapNodes nodes) ] + else if kind == "snippet" then + if config.indentString != "" then + call "isn" [ (unwrapJump jump) (unwrapNodes nodes) config.indentString ] + else + call "sn" [ (unwrapJump jump) (unwrapNodes nodes) ] + else null; + }; }; snippetOpts = { name, ... } @ sub: { @@ -106,7 +86,7 @@ let ''; }; - nodes = nodes // { default = [ ]; }; + inherit nodes; inherit genConfig; };