Ctags exubérants - Problème de tags en double

8

Voici un fichier - ChipBooter.cpp- dans mon projet (Omettez quelques détails qui ne sont pas liés à cette question):

class ChipBooter {
public:   
    void Boot() {
        this->DpDetect();
    }
    void DpDetect() {}
}

Lorsque j'ai appuyé g<C-]>pour passer à la définition de DpDetect, Vim a affiché une liste avec des balises correspondantes en double:

# pri kind tag               file
1 F C f    DpDetect          OMU/src/boot/src/ChipBooter.cpp
             class:ChipBooter
             void ChipBooter::DpDetect()
2 F C f    DpDetect          OMU/src/boot/src/ChipBooter.cpp
             class:ChipBooter
             void ChipBooter::DpDetect()

C'est la même définition!

Ce problème se produit chaque fois que je frappe g<C-]>et double toujours la longueur de la liste.


Plus de détails

Version Exubérant Ctags: 5.8. La version Vim est7.3

Voici une représentation visuelle de ma hiérarchie de répertoires:

Source
  `---tags
  |       
  `---OMU
       `---src
            `---boot
                 `---src
                      `---ChipBooter.cpp

J'ai couru ctags -Rdans Sourcelequel contient le OMUrépertoire pour générer le tagsfichier.

Je lance vim en utilisant vim -u NONE -N; .vimrcet les plugins sont désactivés.

Il n'y a qu'une seule entrée DpDetectdans le tagsfichier:

DpDetect    OMU/src/boot/src/ChipBooter.cpp /^void ChipBooter::DpDetect()$/;"   f   class:ChipBooter

tagsest la valeur par défaut, car .vimrcest désactivé.

:set tags?
tags=./tags,./TAGS,tags,TAGS

Mise à jour

@romainl a déclaré que Vim semble utiliser les deux fichiers de balises : tagset TAGS.

:echo tagfiles()
['tags', 'TAGS']

Si je change d' tagsoption pour exclure le fichier TAGS ( :set tags=./tags,tags), le problème des balises en double n'existe pas.

Où est le TAGSdossier? Il n'y a qu'un tagsfichier dans mon répertoire de projet.

$ find {My project root directory} -iname tags
./tags
Feng Yu
la source
2
Quelle est la sortie de :echo tagfiles()?
romainl
1
Vim semble utiliser deux fichiers de balises, tagset TAGS. Avez-vous un TAGSfichier dans /home/yufeng/mount/svncode/omu/zycp/Source/? Serait-ce un problème de sensibilité à la casse?
romainl
1
@romainl Je pense que vous êtes sur quelque chose. Étant donné que chaque nouveau venu vim travaille actuellement sur Mac OS X, cela pourrait aider l'OP: apple.stackexchange.com/questions/71357/… Je suppose que Vim suppose que sous Unix tous les systèmes de fichiers sont sensibles à la casse.
Vitor
@Vitor, je ne connais pas grand-chose aux tripes de Vim mais je peux l'imaginer demander au système de tagsfichiers un fichier puis demander un TAGSfichier. Un FS sensible à la casse répondrait oui aux deux questions, forçant Vim à rechercher deux fois dans le même fichier en pensant qu'il y en a deux, tandis qu'un FS insensible à la casse répondrait oui uniquement à la première question.
romainl
Le lien de Vitor vous explique comment pour Mac OS X. Google vous le dira pour les autres systèmes d'exploitation.
romainl

Réponses:

5

Comme l'a dit @romainl, il s'agit bien d'un problème de sensibilité à la casse FS (système de fichiers).

Mon fichier de projet est monté de Windows 7 sur mon Fedora en utilisant:

mount {Windows 7 Dir} {Fedora Dir} /local_folder -t cifs -o username=xxxx,password=xxxx

Depuis la page de manuel mount.cifs :

la casse est la valeur par défaut si le serveur le prend en charge.

Cela signifie que le montage préservera la sensibilité à la casse du serveur FS. Si le FS du serveur est sensible à la casse, ces fichiers montés seront sensibles à la casse; Si le FS du serveur est insensible à la casse, ils le seront.

Windows 7 ne respecte pas la casse, ce qui rend ces fichiers de projet insensibles à la casse.

$ cd {My project root directory}
$ ls tags
tags
$ ls TAGS
TAGS

Si l'option «tags» comprend à la fois des tags et des TAGS :

:set tags=tags,TAGS

Vim recherchera le fichier de balises deux fois: une pour les balises , une autre pour les TAGS . Dans les deux cas, Vim constate qu'il y a une crise. Cela fait que Vim confond un même fichier de balises pour deux fichiers différents.

Par conséquent, Vim utilisera deux fichiers de balises:

:echo tagfiles()
['tags', 'TAGS']

Ainsi, un problème de balises en double s'est produit.

Si l'option «tags» inclut uniquement les tags :

:set tags=tags

Le problème n'existera pas.

Feng Yu
la source
BTW, pourquoi Vim n'arrêterait-il pas de rechercher un fichier de balises alors qu'il en a déjà trouvé un? Ainsi, le problème en double n'existera pas.
Feng Yu
En termes de fichiers, certaines personnes décomposent leurs projets en plusieurs parties. Par exemple, ma source principale peut être balisée dans un fichier et une bibliothèque partagée balisée dans un autre, mais je voudrais pouvoir trouver une définition de toute façon. En termes de continuer une fois qu'un symbole est trouvé dans les fichiers de balises, parfois un projet peut avoir des variantes, où il y a deux fonctions du même nom mais seulement l'une ou l'autre est construite / liée pour une variante donnée. Lorsque vous passez à une définition comme celle-ci, vous voudriez être en mesure de choisir la variante qui vous intéresse en ce moment dans la liste, plutôt que seulement la première v
John O'M.
(Suite) Vim trouve.
John O'M.