티스토리 뷰

 

nvim-cmp란?

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

 

제 경우에는 Vim으로 코딩을 할 때 다른 IDE로 넘어가게 되는 지점이 '자동완성'이었습니다. 저는 IntelliJ의 Ideavim정도만 쓰다가 Linux환경에서 Vim으로 개발을 해야 하는 상황을 만났습다. 예를 들면 Shell script를 작성 하는 작업이라던지 리눅스에서만 지원하는 파이썬 라이브러리를 써야 할때 였습니다. 이 때는 IntelliJ를 쓸 수는 없고 Vim으로 코딩 해야했습니다.

 

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

neovim에서 자동완성 추천이 뜨는 화면

 

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

 

 

 

주의할 점

nvim-cmp를 활성화 시켰을 때 로딩 시간이 길어질 수 있습니다. 그럴때는 lazy옵션이 위 설정파일에는 false이지만 true로 바꿔보면 로딩속도를 빠르게 할 수 있습니다.

 

 

 

 

참고

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

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