summaryrefslogtreecommitdiff
path: root/dot_config/nvim/lua/ibrahim/plugins/nvim-cmp.lua
blob: 151e67bff66d8bfcc32fec70514316b049e6b935 (plain)
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,
}