nvim 자동완성 기능 nvim-cmp 추가하기 .lazy
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
참고
https://github.com/racagogi/nvim-config/blob/main/lua/plugins/lsp/nvim-cmp.lua