[LINUX] Utilisez sérieusement l'indexeur C / C ++ le plus puissant "Rtags"

Un saut de balise qui vous permet d'accéder à une définition de fonction ou à une référence avec une seule touche. De nos jours, c'est une fonction indispensable pour la lecture de code, mais il est possible de le faire avec des "indexeurs" tels que Ctags et GNU GLOBAL (Gtags). Dans cet article, j'écrirai sur la façon de configurer Rtags, qui est un excellent indexeur pour C / C ++, et comment travailler avec Vim.

** Avantages des Rtags **

L'indexeur est un programme qui analyse le code source et crée une base de données de balises (index) qui enregistre les noms de symboles et les positions des fonctions et des variables. Ctags est l'un des indexeurs les plus utilisés aujourd'hui et prend en charge plus de 40 langages, notamment C, Ruby et Python. Cependant, en C ++, en raison de la complexité de la grammaire, l'analyseur interne ne peut pas le gérer suffisamment et le nom du symbole peut ne pas être reconnu correctement. Gtags a un problème similaire. C'est là que Rtags est entré récemment. Rtags est caractérisé par l'utilisation de l'interface d'analyse syntaxique de clang, qui est un compilateur C / C ++. Puisque le compilateur analyse le code source, des erreurs ne peuvent pas se produire et c'est très rationnel.

** Installer Rtags **

L'installation elle-même ne nécessite qu'une construction et n'est pas particulièrement difficile.

** Forfaits requis **

Dans mon Ubuntu-14.04, je suis entré avec la commande suivante. Si vous vérifiez la version de libclang avec llvm-config, vous constaterez que c'est 3.4.

$ sudo apt-get install clang libclang-dev cmake
$ llvm-config --version
3.4

Il n'y a pas de problème tel quel, mais il est recommandé que libclang soit 3.5 ou supérieur, c'est donc une bonne idée d'installer 3.6.

$ sudo apt-get install libclang-3.6-dev
$ /usr/lib/llvm-3.6/bin/llvm-config --version
3.6

Dans ce cas, lorsque vous exécutez cmake plus tard, vous devez donner à LIBCLANG_LLVM_CONFIG_EXECUTABLE le chemin de 3.6 llvm-config et l'exécuter comme indiqué ci-dessous. Si vous oubliez cela, la valeur par défaut 3.4 sera utilisée.

$ LIBCLANG_LLVM_CONFIG_EXECUTABLE=/usr/lib/llvm-3.6/bin/llvm-config cmake ..

** Construire **

Clonez le référentiel et mettez à jour les sous-modules dépendants.

$ git clone https://github.com/Andersbakken/rtags
$ cd rtags
$ git submodule init
$ git submodule update

Générez et construisez un Makefile avec cmake. Créez un répertoire de construction et construisez hors de la source à partir de là.

$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install

Qu'est-ce qu'une build out-of-source? Pour ceux qui disent, cet article est détaillé.

** Configuration des Rtags **

Lorsque l'installation est terminée, vous devriez pouvoir utiliser les commandes rc et rdm. Rtags est un système de balises de type client-serveur, et ce qui suit est un flux grossier d'indexation.

  1. Démarrez rdm
  2. ** Donnez une commande pour compiler le fichier source indexé avec rc **
  3. rdm reçoit la commande ci-dessus de rc et indexe

Le plus important est de donner la commande compile à rc. Il existe à peu près deux types de méthodes.

  1. Passez directement avec la commande rc -c
  1. Passez le fichier compile_commands.json avec la commande rc -J

** Méthode 1: Passez directement avec la commande rc -c **

Passez la commande de compilation du fichier source cible directement à rc comme indiqué ci-dessous.

$ rc -c g++ a.cpp b.cpp

C'est bien pour quelques fichiers source, mais dans la plupart des cas, il est difficile de taper une commande comme celle-ci à chaque fois. Par conséquent, il existe une méthode pour utiliser le script wrapper fourni par l'auteur. Il est recommandé de faire ce qui suit.

##Créez un répertoire bin dans votre répertoire personnel
$ mkdir ~/bin

##Mettre au début du chemin de recherche
$ echo 'export PATH=${HOME}/bin:${PATH}' >> .bashrc

##Copier le script du wrapper
$ cp rtags/bin/gcc-rtags-wrapper.sh ~/bin/gcc
$ cp rtags/bin/gcc-rtags-wrapper.sh ~/bin/g++

De cette façon, chaque fois que vous tapez une commande gcc ou g ++, ce script wrapper sera en fait appelé et exécutera rc -c en interne. C'est très pratique car l'indexation est effectuée à chaque fois que vous compilez. Bien entendu, cela n'affecte pas le fonctionnement de gcc et g ++.

** Méthode 2: chargez compile_commands.json avec la commande rc -J **

compile_commands.json est une base de données de compilation JSON, qui est un fichier JSON qui enregistre les informations requises pour la compilation. Vous pouvez indexer en chargeant ce fichier dans rc

Les systèmes de construction récents tels que cmake et ninja peuvent générer la base de données de compilation JSON au moment de la construction, vous pouvez donc procéder comme suit.

##Lors de l'utilisation de cmake
$ cmake . -DCMAKE_EXPORT_COMPILE_COMMANDS=1
$ rc -J .

##Lors de l'utilisation de ninja
$ ninja -t commands | rc -c -

Si vous avez un petit projet qui n'utilise que GNU Make, vous pouvez générer la base de données de compilation à l'aide d'un outil appelé Bear. Cette méthode est la plus recommandée personnellement. Construisez et installez comme suit.

$ git clone https://github.com/rizsotto/Bear
$ cd Bear
$ mkdir build && cd build
$ cmake ..
$ make && sudo make install

C'est facile à utiliser, tapez simplement bear avant la commande make habituelle. Cela affichera la base de données de compilation basée sur la commande de compilation appelée par Makefile.

$ bear make
$ rc -J .

** Utilisez les Rtags de Vim **

Il existe un plug-in appelé vim-rtags. Il est encore en cours de développement, mais il a encore suffisamment de fonctionnalités.

** Installation / Paramètres **

NeoBundle 'lyuts/vim-rtags'

Le keymap par défaut a beaucoup de traits et est un peu difficile à atteindre. Il y a un mappage dans plugin / rtags.vim, c'est donc une bonne idée de s'y référer et de l'assigner à une autre clé. J'ai les paramètres suivants.

"Aller à la définition
nnoremap <silent> <F3> :call rtags#JumpTo()<CR>
"Aller à la référence
nnoremap <silent> <F4> :<C-u>Unite<Space>rtags/references<CR>
"Aller au début si vous êtes dans la définition de classe / fonction
nnoremap <silent> <F5> :call rtags#JumpToParent()<CR>

** Comment utiliser **

Supposons que vous ayez déjà imprimé compile_commands.json et exécutez rc -J . une fois. Si rdm n'est pas en cours d'exécution, démarrez-le.

$ rdm --daemon

Quand je le déplace, ça ressemble à ça.

Vous pouvez accéder à la définition ainsi qu'à la référence. La liste des références s'ouvre dans une fenêtre Unite, il est donc facile de la réduire. Rdm surveille également les modifications de fichiers et lorsque vous enregistrez le fichier source, l'index est automatiquement mis à jour en même temps.

** Utilisez les Rtags d'Emacs **

Rtags est livré avec un plug-in pour Emacs créé par l'auteur. Veuillez consulter ici et ici pour des explications détaillées.

** À la fin **

Jusqu'à présent, nous avons expliqué comment utiliser l'indexeur pour C / C ++ "Rtags". L'éditeur de texte permet une navigation dans le code égale ou supérieure à l'EDI, ce qui est une grande amélioration. La configuration est un peu fastidieuse, mais si vous utilisez C ++ comme langage principal, cela en vaut vraiment la peine.

Recommended Posts

Utilisez sérieusement l'indexeur C / C ++ le plus puissant "Rtags"
Comment utiliser la bibliothèque C en Python
[C] Utilisez qsort ()