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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
local lsp = require("core.lsp.functions")
return { "hrsh7th/nvim-cmp",
requires = {
"nvim-treesitter/nvim-treesitter",
"lukas-reineke/cmp-under-comparator", -- better results
"xzbdmw/colorful-menu.nvim" -- fancy colors
},
-- suppliers for completions (they require nvim-cmp to be loaded before they are)
deps = {
"hrsh7th/cmp-buffer", -- buffers
"FelipeLema/cmp-async-path", -- path
{ "hrsh7th/cmp-nvim-lsp",
function()
-- add lsp capabilities
lsp.add_capabilities(require("cmp_nvim_lsp").default_capabilities())
end
}, -- lsp
"hrsh7th/cmp-nvim-lsp-signature-help", -- completion information
{ "L3MON4D3/cmp-luasnip-choice", -- luasnip
requires = "L3MON4D3/LuaSnip"
}
},
function()
local cmp = require("cmp")
local luasnip = require("luasnip")
-- setup cmp
cmp.setup {
-- disable when in comments
enabled = function()
local context = require("cmp.config.context")
if vim.api.nvim_get_mode().mode == "c" then
return true
else
return not context.in_treesitter_capture("comment")
and not context.in_syntax_group("Comment")
end
end,
-- completion sources
sources = cmp.config.sources {
{ name = "nvim_lsp", priority = 999 },
{ name = "luasnip_choice", priority = 750 },
{ name = "buffer", max_item_count = 3 },
{ name = "async_path", max_item_count = 5 },
{ name = "neorg" },
{ name = "nvim_lsp_signature_help" }
},
-- how to sort results
sorting = {
comparators = {
cmp.config.compare.exact,
cmp.config.compare.offset,
cmp.config.compare.score,
require("cmp-under-comparator").under,
cmp.config.compare.kind,
cmp.config.compare.sort_text,
cmp.config.compare.length,
cmp.config.compare.order,
}
},
-- appearance of window
window = {
completion = {
scrollbar = false,
border = vim.g.border_style,
winhighlight = "Normal:WinBarNC,FloatBorder:WinBarNC,Search:WinBarNC",
},
documentation = {
border = vim.g.border_style,
winhighlight = "Normal:WinBarNC,FloatBorder:WinBarNC,Search:WinBarNC",
}
},
-- position of window
view = {
entries = {
name = "custom",
selection_order = "near_cursor"
}
},
-- formatting of content
formatting = {
fields = { "menu", "abbr", "kind" },
format = function(entry, item)
local hl_info = require("colorful-menu").cmp_highlights(entry)
local menu_icon = {
nvim_lsp = "λ",
luasnip = "%",
buffer = "@",
path = "#",
async_path = "#"
}
-- add a little icon
item.menu = menu_icon[entry.source.name]
-- add highlights
if hl_info ~= nil then
item.abbr_hl_group = hl_info.highlights
item.abbr = hl_info.text
end
return item
end
},
experimental = {
ghost_text = true
},
-- snippet integration
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end
},
-- mappings
mapping = cmp.mapping.preset.insert {
["<C-y>"] = cmp.mapping.confirm {
select = true
},
["<C-n>"] = cmp.mapping.select_next_item(),
["<C-p>"] = cmp.mapping.select_prev_item(),
["<C-u>"] = cmp.mapping.scroll_docs(-4),
["<C-d>"] = cmp.mapping.scroll_docs(4),
["<ESC>"] = cmp.mapping.close()
}
}
end
}
|