summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authorJosh Rahm <rahm@google.com>2024-03-12 17:51:36 +0000
committerJosh Rahm <rahm@google.com>2024-03-12 17:51:36 +0000
commit8bb88b81a307746ceaf8e3b10137399d980f8903 (patch)
treebd7b4f97cb19b3ea2bbe072a1df9711268a25d8a /lua
parentaf66e1ce213854037f4e95627dfb1e45e0e437c6 (diff)
downloadnvim-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.
Diffstat (limited to 'lua')
-rw-r--r--lua/warp.lua41
-rw-r--r--lua/warp/strategy/grid.lua2
-rw-r--r--lua/warp/strategy/words.lua1
-rw-r--r--lua/warp/win_selectors/current.lua5
-rw-r--r--lua/warp/win_selectors/prompt.lua58
5 files changed, 85 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