├── README.md ├── cmp-config.lua ├── luasnip-config └── init.lua └── snippets ├── boilerplate.lua ├── javascript.lua ├── lua.lua ├── markdown.lua └── plantuml.lua /README.md: -------------------------------------------------------------------------------- 1 | # LuaSnip Tutorial 2 | This is a repository to host example snippet files for my LuaSnip tutorials 3 | --- 4 | ![thumbnail 2-4](https://user-images.githubusercontent.com/102876811/165835165-85f4fc32-7dd7-4e6e-9871-49cf528a3148.jpg) 5 | -------------------------------------------------------------------------------- /cmp-config.lua: -------------------------------------------------------------------------------- 1 | local cmp = require("cmp") 2 | local luasnip = require("luasnip") 3 | 4 | --   פּ ﯟ   some other good icons 5 | local kind_icons = { 6 | Text = "", 7 | Method = "m", 8 | Function = "", 9 | Constructor = "", 10 | Field = "", 11 | Variable = "", 12 | Class = "", 13 | Interface = "", 14 | Module = "", 15 | Property = "", 16 | Unit = "", 17 | Value = "", 18 | Enum = "", 19 | Keyword = "", 20 | Snippet = "", 21 | Color = "", 22 | File = "", 23 | Reference = "", 24 | Folder = "", 25 | EnumMember = "", 26 | Constant = "", 27 | Struct = "", 28 | Event = "", 29 | Operator = "", 30 | TypeParameter = "", 31 | } 32 | -- find more here: https://www.nerdfonts.com/cheat-sheet 33 | 34 | cmp.setup({ 35 | snippet = { 36 | expand = function(args) 37 | luasnip.lsp_expand(args.body) -- For `luasnip` users. 38 | end, 39 | }, 40 | mapping = { 41 | [""] = cmp.mapping.select_prev_item(), 42 | [""] = cmp.mapping.select_next_item(), 43 | [""] = cmp.mapping.select_prev_item(), 44 | [""] = cmp.mapping.select_next_item(), 45 | [""] = cmp.mapping.confirm({ select = true }), 46 | -- [""] = cmp.mapping(cmp.mapping.scroll_docs(-1), { "i", "c" }), 47 | -- [""] = cmp.mapping(cmp.mapping.scroll_docs(1), { "i", "c" }), 48 | -- [""] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }), 49 | -- [""] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `` mapping. 50 | [""] = cmp.mapping({ 51 | i = cmp.mapping.abort(), 52 | c = cmp.mapping.close(), 53 | }), 54 | -- -- Accept currently selected item. If none selected, `select` first item. 55 | -- -- Set `select` to `false` to only confirm explicitly selected items. 56 | [""] = cmp.mapping.confirm({ select = false }), 57 | -- [""] = cmp.mapping.confirm({ select = false }), 58 | [""] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }), 59 | -- -- [""] = cmp.mapping(function(fallback) 60 | -- -- if cmp.visible() then 61 | -- -- cmp.select_next_item() 62 | -- -- else 63 | -- -- fallback() 64 | -- -- end 65 | -- -- end, { 66 | -- -- "i", 67 | -- -- "s", 68 | -- -- }), 69 | -- -- [""] = cmp.mapping(function(fallback) 70 | -- -- if cmp.visible() then 71 | -- -- cmp.select_prev_item() 72 | -- -- elseif luasnip.jumpable(-1) then 73 | -- -- luasnip.jump(-1) 74 | -- -- else 75 | -- -- fallback() 76 | -- -- end 77 | -- -- end, { 78 | -- -- "i", 79 | -- -- "s", 80 | -- -- }), 81 | }, 82 | formatting = { 83 | fields = { "kind", "abbr", "menu" }, 84 | format = function(entry, vim_item) 85 | -- Kind icons 86 | vim_item.kind = string.format("%s", kind_icons[vim_item.kind]) 87 | -- vim_item.kind = string.format('%s %s', kind_icons[vim_item.kind], vim_item.kind) -- This concatonates the icons with the name of the item kind 88 | vim_item.menu = ({ 89 | copilot = "[Copilot]", 90 | luasnip = "LuaSnip", 91 | nvim_lua = "[NVim Lua]", 92 | nvim_lsp = "[LSP]", 93 | buffer = "[Buffer]", 94 | path = "[Path]", 95 | })[entry.source.name] 96 | return vim_item 97 | end, 98 | }, 99 | sources = { 100 | { name = "luasnip" }, 101 | { name = "copilot" }, 102 | { name = "nvim_lsp", max_item_count = 6 }, 103 | { name = "nvim_lua" }, 104 | { name = "path" }, 105 | { name = "buffer", max_item_count = 6 }, 106 | }, 107 | confirm_opts = { 108 | behavior = cmp.ConfirmBehavior.Replace, 109 | select = false, 110 | }, 111 | -- documentation = { 112 | -- border = { "╭", "─", "╮", "│", "╯", "─", "╰", "│" }, 113 | -- }, 114 | -- experimental = { 115 | -- ghost_text = true, 116 | -- native_menu = false, 117 | -- }, 118 | }) 119 | -------------------------------------------------------------------------------- /luasnip-config/init.lua: -------------------------------------------------------------------------------- 1 | local ls = require("luasnip") --{{{ 2 | 3 | -- require("luasnip.loaders.from_vscode").lazy_load() 4 | require("luasnip.loaders.from_lua").load({ paths = "~/.config/nvim/snippets/" }) 5 | require("luasnip").config.setup({ store_selection_keys = "" }) 6 | 7 | vim.cmd([[command! LuaSnipEdit :lua require("luasnip.loaders.from_lua").edit_snippet_files()]]) --}}} 8 | 9 | -- Virtual Text{{{ 10 | local types = require("luasnip.util.types") 11 | ls.config.set_config({ 12 | history = true, --keep around last snippet local to jump back 13 | updateevents = "TextChanged,TextChangedI", --update changes as you type 14 | enable_autosnippets = true, 15 | ext_opts = { 16 | [types.choiceNode] = { 17 | active = { 18 | virt_text = { { "●", "GruvboxOrange" } }, 19 | }, 20 | }, 21 | -- [types.insertNode] = { 22 | -- active = { 23 | -- virt_text = { { "●", "GruvboxBlue" } }, 24 | -- }, 25 | -- }, 26 | }, 27 | }) --}}} 28 | 29 | -- Key Mapping --{{{ 30 | 31 | vim.keymap.set({ "i", "s" }, "", ":w") 32 | vim.keymap.set({ "i", "s" }, "", 'lua require("luasnip.extras.select_choice")()') 33 | 34 | vim.keymap.set({ "i", "s" }, "", function() 35 | if ls.expand_or_jumpable() then 36 | ls.expand() 37 | end 38 | end, { silent = true }) 39 | -- vim.keymap.set({ "i", "s" }, "", function() 40 | -- if ls.expand_or_jumpable() then 41 | -- ls.expand_or_jump() 42 | -- end 43 | -- end, { silent = true }) 44 | -- vim.keymap.set({ "i", "s" }, "", function() 45 | -- if ls.jumpable() then 46 | -- ls.jump(-1) 47 | -- end 48 | -- end, { silent = true }) 49 | 50 | vim.keymap.set({ "i", "s" }, "", "o", { silent = true }) 51 | 52 | vim.keymap.set({ "i", "s" }, "", function() 53 | if ls.jumpable(1) then 54 | ls.jump(1) 55 | end 56 | end, { silent = true }) 57 | vim.keymap.set({ "i", "s" }, "", function() 58 | if ls.jumpable(-1) then 59 | ls.jump(-1) 60 | end 61 | end, { silent = true }) 62 | 63 | vim.keymap.set({ "i", "s" }, "", function() 64 | if ls.choice_active() then 65 | ls.change_choice(1) 66 | else 67 | -- print current time 68 | local t = os.date("*t") 69 | local time = string.format("%02d:%02d:%02d", t.hour, t.min, t.sec) 70 | print(time) 71 | end 72 | end) 73 | vim.keymap.set({ "i", "s" }, "", function() 74 | if ls.choice_active() then 75 | ls.change_choice(-1) 76 | end 77 | end) --}}} 78 | 79 | -- More Settings -- 80 | 81 | vim.keymap.set("n", "", "LuaSnipEdit", { silent = true, noremap = true }) 82 | vim.cmd([[autocmd BufEnter */snippets/*.lua nnoremap /-- End Refactoring --OO]]) 83 | -------------------------------------------------------------------------------- /snippets/boilerplate.lua: -------------------------------------------------------------------------------- 1 | local ls = require("luasnip") --{{{ 2 | local s = ls.s 3 | local i = ls.i 4 | local t = ls.t 5 | 6 | local d = ls.dynamic_node 7 | local c = ls.choice_node 8 | local f = ls.function_node 9 | local sn = ls.snippet_node 10 | 11 | local fmt = require("luasnip.extras.fmt").fmt 12 | local rep = require("luasnip.extras").rep 13 | 14 | local snippets, autosnippets = {}, {} --}}} 15 | 16 | local group = vim.api.nvim_create_augroup("Lua Snippets", { clear = true }) 17 | local file_pattern = "*.lua" 18 | 19 | local function cs(trigger, nodes, opts) --{{{ 20 | local snippet = s(trigger, nodes) 21 | local target_table = snippets 22 | 23 | local pattern = file_pattern 24 | local keymaps = {} 25 | 26 | if opts ~= nil then 27 | -- check for custom pattern 28 | if opts.pattern then 29 | pattern = opts.pattern 30 | end 31 | 32 | -- if opts is a string 33 | if type(opts) == "string" then 34 | if opts == "auto" then 35 | target_table = autosnippets 36 | else 37 | table.insert(keymaps, { "i", opts }) 38 | end 39 | end 40 | 41 | -- if opts is a table 42 | if opts ~= nil and type(opts) == "table" then 43 | for _, keymap in ipairs(opts) do 44 | if type(keymap) == "string" then 45 | table.insert(keymaps, { "i", keymap }) 46 | else 47 | table.insert(keymaps, keymap) 48 | end 49 | end 50 | end 51 | 52 | -- set autocmd for each keymap 53 | if opts ~= "auto" then 54 | for _, keymap in ipairs(keymaps) do 55 | vim.api.nvim_create_autocmd("BufEnter", { 56 | pattern = pattern, 57 | group = group, 58 | callback = function() 59 | vim.keymap.set(keymap[1], keymap[2], function() 60 | ls.snip_expand(snippet) 61 | end, { noremap = true, silent = true, buffer = true }) 62 | end, 63 | }) 64 | end 65 | end 66 | end 67 | 68 | table.insert(target_table, snippet) -- insert snippet into appropriate table 69 | end --}}} 70 | 71 | -- Start Refactoring -- 72 | 73 | -- End Refactoring -- 74 | 75 | return snippets, autosnippets 76 | -------------------------------------------------------------------------------- /snippets/javascript.lua: -------------------------------------------------------------------------------- 1 | local ls = require("luasnip") --{{{ 2 | local s = ls.s 3 | local i = ls.i 4 | local t = ls.t 5 | 6 | local d = ls.dynamic_node 7 | local c = ls.choice_node 8 | local f = ls.function_node 9 | local sn = ls.snippet_node 10 | 11 | local fmt = require("luasnip.extras.fmt").fmt 12 | local rep = require("luasnip.extras").rep 13 | 14 | local snippets, autosnippets = {}, {} --}}} 15 | 16 | local group = vim.api.nvim_create_augroup("Javascript Snippets", { clear = true }) 17 | local file_pattern = "*.js" 18 | 19 | local function cs(trigger, nodes, opts) --{{{ 20 | local snippet = s(trigger, nodes) 21 | local target_table = snippets 22 | 23 | local pattern = file_pattern 24 | local keymaps = {} 25 | 26 | if opts ~= nil then 27 | -- check for custom pattern 28 | if opts.pattern then 29 | pattern = opts.pattern 30 | end 31 | 32 | -- if opts is a string 33 | if type(opts) == "string" then 34 | if opts == "auto" then 35 | target_table = autosnippets 36 | else 37 | table.insert(keymaps, { "i", opts }) 38 | end 39 | end 40 | 41 | -- if opts is a table 42 | if opts ~= nil and type(opts) == "table" then 43 | for _, keymap in ipairs(opts) do 44 | if type(keymap) == "string" then 45 | table.insert(keymaps, { "i", keymap }) 46 | else 47 | table.insert(keymaps, keymap) 48 | end 49 | end 50 | end 51 | 52 | -- set autocmd for each keymap 53 | if opts ~= "auto" then 54 | for _, keymap in ipairs(keymaps) do 55 | vim.api.nvim_create_autocmd("BufEnter", { 56 | pattern = pattern, 57 | group = group, 58 | callback = function() 59 | vim.keymap.set(keymap[1], keymap[2], function() 60 | ls.snip_expand(snippet) 61 | end, { noremap = true, silent = true, buffer = true }) 62 | end, 63 | }) 64 | end 65 | end 66 | end 67 | 68 | table.insert(target_table, snippet) -- insert snippet into appropriate table 69 | end --}}} 70 | 71 | -- Old Style -- 72 | 73 | local if_fmt_arg = { --{{{ 74 | i(1, ""), 75 | c(2, { i(1, "LHS"), i(1, "10") }), 76 | c(3, { i(1, "==="), i(1, "<"), i(1, ">"), i(1, "<="), i(1, ">="), i(1, "!==") }), 77 | i(4, "RHS"), 78 | i(5, "//TODO:"), 79 | } 80 | local if_fmt_1 = fmt( 81 | [[ 82 | {}if ({} {} {}) {}; 83 | ]], 84 | vim.deepcopy(if_fmt_arg) 85 | ) 86 | local if_fmt_2 = fmt( 87 | [[ 88 | {}if ({} {} {}) {{ 89 | {}; 90 | }} 91 | ]], 92 | vim.deepcopy(if_fmt_arg) 93 | ) 94 | 95 | local if_snippet = s( 96 | { trig = "IF", regTrig = false, hidden = true }, 97 | c(1, { 98 | if_fmt_1, 99 | if_fmt_2, 100 | }) 101 | ) --}}} 102 | local function_fmt = fmt( --{{{ 103 | [[ 104 | function {}({}) {{ 105 | {} 106 | }} 107 | ]], 108 | { 109 | i(1, "myFunc"), 110 | c(2, { i(1, "arg"), i(1, "") }), 111 | i(3, "//TODO:"), 112 | } 113 | ) 114 | 115 | local function_snippet = s({ trig = "f[un]?", regTrig = true, hidden = true }, function_fmt) 116 | local function_snippet_func = s({ trig = "func" }, vim.deepcopy(function_fmt)) --}}} 117 | 118 | local short_hand_if_fmt = fmt( --{{{ 119 | [[ 120 | if ({}) {} 121 | {} 122 | ]], 123 | { 124 | d(1, function(_, snip) 125 | -- return sn(1, i(1, snip.captures[1])) 126 | return sn(1, t(snip.captures[1])) 127 | end), 128 | d(2, function(_, snip) 129 | return sn(2, t(snip.captures[2])) 130 | end), 131 | i(3, ""), 132 | } 133 | ) 134 | local short_hand_if_statement = s({ trig = "if[>%s](.+)>>(.+)\\", regTrig = true, hidden = true }, short_hand_if_fmt) 135 | 136 | local short_hand_if_statement_return_shortcut = s({ trig = "(if[>%s].+>>)[r<]", regTrig = true, hidden = true }, { 137 | f(function(_, snip) 138 | return snip.captures[1] 139 | end), 140 | t("return "), 141 | }) --}}} 142 | table.insert(autosnippets, if_snippet) 143 | table.insert(autosnippets, short_hand_if_statement) 144 | table.insert(autosnippets, short_hand_if_statement_return_shortcut) 145 | table.insert(snippets, function_snippet) 146 | table.insert(snippets, function_snippet_func) 147 | 148 | -- Begin Refactoring -- 149 | 150 | cs( -- for([%w_]+) JS For Loop snippet{{{ 151 | { trig = "for([%w_]+)", regTrig = true, hidden = true }, 152 | fmt( 153 | [[ 154 | for (let {} = 0; {} < {}; {}++) {{ 155 | {} 156 | }} 157 | 158 | {} 159 | ]], 160 | { 161 | d(1, function(_, snip) 162 | return sn(1, i(1, snip.captures[1])) 163 | end), 164 | rep(1), 165 | c(2, { i(1, "num"), sn(1, { i(1, "arr"), t(".length") }) }), 166 | rep(1), 167 | i(3, "// TODO:"), 168 | i(4), 169 | } 170 | ) 171 | ) --}}} 172 | cs( -- [while] JS While Loop snippet{{{ 173 | "while", 174 | fmt( 175 | [[ 176 | while ({}) {{ 177 | {} 178 | }} 179 | ]], 180 | { 181 | i(1, ""), 182 | i(2, "// TODO:"), 183 | } 184 | ) 185 | ) --}}} 186 | cs("cl", { t("console.log("), i(1, ""), t(")") }, { "jcl", "jj" }) -- console.log 187 | 188 | -- End Refactoring -- 189 | 190 | return snippets, autosnippets 191 | -------------------------------------------------------------------------------- /snippets/lua.lua: -------------------------------------------------------------------------------- 1 | local ls = require("luasnip") --{{{ 2 | local s = ls.s --> snippet 3 | local i = ls.i --> insert node 4 | local t = ls.t --> text node 5 | 6 | local d = ls.dynamic_node 7 | local c = ls.choice_node 8 | local f = ls.function_node 9 | local sn = ls.snippet_node 10 | 11 | local fmt = require("luasnip.extras.fmt").fmt 12 | local rep = require("luasnip.extras").rep 13 | 14 | local snippets, autosnippets = {}, {} --}}} 15 | 16 | local group = vim.api.nvim_create_augroup("Lua Snippets", { clear = true }) 17 | local file_pattern = "*.lua" 18 | 19 | local function cs(trigger, nodes, opts) --{{{ 20 | local snippet = s(trigger, nodes) 21 | local target_table = snippets 22 | 23 | local pattern = file_pattern 24 | local keymaps = {} 25 | 26 | if opts ~= nil then 27 | -- check for custom pattern 28 | if opts.pattern then 29 | pattern = opts.pattern 30 | end 31 | 32 | -- if opts is a string 33 | if type(opts) == "string" then 34 | if opts == "auto" then 35 | target_table = autosnippets 36 | else 37 | table.insert(keymaps, { "i", opts }) 38 | end 39 | end 40 | 41 | -- if opts is a table 42 | if opts ~= nil and type(opts) == "table" then 43 | for _, keymap in ipairs(opts) do 44 | if type(keymap) == "string" then 45 | table.insert(keymaps, { "i", keymap }) 46 | else 47 | table.insert(keymaps, keymap) 48 | end 49 | end 50 | end 51 | 52 | -- set autocmd for each keymap 53 | if opts ~= "auto" then 54 | for _, keymap in ipairs(keymaps) do 55 | vim.api.nvim_create_autocmd("BufEnter", { 56 | pattern = pattern, 57 | group = group, 58 | callback = function() 59 | vim.keymap.set(keymap[1], keymap[2], function() 60 | ls.snip_expand(snippet) 61 | end, { noremap = true, silent = true, buffer = true }) 62 | end, 63 | }) 64 | end 65 | end 66 | end 67 | 68 | table.insert(target_table, snippet) -- insert snippet into appropriate table 69 | end --}}} 70 | 71 | -- Start Refactoring -- 72 | 73 | cs("CMD", { -- [CMD] multiline vim.cmd{{{ 74 | t({ "vim.cmd[[", " " }), 75 | i(1, ""), 76 | t({ "", "]]" }), 77 | }) --}}} 78 | cs("cmd", fmt("vim.cmd[[{}]]", { i(1, "") })) -- single line vim.cmd 79 | cs({ -- github import for packer{{{ 80 | trig = "https://github%.com/([%w-%._]+)/([%w-%._]+)!", 81 | regTrig = true, 82 | hidden = true, 83 | }, { 84 | t([[use "]]), 85 | f(function(_, snip) 86 | return snip.captures[1] 87 | end), 88 | t("/"), 89 | f(function(_, snip) 90 | return snip.captures[2] 91 | end), 92 | t({ [["]], "" }), 93 | i(1, ""), 94 | }, "auto") --}}} 95 | 96 | cs( -- {regexSnippet} LuaSnippet{{{ 97 | "regexSnippet", 98 | fmt( 99 | [=[ 100 | cs( -- {} 101 | {{ trig = "{}", regTrig = true, hidden = true }}, fmt([[ 102 | {} 103 | ]], {{ 104 | {} 105 | }})) 106 | ]=], 107 | { 108 | i(1, "Description"), 109 | i(2, ""), 110 | i(3, ""), 111 | i(4, ""), 112 | } 113 | ), 114 | { pattern = "*/snippets/*.lua", "" } 115 | ) --}}} 116 | cs( -- [luaSnippet] LuaSnippet{{{ 117 | "luaSnippet", 118 | fmt( 119 | [=[ 120 | cs("{}", fmt( -- {} 121 | [[ 122 | {} 123 | ]], {{ 124 | {} 125 | }}){}) 126 | ]=], 127 | { 128 | i(1, ""), 129 | i(2, "Description"), 130 | i(3, ""), 131 | i(4, ""), 132 | c(5, { 133 | t(""), 134 | fmt([[, "{}"]], { i(1, "keymap") }), 135 | fmt([[, {{ pattern = "{}", {} }}]], { i(1, "*/snippets/*.lua"), i(2, "keymap") }), 136 | }), 137 | } 138 | ), 139 | { pattern = "*/snippets/*.lua", "jcs" } 140 | ) --}}} 141 | 142 | cs( -- choice_node_snippet luaSnip choice node{{{ 143 | "choice_node_snippet", 144 | fmt( 145 | [[ 146 | c({}, {{ {} }}), 147 | ]], 148 | { 149 | i(1, ""), 150 | i(2, ""), 151 | } 152 | ), 153 | { pattern = "*/snippets/*.lua", "jcn" } 154 | ) --}}} 155 | 156 | cs( -- [function] Lua function snippet{{{ 157 | "function", 158 | fmt( 159 | [[ 160 | function {}({}) 161 | {} 162 | end 163 | ]], 164 | { 165 | i(1, ""), 166 | i(2, ""), 167 | i(3, ""), 168 | } 169 | ), 170 | "jff" 171 | ) --}}} 172 | cs( -- [local_function] Lua function snippet{{{ 173 | "local_function", 174 | fmt( 175 | [[ 176 | local function {}({}) 177 | {} 178 | end 179 | ]], 180 | { 181 | i(1, ""), 182 | i(2, ""), 183 | i(3, ""), 184 | } 185 | ), 186 | "jlf" 187 | ) --}}} 188 | cs( -- [local] Lua local variable snippet{{{ 189 | "local", 190 | fmt( 191 | [[ 192 | local {} = {} 193 | ]], 194 | { i(1, ""), i(2, "") } 195 | ), 196 | "jj" 197 | ) --}}} 198 | 199 | -- Tutorial Snippets go here -- 200 | 201 | -- End Refactoring -- 202 | 203 | return snippets, autosnippets 204 | -------------------------------------------------------------------------------- /snippets/markdown.lua: -------------------------------------------------------------------------------- 1 | local ls = require("luasnip") 2 | local s = ls.s 3 | local i = ls.i 4 | local t = ls.t 5 | 6 | local d = ls.dynamic_node 7 | local c = ls.choice_node 8 | local f = ls.function_node 9 | local sn = ls.snippet_node 10 | 11 | local fmt = require("luasnip.extras.fmt").fmt 12 | local rep = require("luasnip.extras").rep 13 | 14 | -- -- 15 | 16 | local snippets = {} 17 | local autosnippets = {} 18 | 19 | local autocmd = vim.api.nvim_create_autocmd 20 | local augroup = vim.api.nvim_create_augroup 21 | local map = vim.keymap.set 22 | local opts = { noremap = true, silent = true, buffer = true } 23 | local group = augroup("Markdown Snippets", { clear = true }) 24 | 25 | local function cs(trigger, nodes, keymap) --> cs stands for create snippet 26 | local snippet = s(trigger, nodes) 27 | table.insert(snippets, snippet) 28 | 29 | if keymap ~= nil then 30 | local pattern = "*.md" 31 | if type(keymap) == "table" then 32 | pattern = keymap[1] 33 | keymap = keymap[2] 34 | end 35 | autocmd("BufEnter", { 36 | pattern = pattern, 37 | group = group, 38 | callback = function() 39 | map({ "i" }, keymap, function() 40 | ls.snip_expand(snippet) 41 | end, opts) 42 | end, 43 | }) 44 | end 45 | end 46 | 47 | local function lp(package_name) -- Load Package Function 48 | package.loaded[package_name] = nil 49 | return require(package_name) 50 | end 51 | 52 | -- Utility Functions -- 53 | 54 | -- Start Refactoring -- 55 | 56 | -- Start Refactoring -- 57 | 58 | return snippets, autosnippets 59 | -------------------------------------------------------------------------------- /snippets/plantuml.lua: -------------------------------------------------------------------------------- 1 | local ls = require("luasnip") --{{{ 2 | local s = ls.s 3 | local i = ls.i 4 | local t = ls.t 5 | 6 | local d = ls.dynamic_node 7 | local c = ls.choice_node 8 | local f = ls.function_node 9 | local sn = ls.snippet_node 10 | 11 | local fmt = require("luasnip.extras.fmt").fmt 12 | local rep = require("luasnip.extras").rep 13 | 14 | -- -- 15 | 16 | local snippets = {} 17 | local autosnippets = {} 18 | 19 | local autocmd = vim.api.nvim_create_autocmd 20 | local augroup = vim.api.nvim_create_augroup 21 | local map = vim.keymap.set 22 | local opts = { noremap = true, silent = true, buffer = true } 23 | local group = augroup("PlantUML Snippets", { clear = true }) 24 | 25 | local function cs(trigger, nodes, keymap) --> cs stands for create snippet 26 | local snippet = s(trigger, nodes) 27 | table.insert(snippets, snippet) 28 | 29 | if keymap ~= nil then 30 | local pattern = "*.md" 31 | if type(keymap) == "table" then 32 | pattern = keymap[1] 33 | keymap = keymap[2] 34 | end 35 | autocmd("BufEnter", { 36 | pattern = pattern, 37 | group = group, 38 | callback = function() 39 | map({ "i" }, keymap, function() 40 | ls.snip_expand(snippet) 41 | end, opts) 42 | end, 43 | }) 44 | end 45 | end 46 | 47 | local function lp(package_name) -- Load Package Function 48 | package.loaded[package_name] = nil 49 | return require(package_name) 50 | end --}}} 51 | 52 | -- Utility Functions -- 53 | 54 | local function toCamelCase(str) --{{{ 55 | if #str == 0 or str == nil or type(str) == "table" then 56 | return "" 57 | end 58 | 59 | local words = {} 60 | local index = 1 61 | for word in str:gmatch("%w+") do 62 | if index == 1 then 63 | table.insert(words, word:lower()) 64 | else 65 | table.insert(words, word:sub(1, 1):upper() .. word:sub(2):lower()) 66 | end 67 | index = index + 1 68 | end 69 | 70 | return table.concat(words, "") 71 | end --}}} 72 | 73 | local function same_toLowerCase_function(index) --{{{ 74 | return f(function(arg) 75 | return toCamelCase(arg[1][1]) 76 | end, { index }) 77 | end 78 | 79 | local function same_toLowerCase_dynamic(nodes, index) 80 | return d(index, function(arg) 81 | return sn(index, i(1, toCamelCase(arg[1][1]))) 82 | end, { nodes }) 83 | end --}}} 84 | local function previousLine() 85 | local currentLine = vim.api.nvim_win_get_cursor(0) 86 | local prevLine = vim.api.nvim_buf_get_lines(0, currentLine - 1, currentLine, false) 87 | P(prevLine) 88 | end 89 | 90 | -- Start Refactoring -- 91 | 92 | local actor_snippet_fmt = fmt( -- PlantUML Actor Snippet{{{ 93 | [[ 94 | {} "{}" as {} 95 | ]], 96 | { 97 | c(1, { t("actor"), t("usecase") }), 98 | i(2, ""), 99 | same_toLowerCase_dynamic(2, 3), 100 | } 101 | ) 102 | cs("actor_plantUML", actor_snippet_fmt, "jj") --}}} 103 | cs( -- PlantUML Start @startuml Snippet{{{ 104 | "startuml", 105 | fmt( 106 | [[ 107 | @startuml 108 | {} 109 | {} 110 | @enduml 111 | ]], 112 | { 113 | c(1, { t("left to right direction"), t("") }), 114 | i(2, ""), 115 | } 116 | ), 117 | "jks" 118 | ) --}}} 119 | cs( -- PlantUML Direction Snippet{{{ 120 | { trig = "dir", regTrig = true, hidden = true }, 121 | fmt( 122 | [[ 123 | {} 124 | ]], 125 | { c(1, { t("left to right direction"), t("") }) } 126 | ) 127 | ) --}}} 128 | cs( -- Double Arrow Relationship Snippet{{{ 129 | "doubleArrow", 130 | fmt( 131 | [[ 132 | {} {} {} 133 | ]], 134 | { 135 | i(1, "from"), 136 | c(2, { t("-->"), t("<--") }), 137 | i(3, "to"), 138 | } 139 | ), 140 | "jda" 141 | ) --}}} 142 | 143 | -- End Refactoring -- 144 | 145 | return snippets, autosnippets 146 | --------------------------------------------------------------------------------