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