From 8295b2e4b6730038530fcabb4bda43a008bfb030 Mon Sep 17 00:00:00 2001 From: Eagle4398 <177400222+Eagle4398@users.noreply.github.com> Date: Wed, 14 May 2025 18:50:55 +0200 Subject: [PATCH] feat(snip): prepend to expanded lines (#15) * changed add_to_newl behavior to auto-indent * commented debug messages * fixed dm inine according to into_newl change * oops. no visual doubling with inline dm * in theory indent and prepend block functionality... * parameter switch * comments * added prepend parameters to intonewl * refinement * necessary changes for dm snippet * backup in comment * style: format code * refactor: remove commented code --------- Co-authored-by: Arne <73391160+arne314@users.noreply.github.com> --- lua/typstar/autosnippets.lua | 91 +++++++++++++++++++++++++++++++-- lua/typstar/snippets/markup.lua | 3 +- 2 files changed, 89 insertions(+), 5 deletions(-) diff --git a/lua/typstar/autosnippets.lua b/lua/typstar/autosnippets.lua index 8e73b96..c7d9a79 100644 --- a/lua/typstar/autosnippets.lua +++ b/lua/typstar/autosnippets.lua @@ -95,17 +95,100 @@ function M.start_snip(trigger, expand, insert, condition, priority, trigOptions) return M.snip('^(\\s*)' .. trigger, '<>' .. expand, { M.cap(1), unpack(insert) }, condition, priority, trigOptions) end -function M.start_snip_in_newl(trigger, expand, insert, condition, priority, trigOptions) +-- Allows to pass expand string and insert table to either indent each line +-- dynamically of the captured group indent, and or prepend to each line after the indent +-- For example prepend = '-- ' in lua. +-- indent: boolean to turn off indenting (option can't be set off right now) +-- prepend: prepend string +function M.blocktransform(expand, insert, prepend, indent) + -- if idiomatic, skip + if indent ~= nil and not indent and not prepend then return expand, insert end + + -- defaults / setup + if indent == nil then indent = true end + prepend = prepend or '' + local last_newl_index = 0 + local modified_expand = expand + function shallowClone(original) + local copy = {} + for key, value in pairs(original) do + copy[key] = value + end + return copy + end + + local modified_insert = shallowClone(insert) + local newl_count = 0 + local offset = 0 + + -- logic + while true do + -- break if no \n anymore + local new_newl_index = string.find(expand, '\n', last_newl_index + 1) + if not new_newl_index then break end + newl_count = newl_count + 1 + + -- insert the prepend and newl at the correct position + local insert_pos = new_newl_index + offset + 1 + modified_expand = string.sub(modified_expand, 1, insert_pos - 1) + .. (indent and '<>' or '') + .. prepend + .. string.sub(modified_expand, insert_pos) + offset = offset + (indent and 2 or 0) + #prepend + + -- indent of course needs to be added as a dynamic function + if indent then + local substring = string.sub(modified_expand, 1, insert_pos + 1) + local count = 0 + + local _, occurrences = string.gsub(substring, '<>', '') + count = occurrences + table.insert(modified_insert, count, M.leading_white_spaces(1)) + end + + last_newl_index = new_newl_index + end + return modified_expand, modified_insert +end + +function M.snip_after_transform(trigger, expand, insert, condition, priority, prependlines, trigOptions) + local expand, insert = M.blocktransform(expand, insert, prependlines, true) return M.snip( - '([^\\s]\\s+)' .. trigger, - '<>\n<>' .. expand, - { M.cap(1), M.leading_white_spaces(1), unpack(insert) }, + trigger, + expand, + insert, condition, priority, vim.tbl_deep_extend('keep', { wordTrig = false }, trigOptions or {}) ) end +function M.start_snip_in_newl(trigger, expand, insert, condition, priority, prepend, prependlines, trigOptions) + prepend = prepend or '' + return M.snip_after_transform( + '([^\\s]\\s+)' .. trigger, + '<><>\n' .. expand, + { M.cap(1), prepend, unpack(insert) }, + condition, + priority, + prependlines, + trigOptions + ) +end + +function M.bulletpoint_snip(trigger, expand, insert, condition, priority, prepend, prependlines, trigOptions) + prepend = prepend or '' + return M.snip_after_transform( + '(^\\s*\\-\\s+.*\\s*)' .. trigger, + '<><>' .. expand, + { M.cap(1), prepend, unpack(insert) }, + condition, + priority, + prependlines, + trigOptions + ) +end + local alts_regex = '[\\[\\(](.*|.*)[\\)\\]]' function M.engine(trigger, opts) diff --git a/lua/typstar/snippets/markup.lua b/lua/typstar/snippets/markup.lua index 0ca394c..02b5257 100644 --- a/lua/typstar/snippets/markup.lua +++ b/lua/typstar/snippets/markup.lua @@ -45,7 +45,8 @@ end return { start('dm', '$\n<>\n<>$', { indent_visual(1), cap(1) }, markup), - helper.start_snip_in_newl('dm', '$\n<>\n<>$', { indent_visual(1), helper.leading_white_spaces(1) }, markup), + helper.start_snip_in_newl('dm', '$\n\t<>\n$ <>', { helper.visual(1), i(2) }, markup, 999), + helper.bulletpoint_snip('dm', '\n$\n\t<>\n$ <>', { helper.visual(1), i(2) }, markup, 1001, '', '\t'), start('fla', '#flashcard(0)[<>][\n<>\n<>]', { i(1, 'flashcard'), indent_visual(2), cap(1) }, markup), start('flA', '#flashcard(0, "<>")[\n<>\n<>]', { i(1, 'flashcard'), indent_visual(2), cap(1) }, markup), snip('IMP', '$==>>$ ', {}, markup),