summaryrefslogtreecommitdiff
path: root/lua/warp/strategy/grid.lua
blob: bc37b5632d3a7f0be89f106e5c622107cacfca71 (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
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
local vim = assert(vim)

local M = {}

local hsel1 = "tnshrdlcmwfpgkbvjxy" -- 19
local hsel2 = "aeiouzq" -- 7

local function char_at(s, i)
  local m = (i % #s) + 1
  return string.sub(s, m, m)
end

local function make_big_line()
  local col = 0
  local line = ''

  local v = ''
  local c = nil
  local i = 0
  local col_map = {}
  while true do
    v = char_at(hsel1, i)
    if c then
      if col_map[c .. v] then break end
      col_map[c .. v] = col
    end
    c = char_at(hsel2, i)
    col = col + 1
    if col_map[v .. c] then break end
    col_map[v .. c] = col
    line = line .. v .. c
    col = col + 1
    i = i + 1
  end

  return line, col_map
end

local big_line, col_map = make_big_line()

M.strategy = function()
  local filter

  return {
    display = function()
      local curpos = vim.api.nvim_win_get_cursor(0)
      local line_at = vim.fn.getline(curpos[1])
      local unfiltered = big_line:sub(1, #line_at + 1)
      local line = unfiltered

      if filter then
        line = ""
        local i = 1
        while i <= #unfiltered do
          local curch = char_at(unfiltered, i - 1)
          if curch == filter then
            line = line .. char_at(unfiltered, i)
          else
            line = line .. ' '
          end
          i = i + 1
        end
      end

      return line
    end,

    on_char = function(ch)
      if not filter then
        if ch == '$' or ch == '^' then
          vim.cmd("normal! " .. ch)
          return false
        elseif not ch:match('[a-z]') then
          vim.cmd("normal! f" .. ch)
          return false
        else
          filter = ch
          return true
        end
      else
        if col_map[filter .. ch] then
          vim.cmd("normal! " .. col_map[filter .. ch] .. "|")
        end
      end

      return false
    end
  }
end

return M