77 lines
1.7 KiB
Lua
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
|