1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
return {
"hrsh7th/nvim-cmp",
version = false, -- last release is way too old
event = { "InsertEnter", "CmdlineEnter" },
dependencies = {
"L3MON4D3/LuaSnip", -- Snippet engine
"rafamadriz/friendly-snippets", -- Useful snippets in VSCode snippet format
"onsails/lspkind.nvim", -- Pretty formatting in the completion menu
-- Completion sources
"hrsh7th/cmp-nvim-lsp",
"hrsh7th/cmp-nvim-lsp-signature-help",
"hrsh7th/cmp-buffer",
"hrsh7th/cmp-path",
"saadparwaiz1/cmp_luasnip",
},
config = function()
local cmp = require("cmp")
local luasnip = require("luasnip")
-- Load any VSCode-style snippets from other installed plugins
require("luasnip.loaders.from_vscode").lazy_load()
cmp.setup({
completion = {
-- See :help completeopt
completeopt = "menu,menuone,noinsert,preview",
},
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
mapping = cmp.mapping.preset.insert({
["<C-n>"] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }),
["<C-p>"] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }),
["<C-b>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(4),
-- Ctrl+Space does not currently work in Neovim core on Windows
-- https://github.com/neovim/neovim/issues/8435
-- ["<C-Space>"] = cmp.mapping.complete(),
["<C-c>"] = cmp.mapping.complete(),
["<C-e>"] = cmp.mapping.abort(),
["<C-y>"] = cmp.mapping.confirm({
-- Accept currently selected item
behavior = cmp.ConfirmBehavior.Insert,
select = true,
}),
["<C-S-y>"] = cmp.mapping.confirm({
-- Accept currently selected item, replacing stuff as needed
behavior = cmp.ConfirmBehavior.Replace,
select = true,
}),
["<CR>"] = cmp.mapping({
-- https://github.com/hrsh7th/nvim-cmp/wiki/Example-mappings#safely-select-entries-with-cr
i = function(fallback)
-- In insert mode, only use Enter to complete something if cmp
-- is active and the user has explicitly selected an item
if cmp.visible() and cmp.get_active_entry() then
cmp.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false })
else
fallback()
end
end,
s = cmp.mapping.confirm({ select = true }),
c = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true }),
}),
}),
sorting = {
priority_weight = 2,
comparators = {
cmp.config.compare.exact,
-- Mostly default sort order from cmp
cmp.config.compare.offset,
-- cmp.config.compare.scopes, --this is commented in nvim-cmp too
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,
},
},
sources = {
-- LSP results should be first priority
{ name = "nvim_lsp", group_index = 1 },
{ name = "nvim_lsp_signature_help", group_index = 2 },
{ name = "luasnip", group_index = 2 },
{ name = "path", group_index = 2 },
{ name = "buffer", group_index = 2, keyword_length = 5 },
},
formatting = {
format = require("lspkind").cmp_format({
mode = "symbol_text",
-- maxwidth = 50,
maxwidth = function()
return math.floor(0.45 * vim.o.columns)
end,
ellipsis_char = "...",
show_labelDetails = true,
}),
},
experimental = {
ghost_text = {
hl_group = "LspCodeLens",
},
},
window = {
completion = cmp.config.window.bordered(),
documentation = cmp.config.window.bordered(),
},
})
end,
}
|