From f96368921fe0df923ee8e6cdd8f9905c902e715c Mon Sep 17 00:00:00 2001
From: Oliver Davies <oliver@oliverdavies.uk>
Date: Sat, 8 Jan 2022 18:08:41 +0000
Subject: [PATCH] feat(nvim): start configuring LuaSnip

Fixes: #23
---
 roles/neovim/files/after/plugin/luasnip.lua | 63 +++++++++++++++++++++
 roles/neovim/files/lua/opdavies/options.lua |  2 +
 2 files changed, 65 insertions(+)
 create mode 100644 roles/neovim/files/after/plugin/luasnip.lua

diff --git a/roles/neovim/files/after/plugin/luasnip.lua b/roles/neovim/files/after/plugin/luasnip.lua
new file mode 100644
index 00000000..966e6696
--- /dev/null
+++ b/roles/neovim/files/after/plugin/luasnip.lua
@@ -0,0 +1,63 @@
+local status_ok, luasnip = pcall(require, "luasnip")
+if not status_ok then
+  return
+end
+
+if vim.g.snippets ~= "luasnip" then
+  return
+end
+
+-- Create a new snippet.
+local s = luasnip.s
+
+-- Different node types.
+local c = luasnip.choice_node
+local i = luasnip.insert_node
+local t = luasnip.text_node
+
+local snippets = {}
+
+-- Snippets for both JavaScript and TypeScript.
+local js_ts = {
+  s(
+    { trig = 'log', dscr = 'console.log' },
+    { t('console.log('), i(1, 'value'), t(');') }
+  ),
+}
+
+snippets.js = js_ts
+
+snippets.markdown = {
+  s(
+    { trig = 'frontmatter', dscr = 'Document frontmatter' },
+    { t({'---', 'tags: '}), i(1, 'value'), t({'', '---', ''}), i(0) }
+  )
+}
+
+snippets.php = {
+  s(
+    { trig = 'test', dscr = 'Test block' },
+    {
+      t({ "/* @test **/", "" }),
+      t("public function "),
+      c(1, { t "test", t "it", t "should" }), -- The test method name prefix.
+      i(2), -- The test method name.
+      t({ "(): void {", "" }),
+      t("  "), i(0), -- The method body.
+      t({ "", "}" })
+    }
+  ),
+}
+
+snippets.typescript = js_ts
+snippets.vue = js_ts
+
+luasnip.snippets = snippets
+
+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>
+]]
diff --git a/roles/neovim/files/lua/opdavies/options.lua b/roles/neovim/files/lua/opdavies/options.lua
index 6acc43a1..f7925d12 100644
--- a/roles/neovim/files/lua/opdavies/options.lua
+++ b/roles/neovim/files/lua/opdavies/options.lua
@@ -114,6 +114,8 @@ M.setup = function()
   set_autocmd()
   set_filetypes()
   set_highlights()
+
+  vim.g.snippets = "luasnip"
 end
 
 return M