From 06664fda41d83464037beaf919f6d21e6bb95bb2 Mon Sep 17 00:00:00 2001
From: Oliver Davies <oliver@oliverdavies.uk>
Date: Thu, 10 Feb 2022 09:56:02 +0000
Subject: [PATCH] feat: update luasnip configuration

---
 roles/neovim/files/after/plugin/luasnip.lua   | 58 +++++++++++++++----
 roles/neovim/files/lua/opdavies/keymap.lua    |  4 ++
 .../files/lua/opdavies/snippets/ft/lua.lua    |  9 +++
 .../files/lua/opdavies/snippets/ft/php.lua    | 55 ++++++------------
 4 files changed, 79 insertions(+), 47 deletions(-)
 create mode 100644 roles/neovim/files/lua/opdavies/snippets/ft/lua.lua

diff --git a/roles/neovim/files/after/plugin/luasnip.lua b/roles/neovim/files/after/plugin/luasnip.lua
index 80bfdcf3..8176a208 100644
--- a/roles/neovim/files/after/plugin/luasnip.lua
+++ b/roles/neovim/files/after/plugin/luasnip.lua
@@ -7,6 +7,12 @@ if vim.g.snippets ~= "luasnip" then
   return
 end
 
+ls.config.set_config {
+  enable_autosnippets = true,
+  history = true,
+  updateevents = "TextChanged,TextChangedI",
+}
+
 local snippet = ls.snippet
 local i = ls.insert_node
 local t = ls.text_node
@@ -27,7 +33,7 @@ local shortcut = function(val)
   return val
 end
 
-local function make(tbl)
+local make = function(tbl)
   local result = {}
   for k, v in pairs(tbl) do
     table.insert(result, (snippet({ trig = k, desc = v.desc }, shortcut(v))))
@@ -37,12 +43,14 @@ local function make(tbl)
 end
 
 local javascript = make(R "opdavies.snippets.ft.javascript")
+local lua = make(R "opdavies.snippets.ft.lua")
 local markdown = make(R "opdavies.snippets.ft.markdown")
 local php = make(R "opdavies.snippets.ft.php")
 local rst = make(R "opdavies.snippets.ft.rst")
 
-local snippets = {
+ls.snippets = {
   js = javascript,
+  lua = lua,
   markdown = markdown,
   php = php,
   rst = rst,
@@ -50,12 +58,42 @@ local snippets = {
   vue = javascript,
 }
 
-ls.snippets = snippets
+local imap = require("opdavies.keymap").imap
+local map = require("opdavies.keymap").map
+local nmap = require("opdavies.keymap").nmap
 
-vim.cmd [[
-  imap <silent><expr> <c-k> luasnip#expand_or_jumpable() ? '<Plug>luasnip-expand-or-jump' : ''
-  inoremap <silent> <c-j> <cmd>lua require('luasnip').jump(-1)<CR>
-  imap <silent><expr> <C-l> luasnip#choice_active() ? '<Plug>luasnip-next-choice' : '<C-l>'
-  snoremap <silent> <c-k> <cmd>lua require('luasnip').jump(1)<CR>
-  snoremap <silent> <c-j> <cmd>lua require('luasnip').jump(-1)<CR>
-]]
+local map_opts = { silent = true }
+
+map {
+  { "i", "s" },
+  "<c-j>",
+  function()
+    if ls.jumpable(-1) then
+      ls.jump(-1)
+    end
+  end,
+  map_opts,
+}
+
+map {
+  { "i", "s" },
+  "<c-k>",
+  function()
+    if ls.expand_or_jumpable() then
+      ls.expand_or_jump()
+    end
+  end,
+  map_opts,
+}
+
+imap {
+  "<c-l>",
+  function()
+    if ls.choice_active() then
+      ls.change_choice(1)
+    end
+  end,
+  map_opts,
+}
+
+nmap { "<leader><leader>s", "<cmd>source ~/.config/nvim/after/plugin/luasnip.lua<CR>", map_opts }
diff --git a/roles/neovim/files/lua/opdavies/keymap.lua b/roles/neovim/files/lua/opdavies/keymap.lua
index 92724d7f..7802ab67 100644
--- a/roles/neovim/files/lua/opdavies/keymap.lua
+++ b/roles/neovim/files/lua/opdavies/keymap.lua
@@ -4,6 +4,10 @@ M.imap = function(tbl)
   vim.keymap.set("i", tbl[1], tbl[2], tbl[3])
 end
 
+M.map = function(tbl)
+  vim.keymap.set(tbl[1], tbl[2], tbl[3], tbl[4] or {})
+end
+
 M.nmap = function(tbl)
   vim.keymap.set("n", tbl[1], tbl[2], tbl[3])
 end
diff --git a/roles/neovim/files/lua/opdavies/snippets/ft/lua.lua b/roles/neovim/files/lua/opdavies/snippets/ft/lua.lua
new file mode 100644
index 00000000..13c63fd7
--- /dev/null
+++ b/roles/neovim/files/lua/opdavies/snippets/ft/lua.lua
@@ -0,0 +1,9 @@
+local fmt = require("luasnip.extras.fmt").fmt
+local ls = require "luasnip"
+local rep = require("luasnip.extras").rep
+
+local i = ls.insert_node
+
+return {
+  req = fmt("local {} = require('{}')", { i(1), rep(1) })
+}
diff --git a/roles/neovim/files/lua/opdavies/snippets/ft/php.lua b/roles/neovim/files/lua/opdavies/snippets/ft/php.lua
index bc6e6007..af8311df 100644
--- a/roles/neovim/files/lua/opdavies/snippets/ft/php.lua
+++ b/roles/neovim/files/lua/opdavies/snippets/ft/php.lua
@@ -6,45 +6,26 @@ local i = ls.insert_node
 local t = ls.text_node
 
 local M = {
-  -- TODO: only load if within a Drupal project?
-  drupalclass = {
-    fmta(
-      [[
-      <<?php
+  func = fmta("function <>(<>)<> {\n  <>\n}<>", { i(1), i(2), i(3), i(4), i(0) }),
 
-      declare(strict_types=1);
+  met = fmta(
+    [[
+    <> function <>(<>)<> {
+      <>
+    }<>
+    ]],
+    { c(1, { t "public", t "protected", t "private" }), i(2), i(3), i(4), i(5), i(0) }
+  ),
 
-      namespace Drupal\<>;
-
-      <>class <> {
-
-        <>
-
-      }
-      ]],
-      { i(1), c(2, { t "", t "final " }), i(3), i(0) }
-    ),
-  },
-
-  test = {
-    fmta(
-      [[
-        /** @test */
-        public function <><>(): void {
-          <>
-        }
-      ]],
-      {
-        c(1, {
-          t "test",
-          t "it",
-          t "should",
-        }),
-        i(2),
-        i(0),
-      }
-    ),
-  },
+  test = fmta(
+    [[
+    /** @test */
+    public function <><>(): void {
+      <>
+    }<>
+    ]],
+    { c(1, { t "test", t "it", t "should" }), i(2), i(3), i(0) }
+  ),
 }
 
 return M