summaryrefslogtreecommitdiff
path: root/lua/warp/win_selectors/prompt.lua
blob: 0a7f3be6ae1696fbeeaefd0879af1eb81bdc5afb (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
vim = assert(vim)
local M = {}

local function open_panel_in_rect(c, row, col, w, h)
  local buf = vim.api.nvim_create_buf(0, 1)
  local win = vim.api.nvim_open_win(buf, false, {
    relative = 'editor',
    row = row + math.floor(h / 2) - 2,
    col = col + math.floor(w / 2) - 5,
    width = 11,
    height = 5,
    focusable = true,
    style = 'minimal'
  })
  vim.api.nvim_win_set_option(win, "winhighlight", "Normal:WarpNormal")
  vim.api.nvim_buf_set_lines(buf, 0, -1, 0, { '', '', '     ' .. c, '', '' })
  return win
end

local function next_char()
  vim.cmd("redraw!")
  return vim.fn.nr2char(vim.fn.getchar())
end

M.select_win = function ()
  local wins = vim.api.nvim_list_wins()

  local alphabet = "abcdefghijklmnopqrstuvwxyz"
  local ai = 1
  local char_to_win = {}
  local to_clean = {}

  for _, w in pairs(wins) do
    local rowcol = vim.api.nvim_win_get_position(w)
    local width = vim.api.nvim_win_get_width(w)
    local height = vim.api.nvim_win_get_height(w)

    local char = alphabet:sub(ai, ai)
    table.insert(to_clean, open_panel_in_rect(char, rowcol[1], rowcol[2], width, height))
    ai = ai + 1
    char_to_win[char] = w
  end

  local sel = next_char()

  for _, w in pairs(to_clean) do
    vim.api.nvim_buf_delete(vim.api.nvim_win_get_buf(w), {force = true})
  end

  if sel == '.' then
    return 0
  else
    return char_to_win[sel]
  end
end


return M