1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
local ok, Job = pcall(require, 'plenary.job')
if not ok then
return
end
local source = {}
source.new = function()
local self = setmetatable({ cache = {} }, { __index = source })
return self
end
source.complete = function(self, _, callback)
local bufnr = vim.api.nvim_get_current_buf()
-- This just makes sure that we only hit the GH API once per session.
--
-- You could remove this if you wanted, but this just makes it so we're
-- good programming citizens.
if not self.cache[bufnr] then
Job:new({
-- Uses `gh` executable to request the issues from the remote repository.
'gh',
'issue',
'list',
'--limit',
'1000',
'--json',
'title,number,body',
on_exit = function(job)
local result = job:result()
local ok, parsed = pcall(vim.json.decode, table.concat(result, ''))
if not ok then
vim.notify('Failed to parse gh result')
return
end
local items = {}
for _, gh_item in ipairs(parsed) do
gh_item.body = string.gsub(gh_item.body or '', '\r', '')
table.insert(items, {
label = string.format('#%s', gh_item.number),
documentation = {
kind = 'markdown',
value = string.format('# %s\n\n%s', gh_item.title, gh_item.body),
},
})
end
callback({ items = items, isIncomplete = false })
self.cache[bufnr] = items
end,
}):start()
else
callback({ items = self.cache[bufnr], isIncomplete = false })
end
end
source.get_trigger_characters = function()
return { '#' }
end
source.is_available = function()
return vim.bo.filetype == 'gitcommit'
end
require('cmp').register_source('gh_issues', source.new())
|