summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authorJosh Rahm <rahm@google.com>2024-03-09 19:04:33 +0000
committerJosh Rahm <rahm@google.com>2024-03-09 19:04:33 +0000
commit2f8ba5cfd60d253934957644aa40630b5d5e7729 (patch)
treef497b1fe9a4b330e38b920a656f9a2ee8dbc3273 /lua
downloadnvim-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.lua180
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