J'ai d'abord utiliser vim / gvim comme un éditeur et je suis à la recherche à l'aide d'une combinaison de lxr (Linux Croix de Référence) et soit cscope ou ctags pour explorer la source du noyau. Cependant, je n'ai jamais utilisé soit cscope ou ctags et voudrais savoir pourquoi l'on pourrait choisir l'un sur l'autre en tenant compte de mon utilisation de vim comme éditeur principal.
Réponses
Trop de publicités?ctags permet à deux caractéristiques: vous permet de sauter d'appels de fonction à leurs définitions, et omni achèvement. La première 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 mis en œuvre. La deuxième caractéristique signifie que lorsque vous tapez foo.
ou foo->
, et si toto est une structure, un menu pop-up avec le champ d'achèvement sera affiché.
cscope a aussi le premier long - à l'aide d' set cscopetag
- mais pas la dernière. Cependant cscope en outre, ajoute la capacité de sauter à l'un des endroits où une fonction est appelée ainsi.
Donc autant que de sauter autour d'une base de code est concerné, ctags ne jamais vous conduire vers l'endroit où la fonction est mise en œuvre, alors que cscope peut vous montrer où une fonction est appelée.
Pourquoi choisir l'un plutôt que l'autre? Eh bien, j'utilise les deux. ctags est plus facile, plus rapide à exécuter et si vous ne se soucient que de sauter une façon de vous montrer moins de lignes. Il vous suffit d'exécuter :!ctags -R .
et g]
fonctionne, tout simplement. Il permet également que l'omni chose complète.
Cscope est idéal pour les plus gros, inconnu des bases de code. La mise en place est une douleur parce que cscope besoin d'un fichier contenant une liste de noms de fichiers à analyser. Également dans vim, par défaut il n'y a pas de combinaisons de touche pour mettre en service, 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
Cette recherche de code qui m'intéresse, crée la cscope.la liste des fichiers et crée la base de données. De cette façon, je peux exécuter ":!cscope_gen.sh" au lieu d'avoir à se souvenir de toutes les étapes de configuration.
J'ai la carte cscope de recherche par ctrl-x de l'espace 2 avec cet extrait de code, ce qui atténue l'autre point négatif de cscope:
nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>
Il y a cette cscope_maps.vim plugin qui met en place un groupe de semblables liaisons. Je ne me souviens jamais de ce que toutes les options de dire, en ce qui a tendance à coller par ctrl-espace.
Donc pour conclure: ctags est plus facile à configurer et surtout fonctionne sans faire grand chose d'autre, il est vital pour omni-complet. cscope fournit plus de fonctionnalités, si vous avez de maintenir une grande et pour la plupart inconnus de la base de code, mais nécessite plus de travail de jambe.
J'ai été dans la même situation il y a quelques mois...
Le manque de précision de ctags est une douleur dans une.., et je trouve cscope beaucoup mieux pour toutes les macros liées trucs (et il y a un tas de macros dans le noyau linux)..
concernant l'utilisation, c'est en fait simple...il suffit de taper cscope -R à la racine de votre noyau et puis vous avez rien à craindre.. (je veux dire, si vous voulez juste pour explorer qui est parfait...)
Ensuite, les raccourcis clavier sont tous basés sur Ctrl-\ (vous pouvez le reconfigurer si vous êtes allergique à l'Ctrl), vous utilisez principalement de s et de g....,
Le développement du noyau, je n'ai pas besoin de tant de l'achèvement des travaux....
De toute façon, aller pour cscope, c'est beaucoup plus pratique, précis.
Hmm... Vous devriez probablement utiliser les etags au lieu de ctags...
Si vous utilisez cscope, vous pouvez consulter l'appel des chaînes, c'est à dire, qui appelle cette fonction et les fonctions qui n'cet appel de fonction?
Je ne sais pas si cela peut être fait en utilisant les etags / ctags...
C'est juste une fonctionnalité... que dire de trouver le fichier qui contient une fonction particulière à la définition? Cela, vous obtenez seulement dans cscope.
J'utilise les deux cscope et les etags, ils sont à la fois bon pour des choses différentes, surtout lorsque l'on travaille avec une grande base de code, comme le Noyau Linux. En fait, j'ai commencé à utiliser cscope et les etags quand j'ai commencé à travailler avec le Noyau Linux / Xen.
LXR n'est pas grande, parce que vous cliquez, allez sur le réseau, etc., alors que vous pouvez construire la cscope et les balises de bases de données sur votre code du noyau et ne pas avoir à aller sur le réseau (à la différence de lxr).