diff options
author | Josh Rahm <rahm@google.com> | 2024-03-09 19:04:33 +0000 |
---|---|---|
committer | Josh Rahm <rahm@google.com> | 2024-03-09 19:04:33 +0000 |
commit | 2f8ba5cfd60d253934957644aa40630b5d5e7729 (patch) | |
tree | f497b1fe9a4b330e38b920a656f9a2ee8dbc3273 /lua | |
download | nvim-warp-2f8ba5cfd60d253934957644aa40630b5d5e7729.tar.gz nvim-warp-2f8ba5cfd60d253934957644aa40630b5d5e7729.tar.bz2 nvim-warp-2f8ba5cfd60d253934957644aa40630b5d5e7729.zip |
Initial commit for warp
Diffstat (limited to 'lua')
-rw-r--r-- | lua/warp.lua | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/lua/warp.lua b/lua/warp.lua new file mode 100644 index 0000000..9537bcb --- /dev/null +++ b/lua/warp.lua @@ -0,0 +1,180 @@ +local vim = assert(vim) +local M = {} + +local cons = "tnshrdlcumwfgypkbvjxqz" -- 21 +local vowel = "aeiou" -- 5 + +local function char_at(s, i) + local m = (i % #s) + 1 + return string.sub(s, m, m) +end + +M.open_vertical = function() + local current_win = vim.api.nvim_get_current_win() + local curpos = vim.api.nvim_win_get_cursor(0) + local height = vim.api.nvim_win_get_height(current_win) + local topline = vim.fn.line('w0') + + M.row_map = {} + + local bufnr = vim.api.nvim_create_buf(0, 1) + local line = 0 + local text = {} + while line < height do + local t = char_at(cons, line) .. char_at(vowel, line) + table.insert(text, ' ' .. t) + M.row_map[t] = topline + line + line = line + 1 + end + vim.api.nvim_buf_set_lines(bufnr, 0, -1, 0, text) + + local vert_win = vim.api.nvim_open_win( + bufnr, + false, + { + relative = 'cursor', + row = -curpos[1], + col = -4, + width = 4, + height = height + }) + + vim.api.nvim_win_set_option(vert_win, "number", false) -- Hide line numbers + vim.api.nvim_win_set_option(vert_win, "relativenumber", false) -- Hide relative numbers + vim.api.nvim_win_set_option(vert_win, "wrap", false) -- Disable wrapping + vim.api.nvim_win_set_option(vert_win, "signcolumn", "no") -- Hide sign column + + return vert_win +end + +M.open_horiz = function() + local current_win = vim.api.nvim_get_current_win() + local curpos = vim.api.nvim_win_get_cursor(0) + local topline = vim.fn.line('w0') + + local width = vim.api.nvim_win_get_width(current_win) + local width_of_garbage = vim.fn.getwininfo(current_win)[1].textoff + + local bufnr = vim.api.nvim_create_buf(0, 1) + local col = 0 + local bottom_line = "" + local top_line = "" + local vi = 0 + + local v = '' + M.col_map = {} + while col < width do + local c = char_at(cons, col) + bottom_line = bottom_line .. c + if (col % #cons) == 0 then + v = char_at(vowel, vi) + vi = vi + 1 + top_line = top_line .. v + else + top_line = top_line .. ' ' + end + if M.col_map[v .. c] then + break + end + + M.col_map[v .. c] = col + col = col + 1 + end + vim.api.nvim_buf_set_lines(bufnr, 0, -1, 0, { top_line, bottom_line }) + + local horiz_win = vim.api.nvim_open_win( + bufnr, + false, + { + relative = 'win', + row = curpos[1] - topline + 1, + col = width_of_garbage, -- -curpos[2], + width = width - width_of_garbage, + height = 2 + }) + + vim.api.nvim_win_set_option(horiz_win, "number", false) -- Hide line numbers + vim.api.nvim_win_set_option(horiz_win, "relativenumber", false) -- Hide relative numbers + vim.api.nvim_win_set_option(horiz_win, "wrap", false) -- Disable wrapping + vim.api.nvim_win_set_option(horiz_win, "signcolumn", "no") -- Hide sign column + + return horiz_win +end + +M.run = function() + local w1 = M.open_vertical() + local current_pos = vim.api.nvim_win_get_cursor(0) + -- local w2 = M.open_horiz() + + vim.schedule(function () + local c1 = vim.fn.nr2char(vim.fn.getchar()) + local c2 = vim.fn.nr2char(vim.fn.getchar()) + + vim.api.nvim_win_close(w1, 1) + local r = M.row_map[c1 .. c2] + + if r then + vim.api.nvim_win_set_cursor(0, {r, current_pos[2]}) + vim.schedule(function() + local w2 = M.open_horiz() + local timer = vim.loop.new_timer() + -- Bug in vim runtime? If I don't use the timer, the window never shows + -- up. + timer:start(10, 0, vim.schedule_wrap(function() + c1 = vim.fn.nr2char(vim.fn.getchar()) + c2 = vim.fn.nr2char(vim.fn.getchar()) + local c = M.col_map[c1 .. c2] + + vim.api.nvim_win_close(w2, 1) + + if c then + vim.api.nvim_win_set_cursor(0, {r, c}) + end + end)) + end) + end + + -- vim.schedule(function () + -- c1 = vim.fn.nr2char(vim.fn.getchar()) + -- c2 = vim.fn.nr2char(vim.fn.getchar()) + + -- -- vim.api.nvim_win_close(w2, 1) + -- end) + end) + + -- vim.schedule(function() + -- local c1 = vim.fn.nr2char(vim.fn.getchar()) + -- local c2 = vim.fn.nr2char(vim.fn.getchar()) + + -- vim.api.nvim_win_close(w, 1) + + -- local r = M.row_map[c1 .. c2] + -- vim.print(c1 .. c2) + -- vim.print(M.row_map[c1 .. c2]) + -- if r then + -- -- local b, _, c, o = vim.fn.getpos('.') + -- -- vim.fn.setpos('.', {b, r, c, o}) + + -- vim.schedule(function() + -- vim.print("Open horiz?") + -- w = M.open_horiz() + -- end) + + + -- vim.schedule(function () + -- -- c1 = vim.fn.getchar() + -- -- c2 = vim.fn.getchar() + + -- vim.api.nvim_win_close(w, 1) + + -- -- c = M.col_map[c1 .. c2] + -- -- if c then + -- -- b, r, _, o = vim.fn.getpos('.') + -- -- vim.fn.setpos('.', {b, r, c, o}) + -- -- end + -- end) + -- end + -- end) +end + +return M |