From c9ce8ac4d11dab5d53fd1b15bc06e004fc89b500 Mon Sep 17 00:00:00 2001 From: Ade Attwood Date: Sun, 24 Jul 2022 12:50:30 +0100 Subject: [PATCH] feat: implement emacs bindings for the prompt like bash Now the prompt will act like the default bash readline with emacs key bindings, clear and delete word. You can now also move left and right in the prompt to insert chars in the middle of the prompt rather than having to delete your search term and start again. --- lua/ivy/prompt.lua | 27 +++++++++++++++++++++++++-- lua/ivy/window.lua | 5 ++++- 2 files changed, 29 insertions(+), 3 deletions(-) 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 @@ -3,18 +3,39 @@ 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 @@ -26,11 +47,13 @@ end prompt.set = function(value) prompt.value = value + prompt.suffix = "" prompt.update() end prompt.destroy = function() prompt.value = "" + prompt.suffix = "" vim.notify "" end 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 @@ -72,7 +72,7 @@ window.make_buffer = function() 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) @@ -85,6 +85,9 @@ window.make_buffer = function() ) 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()