diff options
| author | srdusr <trevorgray@srdusr.com> | 2023-02-10 11:22:07 +0200 |
|---|---|---|
| committer | srdusr <trevorgray@srdusr.com> | 2023-02-10 11:22:07 +0200 |
| commit | 7cee6e5a673defef72c803eca094d1247c31bb9c (patch) | |
| tree | 1dbc97c5ece5f574ef5091d549fb434a8b59a625 /.config/nvim/lua/plugins/cmp-gh-source.lua | |
| parent | b91ee8da3ef2c1c154833b4b6e99250fe2c280e7 (diff) | |
| parent | f76f2c4bbc1ddde4b5c0882863060e4c58a11733 (diff) | |
| download | dotfiles-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.lua | 72 |
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()) |
