Autocompletação C/C++ no vim

Março 2017




Este tutorial se e endereça as pessoas que utilizam Vim no windows ou Linux. Aqui, eu tentarei orientar o tutorial para aqueles que possuem Linux.

Introdução


A autocopletação é algo bem familiar pata o Linux, pois ela é utilizada com freqüência, regularmente, e tipicamente em um console. No entanto, a única autocompletação que propõe Vim não considera a semântica da linguagem na qual se codifica.
Com efeito, quando se pressiona Ctrl N (Ctrl P) no momento em que se está digitando uma palavra, Vim procura no arquivo uma palavra que começa com as mesmas letras. Infelizmente, a senha proposta não tem necessariamente um sentido, pois a autocompletação não considera aquilo que simboliza a palavra. Assim, Vim será, por exemplo, levado a propor uma "palavra" que corresponde à um tipo lá onde um método é esperado.
class plop(){ 
  protected: 
   int plopons; 
  public: 
   plop(){} 
   void plopez(){} 
}; 

int main(){ 
  plop p; 
  p. // <-- Ctrl P proporá sucessivamente : plopez, plop... enquanto que é na verdade plopons  
  return 0; 
}

Para que o aspecto « semântico » seja considerado, vamos utilizar um plugin Vim baseado em ctags. Ctags permite de « referenciar » certos símbolos (tipos, funções, classes) para diferentes linguagens, das quais a C++.

Quando ctags examina uma arborescência de arquivos fonte, aquele cria um arquivo (chamado tags) que referencia cada símbolo que figura ali.

Instalação


Começa-se por instalar ctags. Por exemplo, na debian ou uma distribuição baseada na Debian (ubuntu, xandros...) :
sudo aptitude update 
sudo aptitude safe-upgrade 
sudo aptitude install exuberant-ctags

Recupera-se igualmente o plugin Vim de autocompletação


Coloca-se tudo o que concerne a autocompletação em ~/.vim :
mkdir -p ~/.vim/tags 
mv omnicpp*zip ~/.vim 
cd ~/.vim 
unzip omnicpp*zip 
cd -

Ctags é capaz de examinar sem problemas os headers das livrarias QT, OpenGL, SDL. No entanto, para a STL, é preciso recuperar headers "simplificados" ICI

Descompacta-se o arquivo e cria-se os tags da STL :
tar xjvf cpp_src.tar.bz2 
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ cpp_src && mv tags ~/.vim/tags/stl

Agora, gera-se os tags para as livrarias instaladas (a adaptar se asbibliotecas são instaladas em outro lugar). Por exemplo, para as livrarias OpenGL, SDL et QT, basta Digitar os três seguintes comandos :
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ /usr/include/GL/  && mv tags ~/.vim/tags/gl 

ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ /usr/include/SDL/ && mv tags ~/.vim/tags/sdl 

ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ /usr/include/qt4/ && mv tags ~/.vim/tags/qt4

Configuração


Agora, é preciso dizer a vim de trocar o plugin e os diferentes arquivos de tags. Para tanto, basta adicionar o fim do arquivo ~/.vimrc as linhas abaixo:
" prérequis tags 
set nocp 
filetype plugin on 

" configure tags - add additional tags here or comment out not-used ones 
set tags+=~/.vim/tags/stl 
set tags+=~/.vim/tags/gl 
set tags+=~/.vim/tags/sdl 
set tags+=~/.vim/tags/qt4 

" build tags of your own project with CTRL+F12 
"map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR> 
noremap <F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<cr> 
inoremap <F12> <Esc>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<cr> 

" OmniCppComplete 
let OmniCpp_NamespaceSearch = 1 
let OmniCpp_GlobalScopeSearch = 1 
let OmniCpp_ShowAccess = 1 
let OmniCpp_MayCompleteDot = 1 
let OmniCpp_MayCompleteArrow = 1 
let OmniCpp_MayCompleteScope = 1 
let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"] 

" automatically open and close the popup menu / preview window 
au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif 
set completeopt=menuone,menu,longest,preview

Se, somente alguns arquivos tags foram gerados, comentar os outros e adicionar o caractere « no início da linha. Por exemplo, se se gera ~/.vim/tags/gl et ~/.vim/tags/sdl :
set tags+=~/.vim/tags/stl 
"set tags+=~/.vim/tags/gl 
"set tags+=~/.vim/tags/sdl 
set tags+=~/.vim/tags/qt4

falta somnete salvar este arquivo e (re)lançar vim para que este considere as modificações feitas no ~/.vimrc.

Utilização


Tudo aquilo que foi tagado previamente (quer dizer neste tutorial os tags da STL, de QT, de SDL, e de OpenGL) já está acessível na autocompletação. Basta pressionar Ctrl P ou Ctrj N. Depois que a lista aparecer, pode-se utilizar as flechas para selecionar a boa proposição e Pressionar Entre.
Mas, não est terminado. É preciso regenerar os tags de símbolos (variáveis, funções, tipos...) específicos ou projeto que se desenvolve. Para tanto, é preciso ainda gerar um arquivo de tags. E é claro, é preciso refrescar este arquivo a cada vez que for adicionado, suprimido ou modificado o símbolo do projeto para que este seja atualizado.

Como acontece freqüentemente, é recomendado mapear uma tecla para desencadear um passe de ctags. No exemplo do arquivo ~/.vimrc que eu deu, isto está assegurado pela tecla F12.

Links


http://vim.wikia.com/wiki/C++_code_completion
http://www.vim.org/scripts/script.php?script_id=1520
http://www.vim.org/scripts/script.php?script_id=2358

Tradução feita por Ana Spadari

Veja também

Artigo original publicado por . Tradução feita por ninha25.
Este documento, intitulado 'Autocompletação C/C++ no vim', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.