diff --git a/lua/copilot_cmp/comparators.lua b/lua/copilot_cmp/comparators.lua index 258a754..a059917 100644 --- a/lua/copilot_cmp/comparators.lua +++ b/lua/copilot_cmp/comparators.lua @@ -1,15 +1,18 @@ local comparators = {} -comparators.score = function (entry1, entry2) - if entry1.score and entry2.score then - return entry1.score > entry2.score +comparators.score = function(entry1, entry2) + local diff = (entry1.completion_item.copilot and 1.2 * entry1.score or entry1.score) + - (entry2.completion_item.copilot and 1.2 * entry2.score or entry2.score) + if diff < 0 then + return false end + return diff > 0 or nil end -comparators.prioritize = function (entry1, entry2) - if entry1.copilot and not entry2.copilot then +comparators.prioritize = function(entry1, entry2) + if entry1.completion_item.copilot and not entry2.completion_item.copilot then return true - elseif entry2.copilot and not entry1.copilot then + elseif entry2.completion_item.copilot and not entry1.completion_item.copilot then return false end end diff --git a/lua/copilot_cmp/completion_functions.lua b/lua/copilot_cmp/completion_functions.lua index c7ee231..be4ed9c 100644 --- a/lua/copilot_cmp/completion_functions.lua +++ b/lua/copilot_cmp/completion_functions.lua @@ -5,31 +5,38 @@ local api = require("copilot.api") local methods = { opts = { fix_pairs = true, - } + }, } -methods.getCompletionsCycling = function (self, params, callback) +methods.getCompletionsCycling = function(self, params, callback) local respond_callback = function(err, response) - if err or not response or not response.completions then - return callback({isIncomplete = false, items = {}}) + return callback({ isIncomplete = true, items = {} }) end + local indent = params.context.cursor_before_line:find("%S") or 1 + local items = vim.tbl_map(function(item) - return format.format_item(item, params.context, methods.opts) + local ret = format.format_item(item, params.context, methods.opts) + + ret.textEdit.insert.start.character = ret.textEdit.insert.start.character + indent - 1 + ret.textEdit.newText = ret.textEdit.newText:sub(indent) + if ret.textEdit.insert["end"].character < ret.textEdit.insert.start.character then + ret.textEdit.insert["end"].character = ret.textEdit.insert.start.character + end + return ret end, vim.tbl_values(response.completions)) return callback({ - isIncomplete = false, - items = items + isIncomplete = true, + items = items, }) end api.get_completions_cycling(self.client, util.get_doc_params(), respond_callback) - return callback({isIncomplete = true, items = {}}) end -methods.init = function (completion_method, opts) +methods.init = function(completion_method, opts) methods.opts.fix_pairs = opts.fix_pairs return methods[completion_method] end diff --git a/lua/copilot_cmp/source.lua b/lua/copilot_cmp/source.lua index 712791a..5f9ad6d 100644 --- a/lua/copilot_cmp/source.lua +++ b/lua/copilot_cmp/source.lua @@ -2,16 +2,12 @@ local source = { executions = {}, } -function source:get_keyword_pattern() - return '.' -end - source.get_trigger_characters = function() - return {'.'} + return { ".", " ", "\t" } end -- executes before selection -source.resolve = function (self, completion_item, callback) +source.resolve = function(self, completion_item, callback) for _, fn in ipairs(self.executions) do completion_item = fn(completion_item) end @@ -49,12 +45,12 @@ source.new = function(client, opts) local completion_functions = require("copilot_cmp.completion_functions") local self = setmetatable({ - timer = vim.loop.new_timer() + timer = vim.loop.new_timer(), }, { __index = source }) self.client = client self.request_ids = {} - self.complete = completion_functions.init('getCompletionsCycling', opts) + self.complete = completion_functions.init("getCompletionsCycling", opts) return self end