Üppige Ctags - Problem mit doppelten Tags

8

Hier ist eine Datei - ChipBooter.cpp- in meinem Projekt (einige Details weglassen, die nicht mit dieser Frage zusammenhängen):

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

Als ich drückte g<C-]>, um zur Definition von zu springen DpDetect, zeigte Vim eine Liste mit doppelten übereinstimmenden Tags an:

# 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()

Dies ist die gleiche Definition!

Dieses Problem tritt jedes Mal auf, wenn ich treffe, g<C-]>und verdoppelt immer die Länge der Liste.


Mehr Details

Üppige Ctags-Version : 5.8. Vim-Version ist7.3

Hier ist eine visuelle Darstellung meiner Verzeichnishierarchie:

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

Ich lief ctags -Rin Sourcedem das OMUVerzeichnis zum Generieren der tagsDatei enthält.

Ich starte vim mit vim -u NONE -N; .vimrcund Plugins ist deaktiviert.

Es gibt nur einen Eintrag DpDetectin der tagsDatei:

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

tagsist der Standardwert, da .vimrcdeaktiviert ist.

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

Aktualisieren

@romainl sagte, Vim scheint beide zwei Tags- Dateien zu verwenden: tagsund TAGS.

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

Wenn ich die tagsOption zum Ausschließen der TAGS- Datei ( :set tags=./tags,tags) ändere , besteht kein Problem mit doppelten Tags.

Wo ist die TAGSDatei? tagsIn meinem Projektverzeichnis befindet sich nur eine Datei.

$ find {My project root directory} -iname tags
./tags
Feng Yu
quelle
1
Was ist die Ausgabe von :echo tagfiles()?
Romainl
1
Vim scheint zwei Tags-Dateien zu verwenden, tagsund TAGS. Haben Sie eine TAGSDatei in /home/yufeng/mount/svncode/omu/zycp/Source/? Könnte es sich um ein Problem mit der Groß- und Kleinschreibung handeln?
Romainl
1
@romainl Ich denke du bist auf etwas. Angesichts der Tatsache, dass heutzutage jeder Vim-Neuling unter Mac OS X arbeitet, könnte dies dem OP helfen: apple.stackexchange.com/questions/71357/… Ich würde vermuten, dass Vim davon ausgeht, dass in Unix bei allen Dateisystemen zwischen Groß- und Kleinschreibung unterschieden wird.
Vitor
@Vitor, ich weiß nicht viel über Vims Eingeweide, aber ich kann mir vorstellen, dass es das Dateisystem nach einer tagsDatei fragt und dann nach einer TAGSDatei. Ein FS mit Groß- und Kleinschreibung würde beide Fragen mit Ja beantworten und Vim dazu zwingen, zweimal in derselben Datei zu suchen, wobei angenommen wird, dass es zwei gibt, während ein FS ohne Berücksichtigung der Groß- und Kleinschreibung nur die erste Frage mit Ja beantworten würde.
Romainl
Über den Link von Vitor erfahren Sie, wie Sie Mac OS X verwenden. Google informiert Sie über andere Betriebssysteme.
Romainl

Antworten:

5

Wie @romainl sagte, handelt es sich in der Tat um ein FS-Problem (Dateisystem), bei dem die Groß- und Kleinschreibung beachtet wird.

Meine Projektdatei wird von Windows 7 auf meinem Fedora bereitgestellt, indem ich:

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

Auf der Manpage mount.cifs :

Groß- und Kleinschreibung wird standardmäßig verwendet, wenn der Server dies unterstützt.

Dies bedeutet, dass der Mount die Groß- und Kleinschreibung des Server-FS beibehält. Wenn beim FS des Servers zwischen Groß- und Kleinschreibung unterschieden wird, wird bei diesen bereitgestellten Dateien zwischen Groß- und Kleinschreibung unterschieden. Wenn der FS des Servers die Groß- und Kleinschreibung nicht berücksichtigt, wird die Groß- und Kleinschreibung nicht berücksichtigt.

Windows 7 unterscheidet nicht zwischen Groß- und Kleinschreibung, wodurch bei diesen Projektdateien die Groß- und Kleinschreibung nicht berücksichtigt wird.

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

Wenn die Option "Tags" sowohl Tags als auch TAGS enthält :

:set tags=tags,TAGS

Vim durchsucht die Tags-Datei zweimal: eine nach Tags , eine andere nach TAGS . In beiden Fällen stellt Vim fest, dass es eine Passform gibt. Dadurch verwechselt Vim dieselbe Tag- Datei mit zwei verschiedenen Dateien.

Folglich verwendet Vim zwei Tag-Dateien:

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

Somit ist ein Problem mit doppelten Tags aufgetreten.

Wenn die Option "Tags" nur Tags enthält :

:set tags=tags

Das Problem wird nicht existieren.

Feng Yu
quelle
Übrigens, warum sollte Vim nicht aufhören, nach Tags zu suchen, wenn es bereits eine gefunden hat? Somit besteht kein doppeltes Problem.
Feng Yu
In Bezug auf Dateien teilen einige Leute ihre Projekte in mehrere Teile. Zum Beispiel könnte meine Hauptquelle in einer Datei und eine gemeinsam genutzte Bibliothek in einer anderen Datei markiert sein, aber ich möchte in beiden Fällen eine Definition finden können. Wenn ein Symbol in den Tag-Dateien gefunden wird, kann es vorkommen, dass ein Projekt Varianten hat, bei denen zwei Funktionen mit demselben Namen vorhanden sind, aber nur die eine oder andere für eine bestimmte Variante erstellt / verknüpft wird. Wenn Sie zu einer solchen Definition springen, möchten Sie in der Lage sein, aus der Liste auszuwählen, welche Variante Sie gerade interessieren, und nicht nur die erste v
John O'M.
(Fortsetzung) Vim findet.
John O'M.