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 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 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.
make tags
dans 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.