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
https://vim.fandom.com/wiki/C%2B%2B_code_completion
https://www.vim.org/scripts/script.php?script_id=1520
https://www.vim.org/scripts/script.php?script_id=2358
Tradução feita por Ana Spadari