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.
This commit is contained in:
Ade Attwood 2022-07-24 12:50:30 +01:00
parent 39e6878b58
commit c9ce8ac4d1
2 changed files with 29 additions and 3 deletions

View file

@ -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

View file

@ -72,7 +72,7 @@ window.make_buffer = function()
end
vim.api.nvim_buf_set_keymap(window.buffer, "n", "<C-c>", "<cmd>lua vim.ivy.destroy()<CR>", opts)
vim.api.nvim_buf_set_keymap(window.buffer, "n", "<C-w>", "<cmd>lua vim.ivy.search('')<CR>", opts)
vim.api.nvim_buf_set_keymap(window.buffer, "n", "<C-u>", "<cmd>lua vim.ivy.search('')<CR>", opts)
vim.api.nvim_buf_set_keymap(window.buffer, "n", "<C-n>", "<cmd>lua vim.ivy.next()<CR>", opts)
vim.api.nvim_buf_set_keymap(window.buffer, "n", "<C-p>", "<cmd>lua vim.ivy.previous()<CR>", opts)
vim.api.nvim_buf_set_keymap(window.buffer, "n", "<C-M-n>", "<cmd>lua vim.ivy.next(); vim.ivy.checkpoint()<CR>", opts)
@ -85,6 +85,9 @@ window.make_buffer = function()
)
vim.api.nvim_buf_set_keymap(window.buffer, "n", "<CR>", "<cmd>lua vim.ivy.complete()<CR>", opts)
vim.api.nvim_buf_set_keymap(window.buffer, "n", "<BS>", "<cmd>lua vim.ivy.input('BACKSPACE')<CR>", opts)
vim.api.nvim_buf_set_keymap(window.buffer, "n", "<Left>", "<cmd>lua vim.ivy.input('LEFT')<CR>", opts)
vim.api.nvim_buf_set_keymap(window.buffer, "n", "<Right>", "<cmd>lua vim.ivy.input('RIGHT')<CR>", opts)
vim.api.nvim_buf_set_keymap(window.buffer, "n", "<C-w>", "<cmd>lua vim.ivy.input('DELETE_WORD')<CR>", opts)
end
window.get_current_selection = function()