local M = {} local format_pos = function() local pos = vim.api.nvim_win_get_cursor(0) return { character = pos[2], line = pos[1] - 1 } end local get_relfile = function() local file, _ = string.gsub(vim.api.nvim_buf_get_name(0), vim.loop.cwd() .. "/", "") return file end M.find_copilot_client = function() for _, client in ipairs(vim.lsp.get_active_clients()) do if client.name == "copilot" then return client.id end end end M.find_copilot_buf_client = function() for _, client in ipairs(vim.lsp.buf_get_clients(0)) do if client.name == "copilot" then return client.id end end end M.get_completion_params = function() local params = { options = vim.empty_dict(), doc = { relativePath = get_relfile(), source = table.concat(vim.api.nvim_buf_get_lines(0, 0, -1, false), "\n"), languageId = vim.bo.filetype, insertSpaces = true, tabsize = vim.bo.shiftwidth, indentsize = vim.bo.shiftwidth, position = format_pos(), path = vim.api.nvim_buf_get_name(0), }, } return params end M.get_copilot_path = function(plugin_path) for _, loc in ipairs({ "/opt", "/start", "" }) do local copilot_path = plugin_path .. loc .. "/copilot.lua/copilot/index.js" if vim.fn.filereadable(copilot_path) ~= 0 then return copilot_path end end end local function completion_handler(_, result, _, _) print(vim.inspect(result)) end M.register_completion_handler = function(handler) if handler then completion_handler = handler end end M.send_completion_request = function() local params = M.get_completion_params() vim.lsp.buf_request(0, "getCompletions", params, completion_handler) end M.create_request_autocmd = function(group) vim.api.nvim_create_autocmd(group, { callback = M.send_completion_request }) end return M