diff --git a/README.md b/README.md index ba8e3e4..8ab2ef5 100644 --- a/README.md +++ b/README.md @@ -241,8 +241,6 @@ The source specific maximum item count. The source group index. -This option must be sequential order. - You can call built-in utility like `cmp.config.sources({ { name = 'a' } }, { { name = 'b' } })`. #### preselect (type: cmp.PreselectMode) diff --git a/lua/cmp/types/cmp.lua b/lua/cmp/types/cmp.lua index 3d3f4f5..8f8171e 100644 --- a/lua/cmp/types/cmp.lua +++ b/lua/cmp/types/cmp.lua @@ -120,6 +120,6 @@ cmp.ItemField.Menu = 'menu' ---@field public keyword_pattern string ---@field public keyword_length number ---@field public max_item_count number ----@field public group number +---@field public group_index number return cmp diff --git a/lua/cmp/view.lua b/lua/cmp/view.lua index b785c3b..135ffa6 100644 --- a/lua/cmp/view.lua +++ b/lua/cmp/view.lua @@ -45,18 +45,23 @@ end ---@param ctx cmp.Context ---@param sources cmp.Source[] view.open = function(self, ctx, sources) - local group_index = 0 - local entries = {} - while true do - group_index = group_index + 1 - - local source_group = vim.tbl_filter(function(s) - return (s:get_config().group_index or 1) == group_index - end, sources) - - if #source_group == 0 then - break + local source_group_map = {} + for _, s in ipairs(sources) do + local group_index = s:get_config().group_index or 0 + if not source_group_map[group_index] then + source_group_map[group_index] = {} end + table.insert(source_group_map[group_index], s) + end + + local group_indexes = vim.tbl_keys(source_group_map) + table.sort(group_indexes, function(a, b) + return a ~= b and (a < b) or nil + end) + + local entries = {} + for _, group_index in ipairs(group_indexes) do + local source_group = source_group_map[group_index] or {} -- check the source triggered by character local has_triggered_by_symbol_source = false