L'autocomplétion C/C++ sous vim

Dernière mise à jour le 4 novembre 2009 à 14:19 par marlalapocket
Publié par mamiemando

Auto-complétion sous ViM






Ce tutoriel s'adresse aux personnes qui utilisent Vim sous windows ou Linux. Ici, je vais plutôt orienter le tutoriel pour les personnes sous Linux.

Introduction


L'auto-complétion est quelque chose de bien connu sous linux puisqu'on l'utilise régulièrement, typiquement dans une console. Toutefois, la seule auto-complétion que propose Vim ne tient pas compte de la sémantique du langage dans lequel on code.

En effet quand on appuie sur Ctrl N (ou Ctrl P) lorsqu'on est en train de taper un mot, Vim cherche dans le fichier un mot qui commence par les mêmes lettres. Malheureusement, le mot proposé n'a pas forcément de sens, car une telle auto-complétion ne tient pas compte de ce que symbolise le mot. Ainsi Vim sera par exemple amené à proposer un "mot" qui correspond à un type là ou une méthode est attendue.
class plop(){
  protected:
   int plopons;
  public:
   plop(){}
   void plopez(){}
};

int main(){
  plop p;
  p. // <-- Ctrl P proposera successivement : plopez, plop... alors que c'est forcément plopons
  return 0;
}

Pour que l'aspect "sémantique" soit pris en compte, on va utilisé un plugin vim basé sur ctags. Ctags permet de "référencer" certains symboles (types, fonctions, classes) pour différents langages, dont le C++.

Lorsque ctags examine une arborescence de fichiers source, celui-ci crée un fichier (appelé tags) qui référence chacun des symboles qui y figurent.

Installation


On commence par installer ctags. Par exemple, sous debian ou une distribution basée sur debian (ubuntu, xandros...) :
sudo aptitude update
sudo aptitude safe-upgrade
sudo aptitude install exuberant-ctags

On récupère également le plugin Vim d'auto-complétion


On va mettre tout ce qui concerne l'auto-complétion dans ~/.vim :
mkdir -p ~/.vim/tags
mv omnicpp*zip ~/.vim
cd ~/.vim
unzip omnicpp*zip
cd -

Ctags est capable d'examiner sans problème les headers des librairies QT, OpenGL, SDL. Toutefois pour la STL, il faut récupérer des headers "simplifiés" ICI

On décompresse l'archive et on crée les tags de la 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

À présent, on génère les tags pour les librairies installées (à adapter si les librairies sont installées ailleurs). Par exemple pour les librairies OpenGL, SDL et QT, il suffit de taper les trois commandes suivantes :
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

Configuration


À présent, il faut dire à vim de charger le plugin et les différents fichiers de tags. Pour cela, il suffit de rajouter à la fin du fichier ~/.vimrc les lignes suivantes :
" 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

Si seuls certains fichiers tags ont été générés, commenter les autres en rajoutant le caractère " en début de ligne. Par exemple si on n'a pas généré ~/.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

Il ne reste plus qu'à sauver ce fichier et (re)lancer vim afin que celui-ci tienne compte des modifications apportées à ~/.vimrc.

Utilisation


Tout ce qui a été taggué au préalable (c'est-à-dire dans ce tutoriel les tags de la STL, de QT, de SDL, et d'OpenGL) est déjà accessible dans l'auto complétion. Il suffit d'appuyer sur ctrl p ou ctrl n. Une fois que la liste apparaît, on peut utiliser les flèches pour mettre en surbrillance la bonne proposition et appuyer sur entrée.

Toutefois, ce n'est pas complètement terminé. Il faut (re)générer les tags des symboles (variables, fonctions, types...) spécifiques au projet que l'on développe. Pour cela, il faudra encore une fois générer un fichier de tags. Et bien entendu, il faudra rafraîchir ce fichier à chaque fois que l'on ajoutera, supprimera, ou modifiera un symbole du projet afin que celui-ci soit à jour.

Comme c'est assez fréquent, il est recommandé de mapper une touche du clavier pour déclencher une passe de ctags. Dans l'exemple de fichier ~/.vimrc que j'ai donné, ceci est assuré par la touche F12.

Liens


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
Meilleures réponses pour « L'autocomplétion C/C++ sous vim » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Petit tuto sur VI/VIM VoirExtraits du tutoriel de VIM =============================================================================== B i e n v e n u e dans le T u t o r i e l de V I M - Version 1.5.fr.2...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...