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:
parent
39e6878b58
commit
c9ce8ac4d1
2 changed files with 29 additions and 3 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Reference in a new issue