{ lib, pkgs }: let mkSnippet = prefix: description: body: mkSnippet' prefix description body { }; mkSnippet' = prefix: description: body: { autotrigger ? false }: { inherit prefix description body; luasnip = { inherit autotrigger; }; }; snippets = { nix = { Sha256Dummy = mkSnippet "sha256" "Dummy SHA256 hash" "sha256 = \"0000000000000000000000000000000000000000000000000000\";"; } // (lib.mapAttrs (name: _: let upperName = (lib.toUpper (builtins.substring 0 1 name)) + (builtins.substring 1 (builtins.stringLength name - 1) name); in mkSnippet "${name}Phase" "${name}Phase skeleton" '' runHook pre${upperName} $1 runHook post${upperName}'') (builtins.listToAttrs (map (name: lib.nameValuePair name { }) [ "unpack" "configure" "build" "install" ]))); rust = { DisplayTrait = mkSnippet "disp" "Display trait implentation" '' impl fmt::Display for ''${1:Struct} { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "$2", $3) } }$0''; }; tex = { Section = mkSnippet "s" "Section" '' \section{$1} ''; SubSection = mkSnippet "ss" "Subsection" '' \subsection{$1} ''; SubSubSection = mkSnippet "sss" "Subsubsection" '' \subsubsection{$1} ''; # Math QuadraticFormula = mkSnippet "qf" "Quadratic formula (user is responsible for parentheses)" ''\frac{-''${2:b} \pm \sqrt{$2^2 - 4 \cdot ''${1:a} \cdot ''${3:c}}}{2 \cdot $1}$0''; AlignedEnv = mkSnippet "aligned" "aligned environment (in math mode)" '' \begin{aligned} $1 &= $0 \\\\ \end{aligned}''; SiUnit = mkSnippet "si" "Insert SI unit (only works with simple numbers)" ''\SI{''${1:amount}}{''${2:unit}}''; MultiplicationSign = mkSnippet' "ยท" "Insert multiplication sign" ''\cdot $0'' { autotrigger = true; }; Fraction = mkSnippet' "//" "Fraction" ''\frac{$1}{$2}$0'' { autotrigger = true; }; }; }; snippetsIndex = pkgs.writeTextDir "package.json" (builtins.toJSON { contributes.snippets = lib.mapAttrs (id: language: { inherit language; path = "./snippets/${id}.json"; }) { nix = [ "nix" ]; rust = [ "rust" ]; tex = [ "tex" ]; }; }); snippetsDir = pkgs.symlinkJoin { name = "luasnip-snippets"; paths = (lib.mapAttrsToList (ft: content: pkgs.writeTextDir "snippets/${ft}.json" (builtins.toJSON content)) snippets) ++ (lib.singleton snippetsIndex); }; in pkgs.writeText "snippets.lua" '' require("luasnip/loaders/from_vscode").load({ paths = { '${snippetsDir}' } }) require("luasnip/loaders/from_vscode").lazy_load() -- other snippets ''