2016-02-01 1 views
2

J'utilise ctags pour indexer mon code source. Pour simplifier, j'assemble quelques exemples de codes comme ci-dessous.ctags n'indexe pas la fonction de membre de classe

namespace test_space 
{ 
template<typename TYPE> 
class A 
{ 
public: 
    void test_func(TYPE a); 
    void test_func_2(TYPE a); 
    void test_func_3(TYPE a); 
} 
class B 
{ 
public: 
    void test_func_b(); 
} 

void easy_func() 
{ 
} 

} 

Je l'ai appelé comme fichier a.h et utilisé ctags a.h pour générer le fichier tags, mais uniquement Ctags espace de noms indexés, des classes et des fonctions, mais pas mes fonctions de membre de classe (comme test_func), pourquoi? Comment activer cela? Ce est le contenu du fichier tags généré:

!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ 
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ 
!_TAG_PROGRAM_AUTHOR Darren Hiebert /[email protected]/ 
!_TAG_PROGRAM_NAME Exuberant Ctags // 
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ 
!_TAG_PROGRAM_VERSION 5.6 // 
A a.h /^class A$/;" c namespace:test_space 
B a.h /^class B$/;" c namespace:test_space 
easy_func a.h /^void easy_func()$/;" f namespace:test_space 
test_space a.h /^namespace test_space$/;" n 

Répondre

2

Il semble que exubérantes-ctags par défaut ajoute que les balises quand il voit une définition , pas une déclaration. Changer votre classe A à

template<typename TYPE> 
class A 
{ 
public: 
    void test_func(TYPE a) 
    { 
    } 
    void test_func_2(TYPE a); 
    void test_func_3(TYPE a); 
}; 

fait test_func apparaître dans le fichier tags:

!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ 
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ 
!_TAG_PROGRAM_AUTHOR Darren Hiebert /[email protected]/ 
!_TAG_PROGRAM_NAME Exuberant Ctags // 
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ 
!_TAG_PROGRAM_VERSION 5.9~svn20110310 // 
A a.h /^class A$/;" c namespace:test_space 
B a.h /^class B$/;" c namespace:test_space 
easy_func a.h /^void easy_func()$/;" f namespace:test_space 
test_func a.h /^ void test_func(TYPE a)$/;" f class:test_space::A 
test_space a.h /^namespace test_space$/;" n 

mais les autres fonctions ne se présentent pas. Je n'utilise pas ctags moi-même, mais il est logique que vous vouliez habituellement pouvoir trouver des définitions, pas des déclarations.

Si vous dites ctags à prototypes d'index, vous pouvez obtenir ce que vous cherchez:

ctags --c-kinds=+p a.h 

Pour exemple, cela se traduit par

!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ 
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ 
!_TAG_PROGRAM_AUTHOR Darren Hiebert /[email protected]/ 
!_TAG_PROGRAM_NAME Exuberant Ctags // 
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ 
!_TAG_PROGRAM_VERSION 5.9~svn20110310 // 
A a.h /^class A$/;" c namespace:test_space 
B a.h /^class B$/;" c namespace:test_space 
easy_func a.h /^void easy_func()$/;" f namespace:test_space 
test_func a.h /^ void test_func(TYPE a);$/;" p class:test_space::A 
test_func_2 a.h /^ void test_func_2(TYPE a);$/;" p class:test_space::A 
test_func_3 a.h /^ void test_func_3(TYPE a);$/;" p class:test_space::A 
test_func_b a.h /^ void test_func_b();$/;" p class:test_space::B 
test_space a.h /^namespace test_space$/;" n 

Vous pouvez obtenir plus de détails sur les choses sont marqués comme ceci:

$ ctags --list-kinds=c 
c classes 
d macro definitions 
e enumerators (values inside an enumeration) 
f function definitions 
g enumeration names 
l local variables [off] 
m class, struct, and union members 
n namespaces 
p function prototypes [off] 
s structure names 
t typedefs 
u union names 
v variable definitions 
x external and forward variable declarations [off] 

Vous pouvez voir que les prototypes de fonction sont, par défaut, non marqués.