local vim = assert(vim) local M = {} local hsel1 = "tnshrdlcumwfgypkbvjxqz" -- 21 local hsel2 = "aeiou" -- 5 local function char_at(s, i) local m = (i % #s) + 1 return string.sub(s, m, m) end local function make_big_line() local col = 0 local line = '' local v = '' local c = nil local i = 0 local col_map = {} while true do v = char_at(hsel1, i) if c then if col_map[v .. c] then break end col_map[c .. v] = col end c = char_at(hsel2, i) if col_map[c .. v] then break end line = line .. v col = col + 1 line = line .. c col_map[v .. c] = col col = col + 1 i = i + 1 end return line, col_map end local big_line, col_map = make_big_line() M.default_strategy = function() local filter return { display = function() local curpos = vim.api.nvim_win_get_cursor(0) local line_at = vim.fn.getline(curpos[1]) local unfiltered = big_line:sub(1, #line_at + 1) local line = unfiltered if filter then line = "" local i = 1 while i <= #unfiltered do local curch = char_at(unfiltered, i - 1) if curch == filter then line = line .. char_at(unfiltered, i) else line = line .. ' ' end i = i + 1 end end return line end, on_char = function(ch) if not filter then if ch == '$' or ch == '^' then vim.cmd("normal! " .. ch) return false elseif not ch:match('[a-z]') then vim.cmd("normal! f" .. ch) return false else filter = ch return true end else if col_map[filter .. ch] then vim.cmd("normal! " .. col_map[filter .. ch] .. "|") end end return false end } end return M