|
1 | 1 | local util = require("copilot.util") |
| 2 | +local format = require("copilot_cmp.format") |
2 | 3 |
|
3 | 4 | local panel = { |
4 | | - n_results = 5, |
5 | 5 | method = "getPanelCompletions", |
6 | 6 | usecmp = false, |
| 7 | + cache_line = true, |
7 | 8 | buf = "", |
8 | 9 | uri = "", |
9 | 10 | } |
10 | 11 |
|
11 | | -local completions = {} |
| 12 | +local existing_matches= {} |
| 13 | + |
| 14 | +panel.send_request = function (callback) |
| 15 | + local completion_params = util.get_completion_params() |
| 16 | + completion_params.panelId = panel.uri |
| 17 | + callback = callback or function () end |
| 18 | + vim.lsp.buf_request(0, panel.method, completion_params, callback) |
| 19 | +end |
12 | 20 |
|
13 | 21 | panel.complete = vim.schedule_wrap(function (_, params, callback) |
| 22 | + local context = params.context |
| 23 | + existing_matches[context.bufnr] = existing_matches[context.bufnr] or {} |
| 24 | + existing_matches[context.bufnr][context.cursor.row] = existing_matches[context.bufnr][context.cursor.row] or {} |
| 25 | + |
14 | 26 | local add_completion = function (result) |
15 | | - local format = require("copilot_cmp.format").format_item |
16 | 27 | if result then |
17 | 28 | result.text = result.displayText |
18 | | - local formatted = format(params, result) |
19 | | - completions[formatted.label] = formatted |
| 29 | + local formatted = format.format_item(params, result) |
| 30 | + existing_matches[context.bufnr][context.cursor.row][formatted.label] = formatted |
20 | 31 | vim.schedule(function() callback({ |
21 | 32 | isIncomplete = true, |
22 | | - items = vim.tbl_values(completions) |
| 33 | + items = vim.tbl_values(existing_matches[context.bufnr][context.cursor.row]) |
23 | 34 | }) end) |
24 | 35 | end |
25 | 36 | end |
26 | 37 |
|
27 | 38 | local completed = function () |
28 | | - vim.schedule(function() |
29 | | - vim.schedule(function() callback({ |
30 | | - isIncomplete = false, |
31 | | - items = vim.tbl_values(completions) |
32 | | - }) end) |
33 | | - completions = { isIncomplete = true, items = {} } |
34 | | - end) |
| 39 | + vim.schedule(function() callback({ |
| 40 | + isIncomplete = false, |
| 41 | + items = vim.tbl_values(existing_matches[context.bufnr][context.cursor.row]) |
| 42 | + }) end) |
| 43 | + if not panel.cache_line then |
| 44 | + existing_matches[context.bufnr][context.cursor.row] = {} |
| 45 | + end |
35 | 46 | end |
36 | 47 |
|
37 | | - local completion_params = util.get_completion_params(panel.method) |
38 | | - completion_params.panelId = panel.uri |
39 | | - vim.lsp.buf_request(0, panel.method, completion_params, function () end) |
| 48 | + local handler = require("copilot.handlers").add_handler_callback |
| 49 | + handler("PanelSolution", "cmp", add_completion) |
| 50 | + handler("PanelSolutionsDone", "cmp", completed) |
40 | 51 |
|
41 | | - local handlers = require("copilot.handlers") |
| 52 | + panel.send_request() |
42 | 53 |
|
43 | | - vim.lsp.handlers["PanelSolution"] = vim.lsp.with(handlers["PanelSolution"], { |
44 | | - callback = add_completion |
45 | | - }) |
46 | | - vim.lsp.handlers["PanelSolutionDone"] = vim.lsp.with(handlers["PanelSolutionDone"], { |
47 | | - completed |
48 | | - }) |
49 | 54 | callback({ isIncomplete = true }) |
50 | | - |
51 | 55 | end) |
52 | 56 |
|
53 | 57 | function panel.create (opts) |
54 | 58 | panel = vim.tbl_deep_extend("force", panel, opts or {}) |
55 | 59 | panel.buf = type(panel.uri) == "number" or vim.api.nvim_create_buf(false, true) |
56 | 60 | vim.api.nvim_buf_set_name(panel.buf, "copilot:///" .. tostring(panel.buf)) |
57 | 61 | panel.uri = vim.uri_from_bufnr(panel.buf) |
| 62 | + vim.api.nvim_create_user_command("CopilotPanel", function () |
| 63 | + local panel_suggestions = {} |
| 64 | + local handlers = require("copilot.handlers") |
| 65 | + handlers.add_handler_callback("PanelSolution", "print", function (result) |
| 66 | + table.insert(panel_suggestions, format.clean_insertion(result.displayText)) |
| 67 | + end) |
| 68 | + handlers.add_handler_callback("PanelSolutionsDone", "print", function () |
| 69 | + local print_buf = require("copilot.print_buf").init() |
| 70 | + print_buf.print(panel_suggestions) |
| 71 | + handlers.remove_handler_callback("PanelSolution", "print") |
| 72 | + handlers.remove_handler_callback("PanelSolutionsDone", "print") |
| 73 | + end) |
| 74 | + panel.send_request() |
| 75 | + end, {}) |
58 | 76 | return panel |
59 | 77 | end |
60 | 78 |
|
|
0 commit comments