diff --git a/lua/ivy/prompt.lua b/lua/ivy/prompt.lua index 264cc1b..f867d2e 100644 --- a/lua/ivy/prompt.lua +++ b/lua/ivy/prompt.lua @@ -1,37 +1,60 @@ -- The prefix that will be before the search text for the user local prompt_prefix = ">> " local prompt = {} +prompt.suffix = "" prompt.value = "" prompt.text = function() - return prompt.value + return prompt.value .. prompt.suffix end prompt.update = function() - vim.notify(prompt_prefix .. prompt.text()) + vim.api.nvim_echo({ + { prompt_prefix, "None" }, + { prompt.value:sub(1, -2), "None" }, + { prompt.value:sub(-1, -1), "Underlined" }, + { prompt.suffix, "None" }, + }, false, {}) end prompt.input = function(char) if char == "BACKSPACE" then prompt.value = string.sub(prompt.value, 0, -2) + elseif char == "LEFT" then + if #prompt.value > 0 then + prompt.suffix = prompt.value:sub(-1, -1) .. prompt.suffix + prompt.value = prompt.value:sub(1, -2) + end + elseif char == "RIGHT" then + if #prompt.suffix > 0 then + prompt.value = prompt.value .. prompt.suffix:sub(1, 1) + prompt.suffix = prompt.suffix:sub(2, -1) + end + elseif char == "DELETE_WORD" then + prompt.value = prompt.value:match "(.*)%s+.*$" + if prompt.value == nil then + prompt.value = "" + end elseif char == "\\\\" then prompt.value = prompt.value .. "\\" else prompt.value = prompt.value .. char end prompt.update() end prompt.set = function(value) prompt.value = value + prompt.suffix = "" prompt.update() end prompt.destroy = function() prompt.value = "" + prompt.suffix = "" vim.notify "" end return prompt diff --git a/lua/ivy/window.lua b/lua/ivy/window.lua index 7b14308..ee2f23d 100644 --- a/lua/ivy/window.lua +++ b/lua/ivy/window.lua @@ -1,142 +1,145 @@ -- Constent options that will be used for the keymaps local opts = { noremap = true, silent = true, nowait = true } -- All of the base chars that will be used for an "input" operation on the -- prompt -- stylua: ignore local chars = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "<", ">", "`", "@", "#", "~", "!", "\"", "$", "%", "^", "&", "/", "(", ")", "=", "+", "*", "-", "_", ".", ",", ";", ":", "?", "\\", "|", "'", "{", "}", "[", "]", " ", } local function string_to_table(lines) local items = {} for line in lines:gmatch "[^\r\n]+" do table.insert(items, line) end return items end local function set_items_string(buffer, lines) vim.api.nvim_buf_set_lines(buffer, 0, 9999, false, string_to_table(lines)) end local function set_items_array(buffer, lines) if type(lines[1]) == "string" then vim.api.nvim_buf_set_lines(buffer, 0, 9999, false, lines) else for i = 1, #lines do vim.api.nvim_buf_set_lines(buffer, i - 1, 9999, false, { lines[i][2] }) end end end local window = {} window.index = 0 window.origin = nil window.window = nil window.buffer = nil window.initialize = function() window.make_buffer() end window.make_buffer = function() window.origin = vim.api.nvim_get_current_win() vim.api.nvim_command "botright split new" window.buffer = vim.api.nvim_win_get_buf(0) window.window = vim.api.nvim_get_current_win() vim.api.nvim_win_set_option(window.window, "number", false) vim.api.nvim_win_set_option(window.window, "relativenumber", false) vim.api.nvim_win_set_option(window.window, "signcolumn", "no") vim.api.nvim_buf_set_option(window.buffer, "filetype", "ivy") vim.api.nvim_buf_set_var(window.buffer, "bufftype", "nofile") for index = 1, #chars do local char = chars[index] if char == "'" then char = "\\'" end if char == "\\" then char = "\\\\\\\\" end vim.api.nvim_buf_set_keymap(window.buffer, "n", chars[index], "lua vim.ivy.input('" .. char .. "')", opts) end vim.api.nvim_buf_set_keymap(window.buffer, "n", "", "lua vim.ivy.destroy()", opts) - vim.api.nvim_buf_set_keymap(window.buffer, "n", "", "lua vim.ivy.search('')", opts) + vim.api.nvim_buf_set_keymap(window.buffer, "n", "", "lua vim.ivy.search('')", opts) vim.api.nvim_buf_set_keymap(window.buffer, "n", "", "lua vim.ivy.next()", opts) vim.api.nvim_buf_set_keymap(window.buffer, "n", "", "lua vim.ivy.previous()", opts) vim.api.nvim_buf_set_keymap(window.buffer, "n", "", "lua vim.ivy.next(); vim.ivy.checkpoint()", opts) vim.api.nvim_buf_set_keymap( window.buffer, "n", "", "lua vim.ivy.previous(); vim.ivy.checkpoint()", opts ) vim.api.nvim_buf_set_keymap(window.buffer, "n", "", "lua vim.ivy.complete()", opts) vim.api.nvim_buf_set_keymap(window.buffer, "n", "", "lua vim.ivy.input('BACKSPACE')", opts) + vim.api.nvim_buf_set_keymap(window.buffer, "n", "", "lua vim.ivy.input('LEFT')", opts) + vim.api.nvim_buf_set_keymap(window.buffer, "n", "", "lua vim.ivy.input('RIGHT')", opts) + vim.api.nvim_buf_set_keymap(window.buffer, "n", "", "lua vim.ivy.input('DELETE_WORD')", opts) end window.get_current_selection = function() local line = vim.api.nvim_buf_get_lines(window.buffer, window.index, window.index + 1, true) if line == nil then line = { "" } end return line[1] end window.get_buffer = function() if window.buffer == nil then window.make_buffer() end return window.buffer end window.update = function() -- TODO(ade): Add a guard in so we can not go out of range on the results buffer vim.api.nvim_win_set_cursor(window.window, { window.index + 1, 0 }) end window.set_items = function(items) if #items == 0 then vim.api.nvim_buf_set_lines(window.get_buffer(), 0, 9999, false, { "-- No Items --" }) elseif type(items) == "string" then set_items_string(window.get_buffer(), items) elseif type(items) == "table" then set_items_array(window.get_buffer(), items) end local line_count = vim.api.nvim_buf_line_count(window.buffer) window.index = line_count - 1 if line_count > 10 then line_count = 10 end vim.api.nvim_win_set_height(window.window, line_count) window.update() end window.destroy = function() if type(window.buffer) == "number" then vim.api.nvim_buf_delete(window.buffer, { force = true }) end window.buffer = nil window.window = nil window.origin = nil window.index = 0 end return window