Bladeren bron

refactor(luasnip): simplify structure

kylo252 2 jaren geleden
bovenliggende
commit
2c8b5e5275
4 gewijzigde bestanden met toevoegingen van 167 en 189 verwijderingen
  1. 4 96
      lua/lvim/core/cmp.lua
  2. 163 0
      lua/lvim/core/luasnip.lua
  3. 0 59
      lua/lvim/core/luasnip/init.lua
  4. 0 34
      lua/lvim/core/luasnip/snippets.lua

+ 4 - 96
lua/lvim/core/cmp.lua

@@ -1,4 +1,5 @@
 local M = {}
+
 M.methods = {}
 
 local has_words_before = function()
@@ -22,100 +23,7 @@ end
 
 M.methods.feedkeys = feedkeys
 
----when inside a snippet, seeks to the nearest luasnip field if possible, and checks if it is jumpable
----@param dir number 1 for forward, -1 for backward; defaults to 1
----@return boolean true if a jumpable luasnip field is found while inside a snippet
-local function jumpable(dir)
-  local luasnip_ok, luasnip = pcall(require, "luasnip")
-  if not luasnip_ok then
-    return false
-  end
-
-  local win_get_cursor = vim.api.nvim_win_get_cursor
-  local get_current_buf = vim.api.nvim_get_current_buf
-
-  ---sets the current buffer's luasnip to the one nearest the cursor
-  ---@return boolean true if a node is found, false otherwise
-  local function seek_luasnip_cursor_node()
-    -- TODO(kylo252): upstream this
-    -- for outdated versions of luasnip
-    if not luasnip.session.current_nodes then
-      return false
-    end
-
-    local node = luasnip.session.current_nodes[get_current_buf()]
-    if not node then
-      return false
-    end
-
-    local snippet = node.parent.snippet
-    local exit_node = snippet.insert_nodes[0]
-
-    local pos = win_get_cursor(0)
-    pos[1] = pos[1] - 1
-
-    -- exit early if we're past the exit node
-    if exit_node then
-      local exit_pos_end = exit_node.mark:pos_end()
-      if (pos[1] > exit_pos_end[1]) or (pos[1] == exit_pos_end[1] and pos[2] > exit_pos_end[2]) then
-        snippet:remove_from_jumplist()
-        luasnip.session.current_nodes[get_current_buf()] = nil
-
-        return false
-      end
-    end
-
-    node = snippet.inner_first:jump_into(1, true)
-    while node ~= nil and node.next ~= nil and node ~= snippet do
-      local n_next = node.next
-      local next_pos = n_next and n_next.mark:pos_begin()
-      local candidate = n_next ~= snippet and next_pos and (pos[1] < next_pos[1])
-        or (pos[1] == next_pos[1] and pos[2] < next_pos[2])
-
-      -- Past unmarked exit node, exit early
-      if n_next == nil or n_next == snippet.next then
-        snippet:remove_from_jumplist()
-        luasnip.session.current_nodes[get_current_buf()] = nil
-
-        return false
-      end
-
-      if candidate then
-        luasnip.session.current_nodes[get_current_buf()] = node
-        return true
-      end
-
-      local ok
-      ok, node = pcall(node.jump_from, node, 1, true) -- no_move until last stop
-      if not ok then
-        snippet:remove_from_jumplist()
-        luasnip.session.current_nodes[get_current_buf()] = nil
-
-        return false
-      end
-    end
-
-    -- No candidate, but have an exit node
-    if exit_node then
-      -- to jump to the exit node, seek to snippet
-      luasnip.session.current_nodes[get_current_buf()] = snippet
-      return true
-    end
-
-    -- No exit node, exit from snippet
-    snippet:remove_from_jumplist()
-    luasnip.session.current_nodes[get_current_buf()] = nil
-    return false
-  end
-
-  if dir == -1 then
-    return luasnip.in_snippet() and luasnip.jumpable(-1)
-  else
-    return luasnip.in_snippet() and seek_luasnip_cursor_node() and luasnip.jumpable(1)
-  end
-end
-
-M.methods.jumpable = jumpable
+M.methods.jumpable = require("lvim.core.luasnip").methods.jumpable
 
 M.config = function()
   local status_cmp_ok, cmp_types = pcall(require, "cmp.types.cmp")
@@ -302,9 +210,9 @@ M.config = function()
           cmp.select_next_item()
         elseif luasnip.expand_or_locally_jumpable() then
           luasnip.expand_or_jump()
-        elseif jumpable(1) then
+        elseif M.methods.jumpable(1) then
           luasnip.jump(1)
-        elseif has_words_before() then
+        elseif M.methods.has_words_before() then
           -- cmp.complete()
           fallback()
         else

+ 163 - 0
lua/lvim/core/luasnip.lua

@@ -0,0 +1,163 @@
+local M = {}
+
+-- see luasnip/util/types.lua
+local types = {
+  textNode = 1,
+  insertNode = 2,
+  functionNode = 3,
+  snippetNode = 4,
+  choiceNode = 5,
+  dynamicNode = 6,
+  snippet = 7,
+  exitNode = 8,
+  restoreNode = 9,
+  node_types = { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
+}
+
+function M.config()
+  lvim.builtin.luasnip = {
+    sources = {
+      friendly_snippets = true,
+    },
+    config = {
+      history = false,
+      updateevents = "TextChanged,TextChangedI",
+      ext_opts = {
+        -- Will be populated within config function
+      },
+    },
+    ext_opts = {
+      -- Show virtual text to signal when you are inside an sippets
+      [types.insertNode] = {
+        active = {
+          virt_text = { { "<-- snip insert", "BufferInactiveIndex" } },
+        },
+      },
+      -- Helps to notice when you are within a choice node
+      [types.choiceNode] = {
+        active = {
+          virt_text = { { "<-- choice", "BufferInactiveIndex" } },
+        },
+      },
+    },
+  }
+end
+
+function M.setup()
+  local utils = require "lvim.utils"
+  local paths = {}
+  if lvim.builtin.luasnip.sources.friendly_snippets then
+    paths[#paths + 1] = utils.join_paths(get_runtime_dir(), "site", "pack", "packer", "start", "friendly-snippets")
+  end
+
+  local user_snippets = utils.join_paths(get_config_dir(), "snippets")
+  if utils.is_directory(user_snippets) then
+    paths[#paths + 1] = user_snippets
+  end
+
+  local luasnip = require "luasnip"
+  luasnip.config.set_config(lvim.builtin.luasnip.config)
+
+  -- When no paths are provided, luasnip will search in the runtimepath
+  require("luasnip.loaders.from_lua").lazy_load()
+  require("luasnip.loaders.from_vscode").lazy_load { paths = paths }
+  require("luasnip.loaders.from_snipmate").lazy_load()
+end
+
+---when inside a snippet, seeks to the nearest luasnip field if possible, and checks if it is jumpable
+---@param dir number 1 for forward, -1 for backward; defaults to 1
+---@return boolean true if a jumpable luasnip field is found while inside a snippet
+local function jumpable(dir)
+  local luasnip_ok, luasnip = pcall(require, "luasnip")
+  if not luasnip_ok then
+    return false
+  end
+
+  local win_get_cursor = vim.api.nvim_win_get_cursor
+  local get_current_buf = vim.api.nvim_get_current_buf
+
+  ---sets the current buffer's luasnip to the one nearest the cursor
+  ---@return boolean true if a node is found, false otherwise
+  local function seek_luasnip_cursor_node()
+    -- TODO(kylo252): upstream this
+    -- for outdated versions of luasnip
+    if not luasnip.session.current_nodes then
+      return false
+    end
+
+    local node = luasnip.session.current_nodes[get_current_buf()]
+    if not node then
+      return false
+    end
+
+    local snippet = node.parent.snippet
+    local exit_node = snippet.insert_nodes[0]
+
+    local pos = win_get_cursor(0)
+    pos[1] = pos[1] - 1
+
+    -- exit early if we're past the exit node
+    if exit_node then
+      local exit_pos_end = exit_node.mark:pos_end()
+      if (pos[1] > exit_pos_end[1]) or (pos[1] == exit_pos_end[1] and pos[2] > exit_pos_end[2]) then
+        snippet:remove_from_jumplist()
+        luasnip.session.current_nodes[get_current_buf()] = nil
+
+        return false
+      end
+    end
+
+    node = snippet.inner_first:jump_into(1, true)
+    while node ~= nil and node.next ~= nil and node ~= snippet do
+      local n_next = node.next
+      local next_pos = n_next and n_next.mark:pos_begin()
+      local candidate = n_next ~= snippet and next_pos and (pos[1] < next_pos[1])
+          or (pos[1] == next_pos[1] and pos[2] < next_pos[2])
+
+      -- Past unmarked exit node, exit early
+      if n_next == nil or n_next == snippet.next then
+        snippet:remove_from_jumplist()
+        luasnip.session.current_nodes[get_current_buf()] = nil
+
+        return false
+      end
+
+      if candidate then
+        luasnip.session.current_nodes[get_current_buf()] = node
+        return true
+      end
+
+      local ok
+      ok, node = pcall(node.jump_from, node, 1, true) -- no_move until last stop
+      if not ok then
+        snippet:remove_from_jumplist()
+        luasnip.session.current_nodes[get_current_buf()] = nil
+
+        return false
+      end
+    end
+
+    -- No candidate, but have an exit node
+    if exit_node then
+      -- to jump to the exit node, seek to snippet
+      luasnip.session.current_nodes[get_current_buf()] = snippet
+      return true
+    end
+
+    -- No exit node, exit from snippet
+    snippet:remove_from_jumplist()
+    luasnip.session.current_nodes[get_current_buf()] = nil
+    return false
+  end
+
+  if dir == -1 then
+    return luasnip.in_snippet() and luasnip.jumpable(-1) else
+    return luasnip.in_snippet() and seek_luasnip_cursor_node() and luasnip.jumpable(1)
+  end
+end
+
+M.methods = {}
+
+M.methods.jumpable = jumpable
+
+return M

+ 0 - 59
lua/lvim/core/luasnip/init.lua

@@ -1,59 +0,0 @@
-local M = {}
-function M.config()
-  lvim.builtin.luasnip = {
-    sources = {
-      friendly_snippets = true,
-      lunarvim = true,
-    },
-    config = {
-      history = false,
-      updateevents = "TextChanged,TextChangedI",
-      ext_opts = {
-        -- Will be populated within config function
-      },
-    },
-  }
-end
-
-function M.setup()
-  local utils = require "lvim.utils"
-  local paths = {}
-  if lvim.builtin.luasnip.sources.friendly_snippets then
-    paths[#paths + 1] = utils.join_paths(get_runtime_dir(), "site", "pack", "packer", "start", "friendly-snippets")
-  end
-  local user_snippets = utils.join_paths(get_config_dir(), "snippets")
-  if utils.is_directory(user_snippets) then
-    paths[#paths + 1] = user_snippets
-  end
-  -- When no paths are provided, luasnip will search in the runtimepath
-  require("luasnip.loaders.from_lua").lazy_load()
-  require("luasnip.loaders.from_vscode").lazy_load {
-    paths = paths,
-  }
-  require("luasnip.loaders.from_snipmate").lazy_load()
-
-  local luasnip = require "luasnip"
-  local types = require "luasnip.util.types"
-
-  local ext_opts = {
-    -- Show virtual text to signal when you are inside an sippets
-    [types.insertNode] = {
-      active = {
-        virt_text = { { "<-- snip insert", "BufferInactiveIndex" } },
-      },
-    },
-    -- Helps to notice when you are within a choice node
-    [types.choiceNode] = {
-      active = {
-        virt_text = { { "<-- choice", "BufferInactiveIndex" } },
-      },
-    },
-  }
-  -- Add lunarvim options giving preference to user ones
-  lvim.builtin.luasnip.config.ext_opts = vim.tbl_deep_extend("keep", lvim.builtin.luasnip.config.ext_opts, ext_opts)
-  luasnip.config.set_config(lvim.builtin.luasnip.config)
-  if lvim.builtin.luasnip.sources.lunarvim then
-    luasnip.add_snippets("lua", require "lvim.core.luasnip.snippets")
-  end
-end
-return M

+ 0 - 34
lua/lvim/core/luasnip/snippets.lua

@@ -1,34 +0,0 @@
--- About how to create snippets:
--- https://github.com/L3MON4D3/LuaSnip/blob/master/DOC.md
--- uncoment nodes as you need them
--- local sn = ls.snippet_node
--- local isn = ls.indent_snippet_node
--- local t = ls.text_node
--- local f = ls.function_node
--- local c = ls.choice_node
--- local d = ls.dynamic_node
--- local r = ls.restore_node
--- local m = extras.m
--- local rep = extras.rep
--- local postfix = require("luasnip.extras.postfix").postfix
-local fmt = require("luasnip.extras.fmt").fmt
-local extras = require "luasnip.extras"
-local l = extras.l
-local dl = extras.dynamic_lambda
-local ls = require "luasnip"
-local s = ls.snippet
-local i = ls.insert_node
-
-return {
-  s(
-    { trig = "preq", dscr = "Protected require call" },
-    fmt(
-      [[
-      local ok, {} = pcall(require,'{}')
-      if not ok then
-        return
-      end]],
-      { i(1), dl(2, "lvim.core." .. l._1, 1) }
-    )
-  ),
-}