diff --git a/doc/cmp.txt b/doc/cmp.txt index d440113..45ed3a1 100644 --- a/doc/cmp.txt +++ b/doc/cmp.txt @@ -456,7 +456,13 @@ performance.fetching_timeout~ Sets the timeout of candidate fetching process. The nvim-cmp will wait to display the most prioritized source. - *cmp-config.performance.confirm_resolve_timeout* + *cmp-config.performance.filtering_context_budget* +performance.filtering_context_budget~ + `number` + Sets the filtering context budget in ms. + If filtering takes longer than this, it will be deferred. + + *cmp-config.performance.confirm_resolve_timeout* performance.confirm_resolve_timeout~ `number` Sets the timeout for resolving item before confirmation. diff --git a/lua/cmp/config/default.lua b/lua/cmp/config/default.lua index 23d0a05..2087071 100644 --- a/lua/cmp/config/default.lua +++ b/lua/cmp/config/default.lua @@ -19,6 +19,7 @@ return function() debounce = 60, throttle = 30, fetching_timeout = 500, + filtering_context_budget = 3, confirm_resolve_timeout = 80, async_budget = 1, max_view_entries = 200, diff --git a/lua/cmp/source.lua b/lua/cmp/source.lua index bac5818..c0f1048 100644 --- a/lua/cmp/source.lua +++ b/lua/cmp/source.lua @@ -61,7 +61,8 @@ source.reset = function(self) self.request_offset = -1 self.completion_context = nil self.status = source.SourceStatus.WAITING - self.complete_dedup(function() end) + self.complete_dedup(function() + end) end ---Return source config @@ -111,6 +112,9 @@ source.get_entries = function(self, ctx) ---@type cmp.Entry[] local entries = {} local matching_config = self:get_matching_config() + local filtering_context_budget = config.get().performance.filtering_context_budget / 1000 + + local s = os.clock() for _, e in ipairs(target_entries) do local o = e.offset if not inputs[o] then @@ -128,9 +132,13 @@ source.get_entries = function(self, ctx) entries[#entries + 1] = e end end - async.yield() - if ctx.aborted then - async.abort() + + if os.clock() - s > filtering_context_budget then + async.yield() + if ctx.aborted then + async.abort() + end + s = os.clock() end end diff --git a/lua/cmp/types/cmp.lua b/lua/cmp/types/cmp.lua index e42dcc4..982261d 100644 --- a/lua/cmp/types/cmp.lua +++ b/lua/cmp/types/cmp.lua @@ -103,6 +103,7 @@ cmp.ItemField = { ---@field public debounce integer ---@field public throttle integer ---@field public fetching_timeout integer +---@field public filtering_context_budget integer ---@field public confirm_resolve_timeout integer ---@field public async_budget integer Maximum time (in ms) an async function is allowed to run during one step of the event loop. ---@field public max_view_entries integer