diff options
author | Josh Rahm <rahm@google.com> | 2024-03-12 17:51:36 +0000 |
---|---|---|
committer | Josh Rahm <rahm@google.com> | 2024-03-12 17:51:36 +0000 |
commit | 8bb88b81a307746ceaf8e3b10137399d980f8903 (patch) | |
tree | bd7b4f97cb19b3ea2bbe072a1df9711268a25d8a | |
parent | af66e1ce213854037f4e95627dfb1e45e0e437c6 (diff) | |
download | nvim-warp-8bb88b81a307746ceaf8e3b10137399d980f8903.tar.gz nvim-warp-8bb88b81a307746ceaf8e3b10137399d980f8903.tar.bz2 nvim-warp-8bb88b81a307746ceaf8e3b10137399d980f8903.zip |
Add win selectors to help select the window one wants to jump to.
-rw-r--r-- | lua/warp.lua | 41 | ||||
-rw-r--r-- | lua/warp/strategy/grid.lua | 2 | ||||
-rw-r--r-- | lua/warp/strategy/words.lua | 1 | ||||
-rw-r--r-- | lua/warp/win_selectors/current.lua | 5 | ||||
-rw-r--r-- | lua/warp/win_selectors/prompt.lua | 58 | ||||
-rw-r--r-- | plugin/warp.vim | 4 |
6 files changed, 89 insertions, 22 deletions
diff --git a/lua/warp.lua b/lua/warp.lua index bda64fb..b5cb51c 100644 --- a/lua/warp.lua +++ b/lua/warp.lua @@ -42,6 +42,7 @@ M.open_vertical = function() line = line + 1 end vim.api.nvim_buf_set_lines(M.vert_buf, 0, -1, 0, M.vert_lines) + -- local curpos = vim.api.nvim_win_get_cursor(0) return new_panel(M.vert_buf, 0, 0, real_width, height); end @@ -61,22 +62,6 @@ M.open_horiz = function() max_width + 2, 1) end -M.filter_horiz_string = function(ch) - local new_horiz_line = '' - local i = 1 - - while i <= #M.horiz_line do - local curch = char_at(M.horiz_line, i - 1) - if curch == ch then - new_horiz_line = new_horiz_line .. char_at(M.horiz_line, i) - else - new_horiz_line = new_horiz_line .. ' ' - end - i = i + 1 - end - vim.api.nvim_buf_set_lines(M.horiz_bufnr, 0, -1, 0, {' ' .. new_horiz_line}) -end - M.filter_vert_text = function(ch) local new_vert_text = {} for _, t in pairs(M.vert_lines) do @@ -97,9 +82,13 @@ local function next_char() return vim.fn.nr2char(vim.fn.getchar()) end -M.run = function(strat_fn) - if not strat_fn then - strat_fn = require('warp.strategy.default').default_col_strategy +M.run = function(col_selector, win_selector) + if not col_selector then + col_selector = require('warp.strategy.grid').strategy + end + + if not win_selector then + win_selector = require('warp.win_selectors.current') end local current_pos = vim.api.nvim_win_get_cursor(0) @@ -113,6 +102,15 @@ M.run = function(strat_fn) vim.api.nvim_buf_delete(vim.api.nvim_win_get_buf(win), {force = true}) end + local jump_to_win = win_selector.select_win() + if not jump_to_win then + return + end + vim.cmd([[redraw!]]) + if jump_to_win ~= 0 then + vim.api.nvim_set_current_win(jump_to_win) + end + local read_row = function() w = M.open_vertical() local vch1 = next_char() @@ -136,9 +134,10 @@ M.run = function(strat_fn) if not r then return end - vim.api.nvim_win_set_cursor(0, {r, current_pos[2]}) + vim.cmd("normal! m'") + pcall(function() vim.api.nvim_win_set_cursor(0, {r, current_pos[2]}) end) - local strat = strat_fn() + local strat = col_selector() w = M.open_horiz() local disp = strat.display() if disp then diff --git a/lua/warp/strategy/grid.lua b/lua/warp/strategy/grid.lua index e68e010..bc37b56 100644 --- a/lua/warp/strategy/grid.lua +++ b/lua/warp/strategy/grid.lua @@ -38,7 +38,7 @@ end local big_line, col_map = make_big_line() -M.grid_strategy = function() +M.strategy = function() local filter return { diff --git a/lua/warp/strategy/words.lua b/lua/warp/strategy/words.lua index a42ada0..8135a45 100644 --- a/lua/warp/strategy/words.lua +++ b/lua/warp/strategy/words.lua @@ -33,6 +33,7 @@ local function split_lines(line) run_regex("%W%w") run_regex("%s%S") run_regex("%w%W", -1) + run_regex("[a-z][A-Z]") local winstr = "" i = 1 diff --git a/lua/warp/win_selectors/current.lua b/lua/warp/win_selectors/current.lua new file mode 100644 index 0000000..2d2a75f --- /dev/null +++ b/lua/warp/win_selectors/current.lua @@ -0,0 +1,5 @@ +local M = {} + +M.select_win = function () return 0 end + +return M 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 diff --git a/plugin/warp.vim b/plugin/warp.vim index 4052622..c414501 100644 --- a/plugin/warp.vim +++ b/plugin/warp.vim @@ -1,5 +1,9 @@ " Uses a strategy that allows the user to select an arbitrary line and column by " using 2x2 key strokes. Is more complex, but most powerful. +command! WarpFull lua require('warp').run(require('warp.strategy.grid').grid_strategy, require('warp.win_selectors.prompt')) + +" Uses a strategy that allows the user to select an arbitrary line and column by +" using 2x2 key strokes. Is more complex, but most powerful. command! WarpGrid lua require('warp').run(require('warp.strategy.grid').grid_strategy) " Has the user select the column based on nows. |