diff --git a/plugins/default.nix b/plugins/default.nix index e784ca97..d3e02ee3 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -32,6 +32,8 @@ ./pluginmanagers/packer.nix + ./snippets/luasnip + ./statuslines/airline.nix ./statuslines/lightline.nix ./statuslines/lualine.nix diff --git a/plugins/helpers.nix b/plugins/helpers.nix index 35c3398b..62d3c577 100644 --- a/plugins/helpers.nix +++ b/plugins/helpers.nix @@ -23,6 +23,8 @@ rec { else if builtins.isString args then # This should be enough! escapeShellArg args + else if builtins.isPath args then + escapeShellArg args else if builtins.isBool args then "${ boolToString args }" else if builtins.isFloat args then diff --git a/plugins/snippets/luasnip/default.nix b/plugins/snippets/luasnip/default.nix new file mode 100644 index 00000000..66fcae81 --- /dev/null +++ b/plugins/snippets/luasnip/default.nix @@ -0,0 +1,98 @@ +{ pkgs, config, lib, ... }: +with lib; +let + cfg = config.plugins.luasnip; + helpers = import ../../helpers.nix { lib = lib; }; +in +{ + options.plugins.luasnip = { + enable = mkEnableOption "Enable luasnip"; + + package = mkOption { + default = pkgs.vimPlugins.luasnip; + type = types.package; + }; + + fromVscode = mkOption { + 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'}}) + # + ''; + type = types.listOf (types.submodule { + options = { + lazyLoad = mkOption { + type = types.bool; + default = true; + description = '' + Whether or not to lazy load the snippets + ''; + }; + + # TODO: add option to also include the default runtimepath + paths = mkOption { + default = null; + type = with types; nullOr (oneOf + [ + str + path + helpers.rawType + (listOf (oneOf + [ + str + path + helpers.rawType + ])) + ]); + }; + + exclude = mkOption { + type = types.nullOr (types.listOf types.str); + default = null; + description = '' + List of languages to exclude, by default is empty. + ''; + }; + + include = mkOption { + type = types.nullOr (types.listOf types.str); + default = null; + description = '' + List of languages to include, by default is not set. + ''; + }; + }; + }); + }; + + # TODO: add support for snipmate + # TODO: add support for lua + }; + + 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; + in + mkIf cfg.enable { + extraPlugins = [ cfg.package ]; + extraConfigLua = concatStringsSep "\n" fromVscodeLoaders; + }; +}