Implement source group.

Fixes #391
This commit is contained in:
hrsh7th
2021-10-22 18:23:49 +09:00
parent b546f50f09
commit e4a2cec153
5 changed files with 90 additions and 57 deletions

View File

@@ -46,18 +46,22 @@ Plug 'hrsh7th/cmp-nvim-lsp'
Plug 'hrsh7th/cmp-buffer'
Plug 'hrsh7th/nvim-cmp'
" For vsnip user.
" For vsnip users.
Plug 'hrsh7th/cmp-vsnip'
Plug 'hrsh7th/vim-vsnip'
" For luasnip user.
" For luasnip users.
" Plug 'L3MON4D3/LuaSnip'
" Plug 'saadparwaiz1/cmp_luasnip'
" For ultisnips user.
" For ultisnips users.
" Plug 'SirVer/ultisnips'
" Plug 'quangnguyen30192/cmp-nvim-ultisnips'
" For snippy users.
" Plug 'dcampos/nvim-snippy'
" Plug 'dcampos/cmp-snippy'
call plug#end()
set completeopt=menu,menuone,noselect
@@ -69,14 +73,10 @@ lua <<EOF
cmp.setup({
snippet = {
expand = function(args)
-- For `vsnip` user.
vim.fn["vsnip#anonymous"](args.body)
-- For `luasnip` user.
-- require('luasnip').lsp_expand(args.body)
-- For `ultisnips` user.
-- vim.fn["UltiSnips#Anon"](args.body)
vim.fn["vsnip#anonymous"](args.body) -- For `vsnip` users.
-- require('luasnip').lsp_expand(args.body) -- For `luasnip` users.
-- vim.fn["UltiSnips#Anon"](args.body) -- For `ultisnips` users.
-- require'snippy'.expand_snippet(args.body) -- For `snippy` users.
end,
},
mapping = {
@@ -86,25 +86,22 @@ lua <<EOF
['<C-e>'] = cmp.mapping.close(),
['<CR>'] = cmp.mapping.confirm({ select = true }),
},
sources = {
sources = cmp.config.sources({
{ name = 'nvim_lsp' },
-- For vsnip user.
{ name = 'vsnip' },
-- For luasnip user.
-- { name = 'luasnip' },
-- For ultisnips user.
-- { name = 'ultisnips' },
{ name = 'vsnip' }, -- For vsnip users.
-- { name = 'luasnip' }, -- For luasnip users.
-- { name = 'ultisnips' }, -- For ultisnips users.
-- { name = 'snippy' }, -- For snippy users.
}, {
{ name = 'buffer' },
})
}
})
-- Setup lspconfig.
local capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities())
require('lspconfig')[%YOUR_LSP_SERVER%].setup {
capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities())
capabilities = capabilities
}
EOF
```
@@ -241,6 +238,14 @@ The source specific keyword_length for override.
The source specific maximum item count.
#### sources[number].group (type: number)
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)
Specify preselect mode. The following modes are available.

View File

@@ -0,0 +1,10 @@
return function(...)
local sources = {}
for i, group in ipairs({ unpack(...) }) do
for _, source in ipairs(group) do
source.group = i
table.insert(sources, source);
end
end
return sources
end

View File

@@ -18,6 +18,7 @@ cmp.vim = require('cmp.types.vim')
---Export default config presets.
cmp.config = {}
cmp.config.compare = require('cmp.config.compare')
cmp.config.sources = require('cmp.config.sources')
---Export mapping
cmp.mapping = require('cmp.config.mapping')

View File

@@ -120,5 +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
return cmp

View File

@@ -45,11 +45,22 @@ end
---@param ctx cmp.Context
---@param sources cmp.Source[]
view.open = function(self, ctx, sources)
local group_index = -1
local entries = {}
while true do
group_index = group_index + 1
local group = vim.tbl_filter(function(s)
return (s:get_config().group or 0) == group_index
end, sources)
if #group == 0 then
break
end
-- check the source triggered by character
local has_triggered_by_symbol_source = false
for _, s in ipairs(sources) do
for _, s in ipairs(group) do
if #s:get_entries(ctx) > 0 then
if s.is_triggered_by_symbol then
has_triggered_by_symbol_source = true
@@ -60,11 +71,11 @@ view.open = function(self, ctx, sources)
-- create filtered entries.
local offset = ctx.cursor.col
for i, s in ipairs(sources) do
for i, s in ipairs(group) do
if s.offset <= offset then
if not has_triggered_by_symbol_source or s.is_triggered_by_symbol then
-- source order priority bonus.
local priority = s:get_config().priority or ((#sources - (i - 1)) * config.get().sorting.priority_weight)
local priority = s:get_config().priority or ((#group - (i - 1)) * config.get().sorting.priority_weight)
for _, e in ipairs(s:get_entries(ctx)) do
e.score = e.score + priority
@@ -89,7 +100,12 @@ view.open = function(self, ctx, sources)
-- open
if #entries > 0 then
self:_get_entries_view():open(offset, entries)
else
break
end
end
-- close.
if #entries == 0 then
self:close()
end
end