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
|