summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2024-03-10 21:09:29 -0600
committerJosh Rahm <joshuarahm@gmail.com>2024-03-10 21:09:29 -0600
commit2a6221746efb29c8bacf135625305a12ab7a2492 (patch)
treea6e24c29325d8028d0ed62c626820c363fc81328
parent92ca3c6dcfa4f6d9d3c729e3c11ca1e62a51e4d6 (diff)
downloadnvim-warp-2a6221746efb29c8bacf135625305a12ab7a2492.tar.gz
nvim-warp-2a6221746efb29c8bacf135625305a12ab7a2492.tar.bz2
nvim-warp-2a6221746efb29c8bacf135625305a12ab7a2492.zip
more functionality
-rw-r--r--lua/warp.lua98
1 files changed, 65 insertions, 33 deletions
diff --git a/lua/warp.lua b/lua/warp.lua
index 5c50c25..9eb1b67 100644
--- a/lua/warp.lua
+++ b/lua/warp.lua
@@ -75,20 +75,20 @@ M.open_horiz = function()
while col < max_width do
v = char_at(hsel1, i)
if c then
- if M.col_map [c .. v] then
+ if M.col_map [v .. c] then
break
end
M.col_map[c .. v] = col - 1
end
c = char_at(hsel2, i)
- if M.col_map [v .. c] then
+ if M.col_map [c .. v] then
break
end
line = line .. v
col = col + 1
if col < max_width then
line = line .. c
- M.col_map[v .. c] = col
+ M.col_map[v .. c] = col - 1
col = col + 1
i = i + 1
end
@@ -125,9 +125,9 @@ M.filter_horiz_string = function(ch)
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)
- i = i + 1
+ else
+ new_horiz_line = new_horiz_line .. ' '
end
- new_horiz_line = new_horiz_line .. ' '
i = i + 1
end
vim.api.nvim_buf_set_lines(M.horiz_bufnr, 0, -1, 0, { ' ' .. new_horiz_line })
@@ -150,42 +150,74 @@ M.filter_vert_text = function (ch)
vim.api.nvim_buf_set_lines(M.vert_buf, 0, -1, 0, M.vert_lines)
end
-local function next_char(callback)
- local timer = vim.loop.new_timer()
- timer:start(0, 0, vim.schedule_wrap(function()
- local ch = vim.fn.nr2char(vim.fn.getchar())
- callback(ch)
- end))
+local function next_char()
+ vim.cmd("redraw!")
+ return vim.fn.nr2char(vim.fn.getchar())
end
M.run = function()
+ local cleanup = function (w)
+ vim.api.nvim_buf_delete(vim.api.nvim_win_get_buf(w), { force = true })
+ end
+
local w1 = M.open_vertical()
local current_pos = vim.api.nvim_win_get_cursor(0)
- next_char(function(vch1)
+ local r
+ local vch1 = next_char()
+ if vch1 == '\x1b' then
+ cleanup(w1)
+ return
+ elseif vch1 == '.' then
+ r = current_pos[1]
+ cleanup(w1)
+ else
M.filter_vert_text(vch1)
- vim.cmd("redraw!")
- local vch2 = vim.fn.nr2char(vim.fn.getchar())
- vim.api.nvim_buf_delete(vim.api.nvim_win_get_buf(w1), { force = true })
- -- vim.api.nvim_win_close(w1, 1)
- local r = M.row_map[vch1 .. vch2]
- print("ROW: " .. vch1 .. vch2)
- if r then
- vim.api.nvim_win_set_cursor(0, {r, current_pos[2]})
- local w2 = M.open_horiz()
- next_char(function (hch1)
- M.filter_horiz_string(hch1)
- vim.cmd("redraw!")
- local hch2 = vim.fn.nr2char(vim.fn.getchar())
- local c = M.col_map[hch1 .. hch2]
- vim.api.nvim_buf_delete(vim.api.nvim_win_get_buf(w2), { force = true })
- -- vim.api.nvim_win_close(w2, 1)
- if c then
- vim.api.nvim_win_set_cursor(0, {r, c})
- end
- end)
+ local vch2 = next_char()
+ cleanup(w1)
+ if vch1 == '\x1b' then
+ return
+ end
+ r = M.row_map[vch1 .. vch2]
+ end
+
+ if r then
+ vim.api.nvim_win_set_cursor(0, {r, current_pos[2]})
+ local w2 = M.open_horiz()
+
+ local c
+ local hch1 = next_char()
+ if hch1 == '\x1b' then
+ cleanup(w2)
+ return
+ elseif hch1 == '.' then
+ c = current_pos[2]
+ elseif not hch1:match('[a-z]') then
+ c = hch1
+ else
+ M.filter_horiz_string(hch1)
+
+ local hch2 = next_char()
+ if hch2 == '\x1b' then
+ cleanup(w2)
+ return
+ end
+ c = M.col_map[hch1 .. hch2]
+ end
+
+ cleanup(w2)
+
+ if c then
+ vim.api.nvim_win_set_cursor(0, {r, 0})
+ if c == '$' then
+ vim.cmd("normal! $")
+ elseif type(c) == 'string' then
+ vim.cmd("normal! f" .. c)
+ else
+ vim.cmd("normal! " .. (c + 1) .. "|") -- handle multibyte characters
+ end
end
- end)
+ end
end
return M