about summary refs log tree commit diff stats
path: root/hm/soispha/conf/nvim/plugins/luasnip
diff options
context:
space:
mode:
Diffstat (limited to 'hm/soispha/conf/nvim/plugins/luasnip')
-rw-r--r--hm/soispha/conf/nvim/plugins/luasnip/default.nix12
-rw-r--r--hm/soispha/conf/nvim/plugins/luasnip/lua/luasnip.lua7
-rw-r--r--hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/all.lua60
-rw-r--r--hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/html/html.lua108
-rw-r--r--hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/tex/delimiter.lua34
-rw-r--r--hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/tex/greek.lua37
6 files changed, 258 insertions, 0 deletions
diff --git a/hm/soispha/conf/nvim/plugins/luasnip/default.nix b/hm/soispha/conf/nvim/plugins/luasnip/default.nix
new file mode 100644
index 00000000..50a0b94c
--- /dev/null
+++ b/hm/soispha/conf/nvim/plugins/luasnip/default.nix
@@ -0,0 +1,12 @@
+{lib, ...}: {
+  programs.nixvim = {
+    plugins.luasnip = {
+      enable = true;
+    };
+    extraConfigLuaPost = ''
+      ${lib.strings.fileContents ./lua/luasnip.lua}
+      require("luasnip.loaders.from_lua").load({paths = "${./lua/snippets}"})
+      require("luasnip.loaders.from_lua").lazy_load({paths = "${./lua/snippets}"})
+    '';
+  };
+}
diff --git a/hm/soispha/conf/nvim/plugins/luasnip/lua/luasnip.lua b/hm/soispha/conf/nvim/plugins/luasnip/lua/luasnip.lua
new file mode 100644
index 00000000..0a603692
--- /dev/null
+++ b/hm/soispha/conf/nvim/plugins/luasnip/lua/luasnip.lua
@@ -0,0 +1,7 @@
+require("luasnip").config.set_config({
+  -- Enable auto triggered snippets
+  enable_autosnippets = true;
+
+  -- Use Tab (or some other key if you prefer) to trigger visual selection
+  store_selection_keys = "<Tab>";
+})
diff --git a/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/all.lua b/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/all.lua
new file mode 100644
index 00000000..5ce91a87
--- /dev/null
+++ b/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/all.lua
@@ -0,0 +1,60 @@
+local get_visual = function(args, parent)
+  if #parent.snippet.env.SELECT_RAW > 0 then
+    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+  else
+    return sn(nil, i(1, ""))
+  end
+end
+local function char_count_same(c1, c2)
+  local line = vim.api.nvim_get_current_line()
+  -- '%'-escape chars to force explicit match (gsub accepts patterns).
+  -- second return value is number of substitutions.
+  local _, ct1 = string.gsub(line, "%" .. c1, "")
+  local _, ct2 = string.gsub(line, "%" .. c2, "")
+  return ct1 == ct2
+end
+
+local function even_count(c)
+  local line = vim.api.nvim_get_current_line()
+  local _, ct = string.gsub(line, c, "")
+  return ct % 2 == 0
+end
+
+local function neg(fn, ...)
+  return not fn(...)
+end
+
+local function part(fn, ...)
+  local args = { ...; }
+  return function()
+    return fn(unpack(args))
+  end
+end
+
+-- This makes creation of pair-type snippets easier.
+local function pair(pair_begin, pair_end, expand_func, ...)
+  -- triggerd by opening part of pair, wordTrig=false to trigger anywhere.
+  -- ... is used to pass any args following the expand_func to it.
+  return s(
+    { trig = pair_begin; wordTrig = false; snippetType = "autosnippet"; },
+    { t({ pair_begin; }); d(1, get_visual); t({ pair_end; }); },
+    { condition = part(expand_func, part(..., pair_begin, pair_end)); }
+  )
+end
+
+local maybe = { pair = nil; }
+if vim.bo.filetype == "tex" then
+  maybe.pair = pair("<", ">", neg, char_count_same)
+end
+
+local output_table = {
+  pair("(", ")", neg, char_count_same);
+  pair("{", "}", neg, char_count_same);
+  pair("[", "]", neg, char_count_same);
+  pair("'", "'", neg, even_count);
+  pair('"', '"', neg, even_count);
+  pair("`", "`", neg, even_count);
+}
+output_table[#output_table + 1] = maybe.pair
+
+return output_table
diff --git a/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/html/html.lua b/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/html/html.lua
new file mode 100644
index 00000000..c467dd68
--- /dev/null
+++ b/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/html/html.lua
@@ -0,0 +1,108 @@
+local get_visual = function(args, parent)
+  if #parent.snippet.env.SELECT_RAW > 0 then
+    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+  else
+    return sn(nil, i(1))
+  end
+end
+
+local line_begin = require("luasnip.extras.expand_conditions").line_begin
+
+return {
+  -- HEADER
+  s(
+    {
+      trig = "h([123456])";
+      regTrig = true;
+      wordTrig = false;
+      snippetType = "autosnippet";
+    },
+    fmt(
+      [[
+          <h{}>{}</h{}>
+        ]],
+      {
+        f(function(_, snip)
+          return snip.captures[1]
+        end);
+        d(1, get_visual);
+        f(function(_, snip)
+          return snip.captures[1]
+        end);
+      }
+    ),
+    { condition = line_begin; }
+  ); -- PARAGRAPH
+  s(
+    { trig = "pp"; snippetType = "autosnippet"; },
+    fmt(
+      [[
+          <p>{}</p>
+        ]],
+      { d(1, get_visual); }
+    ),
+    { condition = line_begin; }
+  ); -- UNORDERED LIST
+  s(
+    { trig = "itt"; snippetType = "autosnippet"; },
+    fmt(
+      [[
+          <ul>
+            <li>{}</li>{}
+          </ul>
+        ]],
+      { i(1); i(0); }
+    ),
+    { condition = line_begin; }
+  ); -- LIST ITEM
+  s(
+    { trig = "ii"; snippetType = "autosnippet"; },
+    fmt(
+      [[
+            <li>{}</li>
+        ]],
+      { d(1, get_visual); }
+    ),
+    { condition = line_begin; }
+  );
+  -- DOCUMENT TEMPLATE
+  s(
+    { trig = "base"; },
+    fmt(
+      [[
+        <!doctype HTML>
+        <html lang="en">
+        <head>
+          <meta charset="UTF-8">
+          <title>{}</title>
+        </head>
+        <body>
+          {}
+        </body>
+        </html>
+        ]],
+      { i(1, "FooBar"); i(0); }
+    ),
+    { condition = line_begin; }
+  ); -- ANCHOR TAG
+  s(
+    {
+      trig = "([^%l])aa";
+      regTrig = true;
+      wordTrig = false;
+      snippetType = "autosnippet";
+    },
+    fmt(
+      [[
+          {}<a href="{}">{}</a>
+        ]],
+      {
+        f(function(_, snip)
+          return snip.captures[1]
+        end);
+        i(1);
+        d(2, get_visual);
+      }
+    )
+  );
+}
diff --git a/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/tex/delimiter.lua b/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/tex/delimiter.lua
new file mode 100644
index 00000000..e50898fc
--- /dev/null
+++ b/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/tex/delimiter.lua
@@ -0,0 +1,34 @@
+local get_visual = function(args, parent)
+  if #parent.snippet.env.SELECT_RAW > 0 then
+    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+  else
+    return sn(nil, i(1, ""))
+  end
+end
+
+local translation_table = { ["("] = ")"; ["{"] = "}"; ["["] = "]"; }
+
+-- Return snippet tables
+return {
+  -- LEFT/RIGHT ALL BRACES
+  s(
+    {
+      trig = "([^%a])l([%(%[%{])";
+      regTrig = true;
+      wordTrig = false;
+      snippetType = "autosnippet";
+    },
+    fmta("<>\\left<><>\\right<>", {
+      f(function(_, snip)
+        return snip.captures[1]
+      end);
+      f(function(_, snip)
+        return snip.captures[2]
+      end);
+      d(1, get_visual);
+      f(function(_, snip)
+        return translation_table[snip.captures[2]]
+      end);
+    })
+  );
+}
diff --git a/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/tex/greek.lua b/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/tex/greek.lua
new file mode 100644
index 00000000..19989093
--- /dev/null
+++ b/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/tex/greek.lua
@@ -0,0 +1,37 @@
+-- Return snippet tables
+return {
+  s({ trig = ";a"; snippetType = "autosnippet"; }, { t("\\alpha"); });
+  s({ trig = ";b"; snippetType = "autosnippet"; }, { t("\\beta"); });
+  s({ trig = ";g"; snippetType = "autosnippet"; }, { t("\\gamma"); });
+  s({ trig = ";G"; snippetType = "autosnippet"; }, { t("\\Gamma"); });
+  s({ trig = ";d"; snippetType = "autosnippet"; }, { t("\\delta"); });
+  s({ trig = ";D"; snippetType = "autosnippet"; }, { t("\\Delta"); });
+  s({ trig = ";e"; snippetType = "autosnippet"; }, { t("\\epsilon"); });
+  s({ trig = ";ve"; snippetType = "autosnippet"; }, { t("\\varepsilon"); });
+  s({ trig = ";z"; snippetType = "autosnippet"; }, { t("\\zeta"); });
+  s({ trig = ";h"; snippetType = "autosnippet"; }, { t("\\eta"); });
+  s({ trig = ";o"; snippetType = "autosnippet"; }, { t("\\theta"); });
+  s({ trig = ";vo"; snippetType = "autosnippet"; }, { t("\\vartheta"); });
+  s({ trig = ";O"; snippetType = "autosnippet"; }, { t("\\Theta"); });
+  s({ trig = ";k"; snippetType = "autosnippet"; }, { t("\\kappa"); });
+  s({ trig = ";l"; snippetType = "autosnippet"; }, { t("\\lambda"); });
+  s({ trig = ";L"; snippetType = "autosnippet"; }, { t("\\Lambda"); });
+  s({ trig = ";m"; snippetType = "autosnippet"; }, { t("\\mu"); });
+  s({ trig = ";n"; snippetType = "autosnippet"; }, { t("\\nu"); });
+  s({ trig = ";x"; snippetType = "autosnippet"; }, { t("\\xi"); });
+  s({ trig = ";X"; snippetType = "autosnippet"; }, { t("\\Xi"); });
+  s({ trig = ";i"; snippetType = "autosnippet"; }, { t("\\pi"); });
+  s({ trig = ";I"; snippetType = "autosnippet"; }, { t("\\Pi"); });
+  s({ trig = ";r"; snippetType = "autosnippet"; }, { t("\\rho"); });
+  s({ trig = ";s"; snippetType = "autosnippet"; }, { t("\\sigma"); });
+  s({ trig = ";S"; snippetType = "autosnippet"; }, { t("\\Sigma"); });
+  s({ trig = ";t"; snippetType = "autosnippet"; }, { t("\\tau"); });
+  s({ trig = ";f"; snippetType = "autosnippet"; }, { t("\\phi"); });
+  s({ trig = ";vf"; snippetType = "autosnippet"; }, { t("\\varphi"); });
+  s({ trig = ";F"; snippetType = "autosnippet"; }, { t("\\Phi"); });
+  s({ trig = ";c"; snippetType = "autosnippet"; }, { t("\\chi"); });
+  s({ trig = ";p"; snippetType = "autosnippet"; }, { t("\\psi"); });
+  s({ trig = ";P"; snippetType = "autosnippet"; }, { t("\\Psi"); });
+  s({ trig = ";w"; snippetType = "autosnippet"; }, { t("\\omega"); });
+  s({ trig = ";W"; snippetType = "autosnippet"; }, { t("\\Omega"); });
+}