From 09caae2e4ea915f7886b14711144a3f6333c4d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20B=C3=B6hme?= Date: Sat, 2 Mar 2024 13:54:08 +0100 Subject: [PATCH] feat: add gleam formatting and snippets --- modules/programs/nvim/plugins/lua/conform.lua | 9 ++ .../programs/nvim/plugins/lua/nvim-cmp.lua | 4 +- .../programs/nvim/plugins/snippets/gleam.lua | 120 ++++++++++++++++++ 3 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 modules/programs/nvim/plugins/snippets/gleam.lua diff --git a/modules/programs/nvim/plugins/lua/conform.lua b/modules/programs/nvim/plugins/lua/conform.lua index a7156e7..2675177 100644 --- a/modules/programs/nvim/plugins/lua/conform.lua +++ b/modules/programs/nvim/plugins/lua/conform.lua @@ -11,10 +11,19 @@ local formatters_by_ft = { sh = { "shfmt" }, toml = { "taplo" }, yaml = { "yamlfix" }, + gleam = { "gleam" }, } conform.setup({ formatters_by_ft = formatters_by_ft, + formatters = { + gleam = { + command = "gleam", + args = { "format", "--stdin" }, + stdin = true, + cwd = require("conform.util").root_file({ "gleam.toml" }), + }, + }, }) vim.api.nvim_create_user_command("Format", function(opts) diff --git a/modules/programs/nvim/plugins/lua/nvim-cmp.lua b/modules/programs/nvim/plugins/lua/nvim-cmp.lua index 19d9ffe..04b3daa 100644 --- a/modules/programs/nvim/plugins/lua/nvim-cmp.lua +++ b/modules/programs/nvim/plugins/lua/nvim-cmp.lua @@ -28,7 +28,7 @@ cmp.setup({ [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) - elseif luasnip.jumpable(1) then + elseif luasnip.locally_jumpable(1) then luasnip.jump(1) else fallback() @@ -37,7 +37,7 @@ cmp.setup({ [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item({ behavior = cmp.SelectBehavior.Select }) - elseif luasnip.jumpable(-1) then + elseif luasnip.locally_jumpable(-1) then luasnip.jump(-1) else fallback() diff --git a/modules/programs/nvim/plugins/snippets/gleam.lua b/modules/programs/nvim/plugins/snippets/gleam.lua new file mode 100644 index 0000000..94835bb --- /dev/null +++ b/modules/programs/nvim/plugins/snippets/gleam.lua @@ -0,0 +1,120 @@ +local ls = require("luasnip") +local s = ls.snippet +local sn = ls.snippet_node +local isn = ls.indent_snippet_node +local t = ls.text_node +local i = ls.insert_node +local f = ls.function_node +local c = ls.choice_node +local d = ls.dynamic_node +local r = ls.restore_node +local events = require("luasnip.util.events") +local ai = require("luasnip.nodes.absolute_indexer") +local extras = require("luasnip.extras") +local l = extras.lambda +local rep = extras.rep +local p = extras.partial +local m = extras.match +local n = extras.nonempty +local dl = extras.dynamic_lambda +local fmt = require("luasnip.extras.fmt").fmt +local fmta = require("luasnip.extras.fmt").fmta +local conds = require("luasnip.extras.expand_conditions") +local postfix = require("luasnip.extras.postfix").postfix +local types = require("luasnip.util.types") +local parse = require("luasnip.util.parser").parse_snippet +local ms = ls.multi_snippet +local k = require("luasnip.nodes.key_indexer").new_key +local matches = require("luasnip.extras.postfix").matches + +local case_template = [[ +case {expression} {{ + {pattern1} -> {result1} + {pattern2} -> {result2}{final} +}} +]] + +local dot_case = postfix({ filetype = "gleam", trig = ".case", match_pattern = matches.line }, { + d(1, function(_, parent) + return sn( + 1, + fmt(case_template, { + expression = t(parent.env.POSTFIX_MATCH), + pattern1 = i(1, "pattern"), + result1 = i(2, "todo"), + pattern2 = i(3, "_"), + result2 = i(4, "todo"), + final = i(0), + }) + ) + end), +}) + +local case = s( + { filetype = "gleam", trig = "case" }, + fmt(case_template, { + expression = i(1), + pattern1 = i(2), + result1 = i(3, "todo"), + pattern2 = i(4, "_"), + result2 = i(5, "todo"), + final = i(0), + }) +) + +local fn_template = [[ +fn {name}({args}) -> {rtype} {{ + {body} +}} +]] + +local fn = s( + { filetype = "gleam", trig = "fn" }, + fmt(fn_template, { + name = i(1), + args = i(2), + rtype = i(3), + body = i(0), + }) +) + +local pfn = s( + { filetype = "gleam", trig = "pfn" }, + fmt("pub " .. fn_template, { + name = i(1), + args = i(2), + rtype = i(3), + body = i(0), + }) +) + +local type_template = [[ +type {name} {{ + {body} +}} +]] + +local type = s( + { filetype = "gleam", trig = "type" }, + fmt(type_template, { + name = i(1), + body = i(0), + }) +) + +local ptype = s( + { filetype = "gleam", trig = "ptype" }, + fmt("pub " .. type_template, { + name = i(1), + body = i(0), + }) +) + +return { + case, + dot_case, + fn, + pfn, + type, + ptype, +}