티스토리 뷰

 

nvim-cmp란?

nvim-cmp는 lsp기반 자동완성 플러그인 입니다.

 

vim쓰면서 가장 아쉬웠던 부분이 '자동완성'이었습니다. 저는 IntelliJ의 Ideavim정도만 쓰다가 vim으로 개발을 해야 하는 상황을 만났습다. linux에서만 돌아가는 코드를 작성해야 하는 상황이었는데요 shell script를 작성 할때 vim으로 코딩 했습니다.

 

이럴 때 '자동완성'기능이 너무나 아쉽습니다. 하지만 vim에서 자동완성 기능을 구글에 검색 해보면 설정하는게 한글로 된 문서가 별로 없고 요즘은 잘 안쓴다는 coc, youCompleteMe 등에 관한 포스팅만 있어서 잘 못하고 있다가 vim.kr에서 검색을 하면서 겨우 설정에 성공 했습니다.

 

nvim-cmp를 쓰는 이유

앞서 말한 coc와 ycm(youCompleteMe) 대신 nvim-cmp를 고른 이유가 있습니다. coc는 node를 깔아주어야 하고 youCompleteMe는 python관련 의존성이 있는 것으로 보였습니다. 대신 nvim-cmp는 lsp를 쓴다고 해서 좀더 표준화 된 플러그인 이라는 생각이 들어서 입니다. 그리고 레딧같은데 검색 해보면 nvim-cmp가 대세라고 해서 처음 세팅 하니까 coc, ycm대신 nvim-cmp를 쓰기로 했습니다.

 

Prerequisite

저는 패키지 관리 도구 lazy로 했습니다. plug, packer등을 쓴다면 불가능 합니다.

Lazy는 아래 링크입니다.(주의 : LazyVim아님)

https://github.com/folke/lazy.nvim

 

진입장벽

설치하는데 직관적이지는 않습니다. 설치 하려고 공식 github페이지에 들어가보면 좀 난해 합니다.

https://github.com/hrsh7th/nvim-cmp

 

 

다양한 플러그인을 지원 하기 때문에 '나는 뭘 깔아야 하나?' 라는 생각이 들면서 저는 여기에서 몇번 포기 했습니다.

 

설정 코드

코드는 다음 위치에 아래 설정 코드를 넣고 설정을 했습니다.

 

위치

 

nvim-cmp설정 코드

return{
    {
        'hrsh7th/nvim-cmp',
        lazy = false,
        priority = 100,
        dependencies = {
            'hrsh7th/cmp-nvim-lsp',
            'hrsh7th/cmp-buffer',
            'hrsh7th/cmp-path',
            'hrsh7th/cmp-nvim-lsp',
            'hrsh7th/cmp-nvim-lsp-signature-help',
            'onsails/lspkind.nvim',
            'ray-x/cmp-treesitter',
            'L3MON4D3/LuaSnip'
        },
        event = "InsertEnter",
        config = function()
        local cmp = require 'cmp'
        local luasnip = require 'luasnip'
        cmp.setup {
            snippet = {
                expand = function(args)
                    luasnip.lsp_expand(args.body)
                end,
            },
            formatting = {
                format = require 'lspkind'.cmp_format {
                    mode = "symbol_text",
                    menu = {
                        nvim_lsp = "[LSP]",
                        buffer = "[Buffer]",
                        latex_symbols = "[Latex]",
                        luasnip = "[LuaSnip]",
                    }
                }
            },
            window = {
                completion = cmp.config.window.bordered(),
                documentation = cmp.config.window.bordered(),
            },
            view = {
                entries = {
                    name = 'custom',
                    selection_order = 'near_cursor'
                }
            },
            mapping = cmp.mapping.preset.insert({
                ['<C-b>'] = cmp.mapping.scroll_docs(-4),
                ['<C-f>'] = cmp.mapping.scroll_docs(4),
                ['<C-Space>'] = cmp.mapping.complete(),
                ['<CR>'] = cmp.mapping.confirm {
                    behavior = cmp.ConfirmBehavior.Replace,
                    select = true,
                },
                ['<Tab>'] = cmp.mapping(function(fallback)
                    if cmp.visible() then
                        cmp.select_next_item()
                    elseif luasnip.expand_or_jumpable() then
                        luasnip.expand_or_jump()
                    else
                        fallback()
                    end
                end, { 'i', 's' }),
                ['<S-Tab>'] = cmp.mapping(function(fallback)
                    if cmp.visible() then
                        cmp.select_prev_item()
                    elseif luasnip.jumpable(-1) then
                        luasnip.jump(-1)
                    else
                        fallback()
                    end
                end, { 'i', 's' }),
            }),
            sources = cmp.config.sources({
                { name = 'nvim_lsp' },
                { name = 'luasnip' },
                { name = 'buffer' },
                { name = 'calc' },
                { name = 'path' },
                { name = 'treesitter' },
            })
        }
    end
    }

}

 

 

dotfiles

완료된 설정파일

https://github.com/Kyeongrok/nvim-init/blob/main/lua/plugins/nvim-cmp.lua

 

nvim-init/lua/plugins/nvim-cmp.lua at main · Kyeongrok/nvim-init

Contribute to Kyeongrok/nvim-init development by creating an account on GitHub.

github.com

 

 

 

 

참고

https://github.com/racagogi/nvim-config/blob/main/lua/plugins/lsp/nvim-cmp.lua

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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
글 보관함