feat: make the completion candidates type more consistent
The API for `window.set_items` took to many variable types. It would
take a table in multiple different formats and a string. Now it will
only take a table in a single format and a string. It will convert the
string into the table format by splitting it on new lines.
The table format is an array of tables that must have a `content` key
that will be the text that is displayed in the completion window. The
table can have any other data that is ignored.
```lua
local items = {
{ content = "Item one" },
{ content = "Item two" }
}
```
The `set_items` function will only display the `content` key in the
completion window, it will not do any sorting or filtering, that must be
done before passing the data to the `set_items` function.
This commit is contained in:
parent
e25a96c34a
commit
a712c929cb
3 changed files with 27 additions and 28 deletions
|
|
@ -11,7 +11,8 @@ controller.run = function(name, items, callback)
|
|||
controller.items = items
|
||||
|
||||
window.initialize()
|
||||
window.set_items { "-- Loading ---" }
|
||||
|
||||
window.set_items { { content = "-- Loading ---" } }
|
||||
vim.api.nvim_buf_set_name(window.get_buffer(), name)
|
||||
|
||||
controller.input ""
|
||||
|
|
|
|||
|
|
@ -13,26 +13,12 @@ local chars = {
|
|||
}
|
||||
|
||||
local function string_to_table(lines)
|
||||
local items = {}
|
||||
local matches = {}
|
||||
for line in lines:gmatch "[^\r\n]+" do
|
||||
table.insert(items, line)
|
||||
table.insert(matches, { content = 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
|
||||
return matches
|
||||
end
|
||||
|
||||
local window = {}
|
||||
|
|
@ -112,16 +98,28 @@ window.update = function()
|
|||
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)
|
||||
if type(items) == "string" then
|
||||
items = string_to_table(items)
|
||||
end
|
||||
|
||||
local line_count = vim.api.nvim_buf_line_count(window.buffer)
|
||||
window.index = line_count - 1
|
||||
-- TODO(ade): Validate the items are in the correct format. This also need to
|
||||
-- come with some descriptive messages and possible help.
|
||||
|
||||
-- Display no items text if there are no items to dispaly
|
||||
if #items == 0 then
|
||||
items = { { content = "-- No Items --" } }
|
||||
end
|
||||
|
||||
local items_length = #items
|
||||
window.index = items_length - 1
|
||||
|
||||
for index = 1, items_length do
|
||||
vim.api.nvim_buf_set_lines(window.buffer, index - 1, -1, false, { items[index].content })
|
||||
end
|
||||
|
||||
-- Limit the results window size to 10 so when there are lots of results the
|
||||
-- window does not take up the hole terminal
|
||||
local line_count = items_length - 1
|
||||
if line_count > 10 then
|
||||
line_count = 10
|
||||
end
|
||||
|
|
|
|||
|
|
@ -30,13 +30,13 @@ vim.api.nvim_create_user_command("IvyBuffers", function()
|
|||
if vim.api.nvim_buf_is_loaded(buffer) and #buffer_name > 0 then
|
||||
local score = libivy.ivy_match(input, buffer_name)
|
||||
if score > -200 or #input == 0 then
|
||||
table.insert(list, { score, buffer_name })
|
||||
table.insert(list, { score = score, content = buffer_name })
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
table.sort(list, function(a, b)
|
||||
return a[1] < b[1]
|
||||
return a.score < b.score
|
||||
end)
|
||||
|
||||
return list
|
||||
|
|
|
|||
Loading…
Reference in a new issue