feat: add gleam formatting and snippets
parent
ad8ff7d016
commit
09caae2e4e
|
@ -11,10 +11,19 @@ local formatters_by_ft = {
|
||||||
sh = { "shfmt" },
|
sh = { "shfmt" },
|
||||||
toml = { "taplo" },
|
toml = { "taplo" },
|
||||||
yaml = { "yamlfix" },
|
yaml = { "yamlfix" },
|
||||||
|
gleam = { "gleam" },
|
||||||
}
|
}
|
||||||
|
|
||||||
conform.setup({
|
conform.setup({
|
||||||
formatters_by_ft = formatters_by_ft,
|
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)
|
vim.api.nvim_create_user_command("Format", function(opts)
|
||||||
|
|
|
@ -28,7 +28,7 @@ cmp.setup({
|
||||||
["<Tab>"] = cmp.mapping(function(fallback)
|
["<Tab>"] = cmp.mapping(function(fallback)
|
||||||
if cmp.visible() then
|
if cmp.visible() then
|
||||||
cmp.select_next_item({ behavior = cmp.SelectBehavior.Select })
|
cmp.select_next_item({ behavior = cmp.SelectBehavior.Select })
|
||||||
elseif luasnip.jumpable(1) then
|
elseif luasnip.locally_jumpable(1) then
|
||||||
luasnip.jump(1)
|
luasnip.jump(1)
|
||||||
else
|
else
|
||||||
fallback()
|
fallback()
|
||||||
|
@ -37,7 +37,7 @@ cmp.setup({
|
||||||
["<S-Tab>"] = cmp.mapping(function(fallback)
|
["<S-Tab>"] = cmp.mapping(function(fallback)
|
||||||
if cmp.visible() then
|
if cmp.visible() then
|
||||||
cmp.select_prev_item({ behavior = cmp.SelectBehavior.Select })
|
cmp.select_prev_item({ behavior = cmp.SelectBehavior.Select })
|
||||||
elseif luasnip.jumpable(-1) then
|
elseif luasnip.locally_jumpable(-1) then
|
||||||
luasnip.jump(-1)
|
luasnip.jump(-1)
|
||||||
else
|
else
|
||||||
fallback()
|
fallback()
|
||||||
|
|
|
@ -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,
|
||||||
|
}
|
Loading…
Reference in New Issue