aboutsummaryrefslogtreecommitdiff
path: root/.config/nvim/lua/plugins/cmp-gh-source.lua
diff options
context:
space:
mode:
authorsrdusr <trevorgray@srdusr.com>2023-02-10 11:22:07 +0200
committersrdusr <trevorgray@srdusr.com>2023-02-10 11:22:07 +0200
commit7cee6e5a673defef72c803eca094d1247c31bb9c (patch)
tree1dbc97c5ece5f574ef5091d549fb434a8b59a625 /.config/nvim/lua/plugins/cmp-gh-source.lua
parentb91ee8da3ef2c1c154833b4b6e99250fe2c280e7 (diff)
parentf76f2c4bbc1ddde4b5c0882863060e4c58a11733 (diff)
downloaddotfiles-7cee6e5a673defef72c803eca094d1247c31bb9c.tar.gz
dotfiles-7cee6e5a673defef72c803eca094d1247c31bb9c.zip
Add '.config/nvim/' from commit 'e707f3abc83e0621eab64b4828defd0c80dff5c0'
git-subtree-dir: .config/nvim git-subtree-mainline: bb29321714929e1b7b962dd47b486325fd77e67a git-subtree-split: e707f3abc83e0621eab64b4828defd0c80dff5c0
Diffstat (limited to '.config/nvim/lua/plugins/cmp-gh-source.lua')
-rw-r--r--.config/nvim/lua/plugins/cmp-gh-source.lua72
1 files changed, 72 insertions, 0 deletions
diff --git a/.config/nvim/lua/plugins/cmp-gh-source.lua b/.config/nvim/lua/plugins/cmp-gh-source.lua
new file mode 100644
index 0000000..05bba55
--- /dev/null
+++ b/.config/nvim/lua/plugins/cmp-gh-source.lua
@@ -0,0 +1,72 @@
+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())