diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2024-03-10 21:09:29 -0600 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2024-03-10 21:09:29 -0600 |
commit | 2a6221746efb29c8bacf135625305a12ab7a2492 (patch) | |
tree | a6e24c29325d8028d0ed62c626820c363fc81328 | |
parent | 92ca3c6dcfa4f6d9d3c729e3c11ca1e62a51e4d6 (diff) | |
download | nvim-warp-2a6221746efb29c8bacf135625305a12ab7a2492.tar.gz nvim-warp-2a6221746efb29c8bacf135625305a12ab7a2492.tar.bz2 nvim-warp-2a6221746efb29c8bacf135625305a12ab7a2492.zip |
more functionality
-rw-r--r-- | lua/warp.lua | 98 |
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 |