From 6c23cba4bc30377424765c19fed09cb8bbdcaaf0 Mon Sep 17 00:00:00 2001 From: arne314 <73391160+arne314@users.noreply.github.com> Date: Wed, 8 Jan 2025 17:59:40 +0100 Subject: [PATCH] feat(snip): markup wrapping snippets --- lua/typstar/autosnippets.lua | 20 +++++++----- lua/typstar/config.lua | 2 +- lua/typstar/snippets/document.lua | 36 --------------------- lua/typstar/snippets/markup.lua | 52 +++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 44 deletions(-) delete mode 100644 lua/typstar/snippets/document.lua create mode 100644 lua/typstar/snippets/markup.lua diff --git a/lua/typstar/autosnippets.lua b/lua/typstar/autosnippets.lua index ef9b780..44ca4e2 100644 --- a/lua/typstar/autosnippets.lua +++ b/lua/typstar/autosnippets.lua @@ -31,12 +31,18 @@ function M.cap(i) return luasnip.function_node(function(_, snip) return snip.captures[i] end) end -function M.get_visual(args, parent) - if (#parent.snippet.env.LS_SELECT_RAW > 0) then - return luasnip.snippet_node(nil, luasnip.insert_node(1, parent.snippet.env.LS_SELECT_RAW)) - else -- If LS_SELECT_RAW is empty, return a blank insert node - return luasnip.snippet_node(nil, luasnip.insert_node(1)) - end +function M.visual(idx, default) + default = default or '' + return luasnip.dynamic_node( + idx, + function(args, parent) + if (#parent.snippet.env.LS_SELECT_RAW > 0) then + return luasnip.snippet_node(nil, luasnip.text_node(parent.snippet.env.LS_SELECT_RAW)) + else -- If LS_SELECT_RAW is empty, return an insert node + return luasnip.snippet_node(nil, luasnip.insert_node(1, default)) + end + end + ) end function M.ri(insert_node_id) @@ -62,7 +68,7 @@ function M.snip(trigger, expand, insert, condition, priority, wordTrig) end function M.start_snip(trigger, expand, insert, condition, priority) - return M.snip('^\\s*' .. trigger, expand, insert, condition, priority) + return M.snip('^(\\s*)' .. trigger, '<>' .. expand, { M.cap(1), unpack(insert) }, condition, priority) end function M.engine(trigger, opts) diff --git a/lua/typstar/config.lua b/lua/typstar/config.lua index c8530b2..7ee2401 100644 --- a/lua/typstar/config.lua +++ b/lua/typstar/config.lua @@ -19,10 +19,10 @@ local default_config = { snippets = { enable = true, modules = { -- enable modules from ./snippets - 'document', 'letters', 'math', 'matrix', + 'markup', 'visual', } }, diff --git a/lua/typstar/snippets/document.lua b/lua/typstar/snippets/document.lua deleted file mode 100644 index 63dbd3c..0000000 --- a/lua/typstar/snippets/document.lua +++ /dev/null @@ -1,36 +0,0 @@ -local ls = require('luasnip') -local i = ls.insert_node -local d = ls.dynamic_node - -local helper = require('typstar.autosnippets') -local snip = helper.snip -local start = helper.start_snip -local markup = helper.in_markup - - -local ctheorems = { - { 'tem', 'theorem', markup }, - { 'pro', 'proof', markup }, - { 'axi', 'axiom', markup }, - { 'cor', 'corollary', markup }, - { 'lem', 'lemma', markup }, - { 'def', 'definition', markup }, - { 'exa', 'example', markup }, - { 'rem', 'remark', markup }, -} - -local ctheoremsstr = '#%s[\n\t<>\n]' -local document_snippets = {} - -for _, val in pairs(ctheorems) do - local snippet = start(val[1], string.format(ctheoremsstr, val[2]), { i(1) }, val[3]) - table.insert(document_snippets, snippet) -end - -return { - start('dm', '$\n\t<>\n$', { i(1) }, markup), - snip('ll', ' $<>$', { i(1, '1+1') }, markup), - start('fla', '#flashcard(0)[<>][\n\t<>\n]', { i(1, "flashcard"), i(2) }, markup), - start('flA', '#flashcard(0, "<>")[\n\t<>\n]', { i(1, "flashcard"), i(2) }, markup), - unpack(document_snippets), -} diff --git a/lua/typstar/snippets/markup.lua b/lua/typstar/snippets/markup.lua new file mode 100644 index 0000000..2daeb1e --- /dev/null +++ b/lua/typstar/snippets/markup.lua @@ -0,0 +1,52 @@ +local ls = require('luasnip') +local i = ls.insert_node + +local helper = require('typstar.autosnippets') +local cap = helper.cap +local markup = helper.in_markup +local visual = helper.visual +local snip = helper.snip +local start = helper.start_snip + + +local ctheorems = { + { 'tem', 'theorem' }, + { 'pro', 'proof' }, + { 'axi', 'axiom' }, + { 'cor', 'corollary' }, + { 'lem', 'lemma' }, + { 'def', 'definition' }, + { 'exa', 'example' }, + { 'rem', 'remark' }, +} + +local wrappings = { + { 'll', '$', '$', '1+1' }, + { 'BLD', '*', '*', 'abc' }, + { 'ITL', '_', '_', 'abc' }, + { 'HIG', '#highlight[', ']', 'abc' }, + { 'UND', '#underline[', ']', 'abc' }, +} + +local document_snippets = {} +local ctheoremsstr = '#%s[\n<>\t<>\n<>]' +local wrappingsstr = '%s<>%s' + +for _, val in pairs(ctheorems) do + local snippet = start(val[1], string.format(ctheoremsstr, val[2]), { cap(1), visual(1), cap(1) }, markup) + table.insert(document_snippets, snippet) +end + +for _, val in pairs(wrappings) do + local snippet = snip(val[1], string.format(wrappingsstr, val[2], val[3]), { visual(1, val[4]) }, markup) + table.insert(document_snippets, snippet) +end + +return { + start('dm', '$\n<>\t<>\n<>$', { cap(1), visual(1), cap(1) }, markup), + start('fla', '#flashcard(0)[<>][\n<>\t<>\n<>]', { i(1, "flashcard"), cap(1), visual(2), cap(1) }, markup), + start('flA', '#flashcard(0, "<>")[\n<>\t<>\n<>]', { i(1, "flashcard"), cap(1), visual(2), cap(1) }, markup), + snip('IMP', '$=>>$ ', {}, markup), + snip('IFF', '$<<=>>$ ', {}, markup), + unpack(document_snippets), +}