Configuração de Autocomplete para C e C++ no Vim com coc.nvim

Para obter uma experiência de desenvolvimento moderna em C e C++ utilizando o Vim ou Neovim, o coc.nvim (Conquer of Completion) é uma das ferramentas mais robustas. Ele atua como um cliente de Language Server Protocol (LSP), permitindo funcionalidades como autocompletar, navegação de código e diagnóstico de erros.

1. Preparação do Ambiente

Antes de instalar o plugin, é necessário garantir que o ecossistema Node.js e o compilador/ferramenta de análise de código estejam presentes no sistema. Abaixo, o procedimanto para distribuições baseadas em Ubuntu/Debian:

# Instalação do compilador e do servidor de linguagem para C/C++
sudo apt update
sudo apt install clangd

# Instalação do Node.js (necessário para o coc.nvim)
# Recomenda-se utilizar uma versão estável recente
sudo apt install npm
sudo npm install -g n
sudo n stable

# Instalação do gerenciador de pacotes Yarn
sudo npm install -g yarn

2. Instalação do Plugin

Dependendo do gerenciador de plugins que você utiliza no seu .vimrc ou init.vim, adicione a linha correspondente:

Utilizando Vim-Plug

" É recomendável utilizar a branch 'release' para estabilidade
Plug 'neoclide/coc.nvim', {'branch': 'release'}

Utilizando Vundle

Plugin 'neoclide/coc.nvim'

Após adicionar a linha, reinicie o editor e execute o comendo de instalação:

:PlugInstall
" ou, se usar Vundle:
:PluginInstall

3. Configurando o Suporte para C/C++

Com o coc.nvim instalado, você deve adicionar a extensão específica para o protocolo LSP do C/C++ (clangd):

:CocInstall coc-clangd

4. Resolução de Problemas

Versão do Editor Desatualizada

O coc.nvim exige versões recentes do Vim (8.1+) ou Neovim (0.4+). Se o seu repositório padrão estiver defasado, utilize os PPAs oficiais:

# Para Neovim
sudo add-apt-repository ppa:neovim-ppa/stable
sudo apt update
sudo apt install neovim

# Para Vim
sudo add-apt-repository ppa:jonathonf/vim
sudo apt update
sudo apt install vim

Erro de Build (index.js não encontrado)

Se encontrar erros relacionados à falta de dependências compiladas, navegue até o diretório do plugin e force a compilação manual:

cd ~/.vim/plugged/coc.nvim  # O caminho pode variar conforme seu gerenciador
yarn install
yarn build

5. Configuração Personalizada no .vimrc

Abaixo, uma configuração otimizada para melhorar o fluxo de trabalho, incluindo atalhos para navegação e formatação:

" Lista de extensões que serão instaladas automaticamente
let g:coc_global_extensions = [
    \ 'coc-clangd',
    \ 'coc-json',
    \ 'coc-snippets',
    \ 'coc-vimlsp'
    \ ]

" Melhora a experiência visual do menu de sugestões
set pumheight=12
set updatetime=300
set signcolumn=yes

" Mapeamento para confirmar a seleção do autocomplete com Enter (CR)
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
                              \: "\<c-g>u\<cr>\<c-r>=coc#on_enter()\<cr>"

" Atalhos para navegação de código
nmap <silent> gd <plug>(coc-definition)
nmap <silent> gy <plug>(coc-type-definition)
nmap <silent> gi <plug>(coc-implementation)
nmap <silent> gr <plug>(coc-references)

" Atalhos para diagnósticos (erros e avisos)
nmap <silent> [g <plug>(coc-diagnostic-prev)
nmap <silent> ]g <plug>(coc-diagnostic-next)

" Formatação de código
xmap <leader>f  <plug>(coc-format-selected)
nmap <leader>f  <plug>(coc-format-selected)

" Exibir documentação em um popup flutuante
nnoremap <silent> K :call VerDocumentacao()<cr>

function! VerDocumentacao()
  if (index(['vim','help'], &filetype) >= 0)
    execute 'h '.expand('<cword>')
  elseif (coc#rpc#ready())
    call CocActionAsync('doHover')
  else
    execute '!' . &keywordprg . " " . expand('<cword>')
  endif
endfunction

" Destacar símbolos sob o cursor
autocmd CursorHold * silent call CocActionAsync('highlight')
</cword></cword></cr></silent></plug></leader></plug></leader></plug></silent></plug></silent></plug></silent></plug></silent></plug></silent></plug></silent></cr></c-r></cr></c-g></cr></expr></silent>

Tags: vim Neovim coc-nvim cpp clangd

Publicado em 10-29 09:39