2023-12-01 20:26:00 +00:00
local cmp = require ( ' cmp ' )
local lspkind = require ( ' lspkind ' )
2022-10-06 04:44:41 +00:00
2023-12-01 20:26:00 +00:00
local has_words_before = function ( )
if vim.api . nvim_buf_get_option ( 0 , " buftype " ) == " prompt " then return false end
local line , col = unpack ( vim.api . nvim_win_get_cursor ( 0 ) )
return col ~= 0 and vim.api . nvim_buf_get_text ( 0 , line - 1 , 0 , line - 1 , col , { } ) [ 1 ] : match ( " ^%s*$ " ) == nil
end
2022-10-06 04:44:41 +00:00
cmp.setup ( {
experimental = { ghost_text = true } ,
snippet = {
-- REQUIRED - you must specify a snippet engine
expand = function ( args )
vim.fn [ ' vsnip#anonymous ' ] ( args.body ) -- For `vsnip` users.
-- require('luasnip').lsp_expand(args.body) -- For `luasnip` users.
-- require('snippy').expand_snippet(args.body) -- For `snippy` users.
-- vim.fn["UltiSnips#Anon"](args.body) -- For `ultisnips` users.
end ,
} ,
window = {
-- completion = cmp.config.window.bordered(),
-- documentation = cmp.config.window.bordered(),
} ,
mapping = cmp.mapping . preset.insert ( {
[ ' <C-b> ' ] = cmp.mapping . scroll_docs ( - 4 ) ,
[ ' <C-f> ' ] = cmp.mapping . scroll_docs ( 4 ) ,
[ ' <C-Space> ' ] = cmp.mapping . complete ( ) ,
[ ' <C-e> ' ] = cmp.mapping . abort ( ) ,
2023-12-01 20:26:00 +00:00
[ ' <CR> ' ] = cmp.mapping . confirm ( { select = true , behavior = cmp.ConfirmBehavior . Replace } ) , -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
2022-10-06 04:44:41 +00:00
[ " <Tab> " ] = cmp.mapping ( function ( fallback )
2023-12-01 20:26:00 +00:00
if cmp.visible ( ) and has_words_before ( ) then
cmp.select_next_item ( { behavior = cmp.SelectBehavior . Select } )
2022-10-06 04:44:41 +00:00
else
fallback ( )
end
end , { " i " , " s " } ) ,
[ " <S-Tab> " ] = cmp.mapping ( function ( fallback )
if cmp.visible ( ) then
cmp.select_prev_item ( )
else
fallback ( )
end
end , { " i " , " s " } ) ,
} ) ,
sources = cmp.config . sources ( {
2023-12-01 20:26:00 +00:00
{ name = " copilot " , priority = 100 , group_index = 1 } ,
2022-10-06 04:44:41 +00:00
{
name = ' nvim_lsp_signature_help ' ,
2023-12-01 20:26:00 +00:00
priority = 90 ,
group_index = 2 ,
2022-10-06 04:44:41 +00:00
} ,
{
name = ' nvim_lsp ' ,
2023-12-01 20:26:00 +00:00
priority = 90 ,
group_index = 2 ,
2022-10-06 04:44:41 +00:00
} ,
{
name = ' buffer ' ,
priority = 80 ,
group_index = 3 ,
} ,
{
name = ' path ' ,
priority = 80 ,
group_index = 3 ,
} ,
{ name = ' vsnip ' } , -- For vsnip users.
-- { name = 'luasnip' }, -- For luasnip users.
-- { name = 'ultisnips' }, -- For ultisnips users.
-- { name = 'snippy' }, -- For snippy users.
} ) ,
sorting = {
2023-12-01 20:26:00 +00:00
priority_weight = 2 ,
2022-10-06 04:44:41 +00:00
comparators = {
2023-12-01 20:26:00 +00:00
require ( " copilot_cmp.comparators " ) . prioritize ,
require ( " copilot_cmp.comparators " ) . score ,
-- Below is the default comparitor list and order for nvim-cmp
cmp.config . compare.offset ,
-- cmp.config.compare.scopes, --this is commented in nvim-cmp too
cmp.config . compare.exact ,
cmp.config . compare.score ,
cmp.config . compare.recently_used ,
cmp.config . compare.locality ,
cmp.config . compare.kind ,
cmp.config . compare.sort_text ,
cmp.config . compare.length ,
cmp.config . compare.order , function ( ... ) return require ( ' cmp_buffer ' ) : compare_locality ( ... ) end ,
2022-10-06 04:44:41 +00:00
}
2023-12-01 20:26:00 +00:00
} ,
formatting = {
format = lspkind.cmp_format ( {
mode = ' symbol_text ' ,
maxwidth = 50 ,
ellipsis_char = ' … ' ,
2023-12-01 20:26:00 +00:00
-- symbol_map = { Copilot = '🤖' },
2023-12-01 20:26:00 +00:00
} )
2022-10-06 04:44:41 +00:00
}
} )
-- Set configuration for specific filetype.
cmp.setup . filetype ( ' gitcommit ' , {
sources = cmp.config . sources ( {
{ name = ' cmp_git ' } , -- You can specify the `cmp_git` source if you were installed it.
} , {
{ name = ' buffer ' } ,
} )
} )
-- Use buffer source for `/` and `?` (if you enabled `native_menu`, this won't work anymore).
cmp.setup . cmdline ( { ' / ' , ' ? ' } , {
mapping = cmp.mapping . preset.cmdline ( ) ,
sources = {
{ name = ' buffer ' }
}
} )
-- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore).
cmp.setup . cmdline ( ' : ' , {
mapping = cmp.mapping . preset.cmdline ( ) ,
sources = cmp.config . sources ( {
{ name = ' path ' }
} , {
{ name = ' cmdline ' , keyword_pattern = [=[[^[:blank:]\!]*]=] , keyword_length = 3 }
} )
} )
-- Add additional capabilities supported by nvim-cmp
2023-12-01 20:26:00 +00:00
local capabilities = require ( ' cmp_nvim_lsp ' ) . default_capabilities ( )
2022-10-06 04:44:41 +00:00
local lspconfig = require ( " lspconfig " )
-- Enable some language servers with the additional completion capabilities offered by nvim-cmp
local servers = { ' pyright ' , ' tsserver ' , ' html ' , ' cssls ' }
for _ , lsp in ipairs ( servers ) do
2023-12-01 20:26:00 +00:00
lspconfig [ lsp ] . setup ( {
-- on_attach = my_custom_on_attach,
capabilities = capabilities ,
} )
2022-10-06 04:44:41 +00:00
end
return {
capabilities ,
}