cscope ou ctags pourquoi choisir l'un par rapport à l'autre? [fermé]

131

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

Robert S. Barnes
la source

Réponses:

157

ctags active deux fonctionnalités: vous permettant de passer des appels de fonction à leurs définitions et l'achèvement omni. Le premier signifie que lorsque vous êtes sur un appel à une méthode, frapper g]ou CTRL-]va sauter à l'endroit où cette méthode est définie ou implémentée. La deuxième caractéristique signifie que lorsque vous tapez foo.ou foo->, et si foo est une structure, un menu contextuel avec complétion de champ sera affiché.

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

Donc, pour ce qui est de sauter dans une base de code, les ctags ne vous mèneront jamais que vers l'endroit où la fonction est implémentée, tandis que cscope peut vous montrer où une fonction est également appelée.

Pourquoi choisiriez-vous l'un plutôt que l'autre? Eh bien, j'utilise les deux. ctags est plus facile à configurer, plus rapide à exécuter et si vous ne vous souciez que de sauter dans un sens, il vous montrera moins de lignes. Vous pouvez simplement courir :!ctags -R .et fonctionne g]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. De plus, dans vim, par défaut, aucune liaison de touches n'est configurée - vous devez exécuter :cscope blah blahmanuellement.

Pour résoudre le premier problème, j'ai un script bash cscope_gen.shqui 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 d'avoir à me souvenir de toutes les étapes de configuration.

Je mappe la recherche cscope sur ctrl-space x 2 avec cet extrait de code, ce qui atténue l'autre downer de cscope:

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

Il y a ce plugin cscope_maps.vim qui met en place un tas de liaisons similaires. Je ne me souviens jamais de ce que signifient toutes les options, alors j'ai tendance à m'en tenir à ctrl-space.

Donc pour conclure: les ctags sont plus faciles à mettre en place et fonctionnent la plupart du temps sans faire grand chose d'autre, c'est aussi vital pour l'omni-complet. cscope fournit plus de fonctionnalités si vous devez maintenir une base de code volumineuse et pour la plupart inconnue, mais nécessite plus de travail.

richq
la source
2
Existe-t-il un moyen de rendre les ctags plus précis? Je l'ai fait make tagsdans le répertoire racine du noyau et j'ai joué à sauter et la plupart du temps, je me suis retrouvé au mauvais endroit. J'ai lu que ctags a des problèmes avec le préprocesseur c, mais étant donné que ctags est utilisé dans lxr, il doit évidemment y avoir quelque chose qui peut être fait.
Robert
2
S'il y a un vaudou macro profond, alors les ctags échoueront probablement :-( Je l'utilise principalement pour des trucs C ++, qui dépendent moins de ce côté des choses (bien que cela ait ses propres problèmes ...)
richq
12
set cscopetag( cst) pour que les commandes :taget CTRL-]recherchent d'abord dans cscope, puis dans les balises
Hasturkun
1
De plus, ctags est assez lent pour la recherche récursive, l'utilisation de "ctags -L cscope.files" accélérera considérablement la génération de vos balises.
Aaron H.
1
@ RobertS.Barnes utilise une sorte de solution g C-], vim vous montrera la liste des balises correspondant au nom. Vous devrez toujours trouver la définition appropriée que vous recherchez manuellement.
Hubert Kario
15

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

Le manque de précision des ctags est pénible dans un .., et je trouve que cscope est bien meilleur pour tous les trucs liés aux macros (et il y a un tas de macros dans le noyau Linux) ..

concernant l'utilisation, c'est en fait simple ... il vous suffit de taper cscope -R à la racine de votre noyau et ensuite vous n'avez rien à craindre ... (je veux dire si vous voulez juste explorer c'est parfait ...)

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 ....,

En développant pour le noyau, je n'avais pas tellement besoin de l'achèvement ...

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

LB40
la source
4
<< il vous suffit de taper cscope -R à la racine de votre noyau .... Mieux vaut taper "make cscope" sous le noyau, sinon vous vous retrouverez avec toutes les architectures présentes dans le noyau Linux et donc plusieurs définitions au même symbole C.
kumar
4

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

Si vous utilisez cscope, vous pouvez voir les chaînes d'appels, 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 ...

C'est juste une fonctionnalité ... qu'en est-il de trouver le fichier qui contient une définition de fonction particulière? Ce que vous obtenez uniquement dans cscope.

J'utilise à la fois cscope et etags, ils sont tous les deux bons pour différentes choses, en particulier lorsque vous travaillez avec une grande base de code, comme le noyau Linux. En fait, j'ai commencé à utiliser cscope et etags lorsque j'ai commencé à travailler avec Linux Kernel / Xen.

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

rmk
la source
Etags n'est-il pas juste pour emacs? J'utilise exclusivement g / vim.
Robert S.Barnes
Oui, tu as raison. Depuis la page de manuel: Le programme etags est utilisé pour créer un fichier de table de balises, dans un format compris par emacs (1); le programme ctags est utilisé pour créer une table similaire dans un format compris par vi (1).
rmk
1
il y a deux saveurs d'etags et de ctags je crois. L'un est celui des emacs, l'autre est celui des ctags exubérants. Le premier a d'abord été écrit pour emacs, mais peut également être utilisé pour vi; le second a d'abord été écrit pour vi, mais peut également être utilisé pour emacs. Je trouve le second (ctags exubérants) plus facile à utiliser, même si je suis un utilisateur emacs. Si vous installez le paquet exuberant-ctags, les liens vers les binaires etags / ctags changeront et pointeront vers différents binaires.
ustun le
1

Suggérer d'utiliser des gtags globaux. Pourrait utiliser le plugin vim gen_tags pour intégrer des gtags avec vim.

Hongbo Liu
la source