diff options
Diffstat (limited to 'lua/warp/win_selectors/prompt.lua')
-rw-r--r-- | lua/warp/win_selectors/prompt.lua | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/lua/warp/win_selectors/prompt.lua b/lua/warp/win_selectors/prompt.lua new file mode 100644 index 0000000..0a7f3be --- /dev/null +++ b/lua/warp/win_selectors/prompt.lua @@ -0,0 +1,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 |