1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 05:50:05 +08:00
SpaceVim/bundle/cmp-dictionary/lua/cmp_dictionary/document.lua
2023-06-11 21:41:39 +08:00

77 lines
1.8 KiB
Lua

local config = require("cmp_dictionary.config")
local document_cache = require("cmp_dictionary.lfu").init(100)
---@param word string
---@return string
---@return string[]
local function get_command(word)
local command = config.get("document_command")
local args
if type(command) == "table" then
-- copy
args = {}
for i, v in ipairs(command) do
args[i] = v
end
elseif type(command) == "string" then
args = vim.split(command, " ")
end
local cmd = table.remove(args, 1)
for i, arg in ipairs(args) do
if arg:find("%s", 1, true) then
args[i] = arg:format(word)
end
end
return cmd, args
end
---@param completion_item lsp.CompletionItem
---@param callback fun(completion_item: lsp.CompletionItem|nil)
local function get_document(completion_item, callback)
local ok, Job = pcall(require, "plenary.job")
if not ok then
vim.notify("[cmp-dictionary] document feature requires plenary.nvim")
return
end
local word = completion_item.label
local command, args = get_command(word)
if not command then
callback(completion_item)
return
end
Job:new({
command = command,
args = args,
on_exit = vim.schedule_wrap(function(j)
local result = table.concat(j:result(), "\n")
document_cache:set(word, result)
completion_item.documentation = result
callback(completion_item)
end),
}):start()
end
---@param completion_item lsp.CompletionItem
---@param callback fun(completion_item: lsp.CompletionItem|nil)
local function resolve(completion_item, callback)
if config.get("document") then
local cached = document_cache:get(completion_item.label)
if cached then
completion_item.documentation = cached
callback(completion_item)
else
get_document(completion_item, callback)
end
else
callback(completion_item)
end
end
return resolve