summaryrefslogtreecommitdiff
path: root/neovim/lua/vimrc/snippets.lua
blob: e4d60d74e71f106980b247e7cc9d07d832ec2f43 (plain)
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