about summary refs log tree commit diff stats
path: root/hm/soispha/conf/nvim/plugins/luasnip/lua/snippets/all.lua
blob: d73ce7aec8abea310b600ce87b5fa871db1a9a24 (plain) (blame)
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
local ls = require("luasnip");
-- auto_pairs  {{{
local get_visual = function(args, parent)
  if #parent.snippet.env.SELECT_RAW > 0 then
    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
  else
    return sn(nil, i(1, ""))
  end
end
local function char_count_same(c1, c2)
  local line = vim.api.nvim_get_current_line()
  -- '%'-escape chars to force explicit match (gsub accepts patterns).
  -- second return value is number of substitutions.
  local _, ct1 = string.gsub(line, "%" .. c1, "")
  local _, ct2 = string.gsub(line, "%" .. c2, "")
  return ct1 == ct2
end

local function even_count(c, ...)
  local line = vim.api.nvim_get_current_line()
  local _, ct = string.gsub(line, c, "")
  return ct % 2 == 0
end

-- This makes creation of pair-type snippets easier.
local function pair(pair_begin, pair_end, file_types, condition_function)
  -- FIXME(@Soispha): This only works if file_types == nil, otherwise the snippet does not expand.
  -- It would be nice, if it would support both an empty array (`{}`) and nil <2023-08-27>
  -- file_types = file_types or {};

  return s(
    { trig = pair_begin; wordTrig = false; snippetType = "autosnippet"; },
    { t({ pair_begin; }); d(1, get_visual); t({ pair_end; }); },
    {
      condition = function()
        local filetype_check = true;
        if file_types ~= nil then
          filetype_check = file_types[vim.bo.filetype] or false;
        end;
        return (not condition_function(pair_begin, pair_end)) and filetype_check
      end;
    }
  )
end

local auto_pairs = {
  pair("(", ")", nil, char_count_same);
  pair("{", "}", nil, char_count_same);
  pair("[", "]", nil, char_count_same);
  pair("<", ">", { ["rust"] = true; ["tex"] = true; }, char_count_same);
  pair("'", "'", nil, even_count);
  pair('"', '"', nil, even_count);
  pair("`", "`", nil, even_count);
}

ls.add_snippets("all", auto_pairs, { type = "snippets"; key = "auto_pairs"; })
-- }}}