summaryrefslogtreecommitdiff
path: root/stowables-dotlocal/share/nvim/site/pack/manual/start/nvim-cmp-v0.0.1/lua/cmp/utils/spec.lua
blob: a4b2c8314755218366e1add652bcf0a2d5956664 (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
local context = require('cmp.context')
local source = require('cmp.source')
local types = require('cmp.types')
local config = require('cmp.config')

local spec = {}

spec.before = function()
  vim.cmd([[
    bdelete!
    enew!
    imapclear
    imapclear <buffer>
    cmapclear
    cmapclear <buffer>
    smapclear
    smapclear <buffer>
    xmapclear
    xmapclear <buffer>
    tmapclear
    tmapclear <buffer>
    setlocal noswapfile
    setlocal virtualedit=all
    setlocal completeopt=menu,menuone,noselect
  ]])
  config.set_global({
    sources = {
      { name = 'spec' },
    },
    snippet = {
      expand = function(args)
        local ctx = context.new()
        vim.api.nvim_buf_set_text(ctx.bufnr, ctx.cursor.row - 1, ctx.cursor.col - 1, ctx.cursor.row - 1, ctx.cursor.col - 1, vim.split(string.gsub(args.body, '%$0', ''), '\n'))
        for i, t in ipairs(vim.split(args.body, '\n')) do
          local s = string.find(t, '$0', 1, true)
          if s then
            if i == 1 then
              vim.api.nvim_win_set_cursor(0, { ctx.cursor.row, ctx.cursor.col + s - 2 })
            else
              vim.api.nvim_win_set_cursor(0, { ctx.cursor.row + i - 1, s - 1 })
            end
            break
          end
        end
      end,
    },
  })
  config.set_cmdline({
    sources = {
      { name = 'spec' },
    },
  }, ':')
end

spec.state = function(text, row, col)
  vim.fn.setline(1, text)
  vim.fn.cursor(row, col)
  local ctx = context.empty()
  local s = source.new('spec', {
    complete = function() end,
  })
  return {
    context = function()
      return ctx
    end,
    source = function()
      return s
    end,
    backspace = function()
      vim.fn.feedkeys('x', 'nx')
      vim.fn.feedkeys('h', 'nx')
      ctx = context.new(ctx, { reason = types.cmp.ContextReason.Auto })
      s:complete(ctx, function() end)
      return ctx
    end,
    input = function(char)
      vim.fn.feedkeys(('i%s'):format(char), 'nx')
      vim.fn.feedkeys(string.rep('l', #char), 'nx')
      ctx.prev_context = nil
      ctx = context.new(ctx, { reason = types.cmp.ContextReason.Auto })
      s:complete(ctx, function() end)
      return ctx
    end,
    manual = function()
      ctx = context.new(ctx, { reason = types.cmp.ContextReason.Manual })
      s:complete(ctx, function() end)
      return ctx
    end,
  }
end

return spec