1
Fork 0
satellite/home/features/neovim/config/lua/my/luasnip.lua
2024-04-16 23:25:20 +02:00

77 lines
1.7 KiB
Lua

local M = {}
local conditions = require("luasnip.extras.conditions")
-- {{{ Math mode detection
-- Taken from: https://github.com/iurimateus/luasnip-latex-snippets.nvim/blob/main/lua/luasnip-latex-snippets/util/ts_utils.lua
local MATH_NODES = {
displayed_equation = true,
inline_formula = true,
math_environment = true,
}
local TEXT_NODES = {
text_mode = true,
label_definition = true,
label_reference = true,
}
local function get_node_at_cursor()
local pos = vim.api.nvim_win_get_cursor(0)
-- Subtract one to account for 1-based row indexing in nvim_win_get_cursor
local row, col = pos[1] - 1, pos[2]
local parser = vim.treesitter.get_parser(0, "latex")
if not parser then
return
end
local root_tree = parser:parse({ row, col, row, col })[1]
local root = root_tree and root_tree:root()
if not root then
return
end
return root:named_descendant_for_range(row, col, row, col)
end
local function in_text(check_parent)
local node = get_node_at_cursor()
while node do
if node:type() == "text_mode" then
if check_parent then
-- For \text{}
local parent = node:parent()
if parent and MATH_NODES[parent:type()] then
return false
end
end
return true
elseif MATH_NODES[node:type()] then
return false
end
node = node:parent()
end
return true
end
M.math = conditions.make_condition(function()
local node = get_node_at_cursor()
while node do
if TEXT_NODES[node:type()] then
return false
elseif MATH_NODES[node:type()] then
return true
end
node = node:parent()
end
return false
end)
M.text = conditions.make_condition(function()
return in_text(true)
end)
-- }}}
return M