diff --git a/lua/typstar/autosnippets.lua b/lua/typstar/autosnippets.lua index 1dd4052..98064b3 100644 --- a/lua/typstar/autosnippets.lua +++ b/lua/typstar/autosnippets.lua @@ -32,6 +32,16 @@ function M.cap(i) return luasnip.function_node(function(_, snip) return snip.captures[i] end) end +function M.leading_white_spaces(i) + -- isolate whitespaces of captured group + return luasnip.function_node(function(_, snip) + local capture = snip.captures[i] or '' -- Return capture or empty string if nil + -- Extract only leading whitespace using pattern matching + local whitespace = capture:match('^%s*') or '' + return whitespace + end) +end + function M.visual(idx, default) default = default or '' return luasnip.dynamic_node(idx, function(args, parent) @@ -70,6 +80,17 @@ function M.start_snip(trigger, expand, insert, condition, priority) return M.snip('^(\\s*)' .. trigger, '<>' .. expand, { M.cap(1), unpack(insert) }, condition, priority) end +function M.start_snip_in_newl(trigger, expand, insert, condition, priority) + return M.snip( + '([^\\s]\\s+)' .. trigger, + '<>\n<>' .. expand, + { M.cap(1), M.leading_white_spaces(1), unpack(insert) }, + condition, + priority, + false + ) +end + local alts_regex = '[\\[\\(](.*|.*)[\\)\\]]' function M.engine(trigger, opts) diff --git a/lua/typstar/snippets/markup.lua b/lua/typstar/snippets/markup.lua index 5218ce7..93af10d 100644 --- a/lua/typstar/snippets/markup.lua +++ b/lua/typstar/snippets/markup.lua @@ -43,6 +43,12 @@ end return { start('dm', '$\n<>\t<>\n<>$', { cap(1), visual(1), cap(1) }, markup), + helper.start_snip_in_newl( + 'dm', + '$\n<>\t<>\n<>$', + { helper.leading_white_spaces(1), visual(1), helper.leading_white_spaces(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),