web-dev-qa-db-fra.com

cscope ou ctags pourquoi choisir l’un sur l’autre?

J'utilise principalement vim/gvim en tant qu'éditeur et je cherche à utiliser une combinaison de lxr (la référence croisée Linux) et de cscope ou ctags pour explorer le code source du noyau. Cependant, je n'ai jamais utilisé ni cscope ni ctags et je voudrais savoir pourquoi on pourrait en choisir un en tenant compte de mon utilisation de vim en tant qu'éditeur primaire.

124
Robert S. Barnes

ctags active deux fonctionnalités: vous permet de passer des appels de fonctions à leurs définitions, et l'achèvement complet. Le premier signifie que lorsque vous avez terminé l'appel d'une méthode, appuyez sur g] ou CTRL-] pour accéder à l'emplacement où cette méthode est définie ou implémentée. La deuxième fonctionnalité signifie que lorsque vous tapez foo. ou foo->, et si foo est une structure, un menu contextuel indiquant la complétion du champ s’affiche.

cscope a aussi la première fonctionnalité - en utilisant set cscopetag - mais pas la dernière. Cependant, cscope ajoute la possibilité de sauter à n’importe quel endroit où une fonction est appelée.

Donc, en ce qui concerne le saut dans une base de code, ctags ne vous mènera jamais que vers le lieu où la fonction est implémentée, alors que cscope peut vous montrer également où une fonction est appelée.

Pourquoi voudriez-vous choisir l'un sur l'autre? Eh bien, j'utilise les deux. ctags est plus facile à configurer, plus rapide à exécuter et si vous vous souciez seulement de sauter d'une manière, il vous montrera moins de lignes. Vous pouvez simplement exécuter :!ctags -R . et g] fonctionne simplement. Il permet également cette chose omni complète.

Cscope est idéal pour les bases de code plus grandes et inconnues. La configuration est pénible car cscope a besoin d’un fichier contenant une liste de noms de fichiers à analyser. Également dans vim, par défaut, aucune liaison de clé n'est configurée - vous devez exécuter :cscope blah blah manuellement.

Pour résoudre le premier problème, j'ai un script bash cscope_gen.sh qui ressemble à ceci:

#!/bin/sh
find . -name '*.py' \
-o -name '*.Java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp'  \
> cscope.files

# -b: just build
# -q: create inverted index
cscope -b -q

Cela recherche le code qui m'intéresse, crée la liste cscope.files et crée la base de données. De cette façon, je peux exécuter ":! Cscope_gen.sh" au lieu de devoir me souvenir de toutes les étapes de la configuration.

Je mappe la recherche cscope en ctrl-espace x 2 avec cet extrait, qui atténue les autres inconvénients de cscope:

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

Il y a ce plugin cscope_maps.vim qui configure un tas de liaisons similaires. Je ne me souviens jamais de ce que toutes les options signifient, alors ayez tendance à vous en tenir à ctrl-space.

Donc, pour conclure: ctags est plus facile à configurer et fonctionne généralement sans faire grand chose d’autre, c’est vital pour omni-complete aussi. cscope offre davantage de fonctionnalités si vous devez conserver une base de code volumineuse et en grande partie inconnue, mais nécessite davantage de travail à la jambe.

148
richq

J'étais dans la même situation il y a quelques mois ...

Le manque de précision de ctags est un problème dans .. et je trouve que cscope est bien meilleur pour tous les trucs liés aux macros (et il y en a beaucoup dans le noyau Linux) ..

pour ce qui est de l’utilisation, c’est très simple ... il suffit de taper cscope -R à la racine de votre noyau et vous n’avez plus à vous soucier de rien.

Ensuite, les raccourcis clavier sont tous basés sur Ctrl-\(vous pouvez le remapper si vous êtes allergique à Ctrl), vous utilisez principalement s et g ....,

Développé pour le noyau, je n’avais pas besoin de tant d’achèvement ...

Quoi qu'il en soit, optez pour cscope, c'est beaucoup plus pratique et précis.

14
LB40

Hmm ... Vous devriez probablement utiliser etags au lieu de ctags ...

Si vous utilisez cscope, vous pouvez voir les chaînes d’appel, c’est-à-dire qui appelle cette fonction et quelles fonctions cette fonction appelle-t-elle? 

Je ne sais pas si cela peut être fait en utilisant etags/ctags ...

Ce n’est qu’une caractéristique ... qu’en est-il de trouver le fichier contenant une définition de fonction particulière? Ce que vous obtenez uniquement dans cscope.

J'utilise les deux cscope et etags, ils conviennent à des choses différentes, en particulier lorsque vous travaillez avec une base de code volumineuse, telle que le noyau Linux. En fait, j'ai commencé à utiliser cscope et etags lorsque j'ai commencé à travailler avec le noyau Linux/Xen.

LXR n’est pas génial, car vous devez cliquer sur, aller sur le réseau, etc., alors que vous pouvez construire les bases de données cscope et tags sur le code de votre noyau et ne pas avoir à passer sur le réseau (contrairement à lxr).

4
rmk

Suggérez l'utilisation de gtags globaux. Pourrait utiliser vim plugin gen_tags pour intégrer les gtags avec vim.

0
Hongbo Liu