From 3945dc5d00c203cbd485f3868bab1cd649ce7464 Mon Sep 17 00:00:00 2001 From: hrsh7th Date: Fri, 29 Oct 2021 18:46:51 +0900 Subject: [PATCH] Add basic recently_used comparator --- README.md | 5 +++++ lua/cmp/config/compare.lua | 16 +++++++++++++++ lua/cmp/config/default.lua | 40 ++++++++++---------------------------- lua/cmp/init.lua | 11 ++++++++++- 4 files changed, 41 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 0d36701..752f8cd 100644 --- a/README.md +++ b/README.md @@ -360,6 +360,7 @@ Default: cmp.config.compare.offset, cmp.config.compare.exact, cmp.config.compare.score, + cmp.config.compare.recently_used, cmp.config.compare.kind, cmp.config.compare.sort_text, cmp.config.compare.length, @@ -478,6 +479,10 @@ Subscribe the following events. - `confirm_done` +#### `cmp.get_config()` + +Return the current configuration. + #### `cmp.visible()` Return the completion menu is visible or not. diff --git a/lua/cmp/config/compare.lua b/lua/cmp/config/compare.lua index 48eca2b..51bdcfe 100644 --- a/lua/cmp/config/compare.lua +++ b/lua/cmp/config/compare.lua @@ -30,6 +30,22 @@ compare.score = function(entry1, entry2) end end +-- recently_used +compare.recently_used = setmetatable({ + records = {}, + add_entry = function(self, e) + self.records[e.completion_item.label] = vim.loop.now() + end +}, { + __call = function(self, entry1, entry2) + local t1 = self.records[entry1.completion_item.label] or -1 + local t2 = self.records[entry2.completion_item.label] or -1 + if t1 ~= t2 then + return t1 > t2 + end + end +}) + -- kind compare.kind = function(entry1, entry2) local kind1 = entry1:get_kind() diff --git a/lua/cmp/config/default.lua b/lua/cmp/config/default.lua index 5779a09..28bf42d 100644 --- a/lua/cmp/config/default.lua +++ b/lua/cmp/config/default.lua @@ -47,34 +47,14 @@ return function() sorting = { priority_weight = 2, comparators = { - function(e1, e2) - local diff - diff = compare.offset(e1, e2) - if diff ~= nil then - return diff - end - diff = compare.exact(e1, e2) - if diff ~= nil then - return diff - end - diff = compare.score(e1, e2) - if diff ~= nil then - return diff - end - diff = compare.kind(e1, e2) - if diff ~= nil then - return diff - end - diff = compare.sort_text(e1, e2) - if diff ~= nil then - return diff - end - diff = compare.length(e1, e2) - if diff ~= nil then - return diff - end - return compare.order(e1, e2) - end, + compare.offset, + compare.exact, + compare.score, + compare.recently_used, + compare.kind, + compare.sort_text, + compare.length, + compare.order, }, }, @@ -102,7 +82,7 @@ return function() [''] = mapping({ c = function(fallback) local cmp = require('cmp') - if #cmp.core:get_sources() > 0 and not require('cmp.config').get().experimental.native_menu then + if #cmp.core:get_sources() > 0 and not cmp.get_config().experimental.native_menu then if cmp.visible() then cmp.select_next_item() else @@ -116,7 +96,7 @@ return function() [''] = mapping({ c = function(fallback) local cmp = require('cmp') - if #cmp.core:get_sources() > 0 and not require('cmp.config').get().experimental.native_menu then + if #cmp.core:get_sources() > 0 and not cmp.get_config().experimental.native_menu then if cmp.visible() then cmp.select_prev_item() else diff --git a/lua/cmp/init.lua b/lua/cmp/init.lua index cd93c3a..fe5461f 100644 --- a/lua/cmp/init.lua +++ b/lua/cmp/init.lua @@ -44,6 +44,12 @@ cmp.unregister_source = function(id) cmp.core:unregister_source(id) end +---Get current configuration. +---@return cmp.ConfigSchema +cmp.get_config = function() + return require('cmp.config').get() +end + ---Invoke completion manually cmp.complete = function() cmp.core:complete(cmp.core:get_context({ reason = cmp.ContextReason.Manual })) @@ -262,7 +268,6 @@ cmp.setup = setmetatable({ end, }) ----Handle events autocmd.subscribe('InsertEnter', function() -- Avoid unexpected mode detection (mode() function will returns `normal mode` on the InsertEnter event.) vim.schedule(function() @@ -290,4 +295,8 @@ autocmd.subscribe('InsertLeave', function() cmp.core.view:close() end) +cmp.event:on('confirm_done', function(e) + cmp.config.compare.recently_used:add_entry(e) +end) + return cmp