1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
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 fmt = require("luasnip.extras.fmt").fmt
local m = require("luasnip.extras").m
local lambda = require("luasnip.extras").l
local postfix = require("luasnip.extras.postfix").postfix
local map = vim.api.nvim_set_keymap
local M = {}
local go_snippets = function()
ls.add_snippets("go", {
s(";r", fmt([[
<>, err := <>
if err != nil {
<>
}
]], {
i(1,"ret"), i(2,"fun"), i(3, "return err")
}, {
delimiters = "<>"
})),
s(";e", fmt([[
if <>, <> := <>; <> {
<>
}
]], {
i(1,"v"),i(2,"err"),i(3,"fun"), i(4, "err != nil"), i(5,"return err")
}, {
delimiters = "<>"
})),
s(";fr", fmt([[
for <>, <> := range <> {
<>
}
]], {
i(1,"_"),i(2,"_"), i(3,"iterable"), i(4,"body")
}, {
delimiters = "<>"
})),
s(";sj", fmt([[
<> <> `json:"<>"`
]], {
i(1,"field"),i(2,"type"), d(3, function(args)
for i, line in pairs(args[1]) do
args[1][i] = line:gsub("(%u)", function(ch) return '_' .. ch:lower() end):gsub("^_", '')
end
return sn(nil, {i(1,args[1])})
end,
{1})
}, {
delimiters = "<>"
})),
s(";test", fmt([[
func Test<>(t *testing.T) {
for i, c := range []struct {
expected <>
}{
} {
t.Run(fmt.Sprintf("%d %s", i, c.expected), func(t *testing.T) {
<>
})
}
}
]], {
i(1,"test"),i(2,"type"), i(3,"body")
}, {
delimiters = "<>"
})),
})
end
function M.setup()
go_snippets()
ls.config.setup({
load_ft_func =
-- Also load both lua and json when a markdown-file is opened,
-- javascript for html.
-- Other filetypes just load themselves.
require("luasnip.extras.filetype_functions").extend_load_ft({
markdown = { "lua", "json" },
html = { "javascript" }
})
})
-- press <Tab> to expand or jump in a snippet. These can also be mapped separately
-- via <Plug>luasnip-expand-snippet and <Plug>luasnip-jump-next.
vim.keymap.set(
"i",
"<Tab>",
[[luasnip#expand_or_jumpable() ? '<Plug>luasnip-expand-or-jump' : '<Tab>']],
{ silent = true, noremap = true, expr = true }
)
vim.keymap.set(
{ "i", "s" },
"<S-Tab>",
[[<cmd>lua require'luasnip'.jump(-1)<CR>]],
{ silent = true, noremap = true }
)
vim.keymap.set(
"s",
"<Tab>",
[[<cmd>lua require'luasnip'.jump(1)<CR>]],
{ silent = true, noremap = true }
)
vim.keymap.set(
{ "i", "s" },
"<C-E>",
[[luasnip#choice_active() ? '<Plug>luasnip-next-choice' : '<C-E>']],
{ silent = true, noremap = true, expr = true }
)
end
return M
|