Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F132203
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/lua/ivy/prompt.lua b/lua/ivy/prompt.lua
index f867d2e..b893ce1 100644
--- a/lua/ivy/prompt.lua
+++ b/lua/ivy/prompt.lua
@@ -1,60 +1,81 @@
-- The prefix that will be before the search text for the user
local prompt_prefix = ">> "
+-- Gets the suffix to delete from some text biased on what happens in a bash
+-- prompt. If the text dose not end in a letter then the last word and all of
+-- the tailing special characters will be returned. If the text dose end in a
+-- letter then only the last word will be returned leaving the special
+-- characters that are before the last word. For example
+--
+-- `some word` -> `some `
+-- `some word` -> `some `
+-- `some word ` -> `some `
+local function get_delete_suffix(text)
+ if text:match "([A-Za-z]+)$" == nil then
+ return text:match "([A-Za-z]+[^A-Za-z]+)$"
+ end
+
+ return text:match "([A-Za-z]+)$"
+end
+
local prompt = {}
prompt.suffix = ""
prompt.value = ""
prompt.text = function()
return prompt.value .. prompt.suffix
end
+
prompt.update = function()
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
+ local suffix = get_delete_suffix(prompt.value)
+
+ if suffix == nil then
prompt.value = ""
+ else
+ prompt.value = prompt.value:sub(1, #prompt.value - #suffix)
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/prompt_test.lua b/lua/ivy/prompt_test.lua
index a99680d..ee834b6 100644
--- a/lua/ivy/prompt_test.lua
+++ b/lua/ivy/prompt_test.lua
@@ -1,61 +1,94 @@
local prompt = require "ivy.prompt"
local vim_mock = require "ivy.vim_mock"
before_each(function()
vim_mock.reset()
prompt.destroy()
end)
-- Input a list of strings into the prompt
local input = function(input_table)
for index = 1, #input_table do
prompt.input(input_table[index])
end
end
-- Asserts the prompt contains the correct value
local assert_prompt = function(t, expected)
local text = prompt.text()
if text ~= expected then
t.error("The prompt text should be '" .. expected .. "' found '" .. text .. "'")
end
end
it("starts with empty text", function(t)
if prompt.text() ~= "" then
t.error "The prompt should start with empty text"
end
end)
it("can input some text", function(t)
input { "A", "d", "e" }
assert_prompt(t, "Ade")
end)
it("can delete a char", function(t)
input { "A", "d", "e", "BACKSPACE" }
assert_prompt(t, "Ad")
end)
it("will reset the text", function(t)
input { "A", "d", "e" }
prompt.set "New"
assert_prompt(t, "New")
end)
it("can move around the a word", function(t)
input { "P", "r", "o", "p", "t", "LEFT", "LEFT", "LEFT", "RIGHT", "m" }
assert_prompt(t, "Prompt")
end)
it("can delete a word", function(t)
prompt.set "Ade Attwood"
input { "DELETE_WORD" }
- assert_prompt(t, "Ade")
+ assert_prompt(t, "Ade ")
end)
it("can delete a word in the middle", function(t)
prompt.set "Ade middle A"
input { "LEFT", "LEFT", "DELETE_WORD" }
- assert_prompt(t, "Ade A")
+ assert_prompt(t, "Ade A")
+end)
+
+it("will delete the space and the word if the last word is single space", function(t)
+ prompt.set "some.thing "
+ input { "DELETE_WORD" }
+ assert_prompt(t, "some.")
end)
+
+it("will only delete one word from path", function(t)
+ prompt.set "some/nested/path"
+ input { "DELETE_WORD" }
+ assert_prompt(t, "some/nested/")
+end)
+
+it("will delete tailing space", function(t)
+ prompt.set "word "
+ input { "DELETE_WORD" }
+ assert_prompt(t, "")
+end)
+
+it("will leave a random space", function(t)
+ prompt.set "some word "
+ input { "DELETE_WORD" }
+ assert_prompt(t, "some ")
+end)
+
+local special_characters = { ".", "/", "^" }
+for _, char in ipairs(special_characters) do
+ it(string.format("will stop at a %s", char), function(t)
+ prompt.set(string.format("key%sValue", char))
+ input { "DELETE_WORD" }
+ assert_prompt(t, string.format("key%s", char))
+ end)
+end
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Fri, May 8, 3:09 PM (1 w, 17 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
8983
Default Alt Text
(4 KB)
Attached To
Mode
R1 ivy.nvim
Attached
Detach File
Event Timeline
Log In to Comment