63 lines
1.7 KiB
Lua
Executable file
63 lines
1.7 KiB
Lua
Executable file
local json = require "json"
|
|
local lunacolors = require "lunacolors"
|
|
|
|
local M = {}
|
|
|
|
M.fmt = function(str, style)
|
|
local styles = style:split(" ")
|
|
local formatStr = ""
|
|
for _, v in pairs(styles) do
|
|
formatStr = formatStr .. "{" .. v .. "}"
|
|
end
|
|
formatStr = formatStr .. str
|
|
return lunacolors.format(formatStr)
|
|
end
|
|
|
|
M.complete_func = function(query, ctx, fields)
|
|
local carapace_arg = ctx
|
|
|
|
-- If the ctx ends in a space, we need to append a "" to the carapace command
|
|
if ctx:sub(-1, -1):match("%s") ~= nil then
|
|
carapace_arg = carapace_arg .. '""'
|
|
end
|
|
|
|
-- Run carapace
|
|
local carapace_cmd = "carapace " .. fields[1] .. " export " .. carapace_arg
|
|
local res = io.popen(carapace_cmd)
|
|
local out = res:read("*all")
|
|
|
|
-- Extract completion items
|
|
local out_table = json.decode(out)
|
|
local values = {}
|
|
|
|
if out_table["values"] ~= nil then
|
|
for _, v in pairs(out_table["values"]) do
|
|
-- Some completion items are styled; some aren't.
|
|
if v["style"] ~= nil then
|
|
if v["description"] ~= nil then
|
|
values[v["value"]] = { M.fmt(v["description"], v["style"]) }
|
|
else
|
|
table.insert(values, v["value"])
|
|
end
|
|
else
|
|
if v["description"] ~= nil then
|
|
values[v["value"]] = { v["description"] }
|
|
else
|
|
table.insert(values, v["value"])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Construct completion items table
|
|
local comp = {
|
|
{
|
|
items = values,
|
|
type = "list"
|
|
}
|
|
}
|
|
|
|
return comp, query
|
|
end
|
|
|
|
return M
|