Tag esuberanti - Problema con i tag duplicati


8

Ecco un file - ChipBooter.cpp- nel mio progetto (ometti alcuni dettagli che non sono correlati a questa domanda):

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

Quando premo g<C-]>per passare alla definizione di DpDetect, Vim visualizza un elenco con tag di corrispondenza duplicati:

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

Questa è la stessa definizione!

Questo problema si verifica ogni volta che premo g<C-]>e raddoppia sempre la lunghezza dell'elenco.


Più dettagli

Versione Esuberante Ctags: 5.8. La versione di Vim è7.3

Ecco una rappresentazione visiva della mia gerarchia di directory:

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

Mi sono imbattuto ctags -Rin Sourceche contiene la OMUdirectory per generare il tagsfile.

Lancio vim usando vim -u NONE -N; .vimrce i plugin sono disabilitati.

C'è solo una voce DpDetectnel tagsfile:

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

tagsè il valore predefinito, perché .vimrcè disabilitato.

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

Aggiornare

@romainl ha detto che Vim sembra utilizzare entrambi i due file tag : tagse TAGS.

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

Se cambio tagsopzione per escludere il file TAGS ( :set tags=./tags,tags), il problema con i tag duplicati non esiste.

Dov'è il TAGSfile? C'è solo un tagsfile nella directory del mio progetto.

$ find {My project root directory} -iname tags
./tags

2
Qual è l'output di :echo tagfiles()?
Romainl,

1
Vim sembra utilizzare due file di tag tagse TAGS. Hai un TAGSfile in /home/yufeng/mount/svncode/omu/zycp/Source/? Potrebbe essere un problema di distinzione tra maiuscole e minuscole?
Romainl,

1
@romainl Penso che tu abbia fatto qualcosa. Dato che al giorno d'oggi ogni nuovo arrivato vim sta lavorando su Mac OS X, questo potrebbe aiutare l'OP: apple.stackexchange.com/questions/71357/… Immagino che Vim presuma che in Unix tutti i filesystem facciano distinzione tra maiuscole e minuscole.
Vitor

@Vitor, non so molto del fegato di Vim ma posso immaginarlo chiedendo un file al file system tagse poi chiedendo un TAGSfile. Un FS con distinzione tra maiuscole e minuscole risponderebbe di sì a entrambe le domande, costringendo Vim a cercare due volte nello stesso file pensando che ce ne siano due, mentre un FS senza distinzione tra maiuscole e minuscole risponderebbe di sì solo alla prima domanda.
Romainl

Il link di Vitor ti dice come per Mac OS X. Google te lo dirà per altri sistemi operativi.
Romainl

Risposte:


5

Come ha detto @romainl, si tratta in effetti di una distinzione tra maiuscole e minuscole (file system).

Il mio file di progetto è montato da Windows 7 su Fedora usando:

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

Dalla pagina man mount.cifs :

la distinzione tra maiuscole e minuscole è l'impostazione predefinita se il server la supporta.

Significa che il Mount manterrà la distinzione tra maiuscole e minuscole del server FS. Se la FS del server è sensibile al maiuscolo / minuscolo, questi file montati saranno sensibili al maiuscolo / minuscolo; Se le FS del server non fanno distinzione tra maiuscole e minuscole, saranno maiuscole e minuscole.

Windows 7 non fa distinzione tra maiuscole e minuscole, il che rende questi file di progetto senza distinzione tra maiuscole e minuscole.

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

Se l'opzione "tag" include sia tag che TAG :

:set tags=tags,TAGS

Vim cercherà due volte nel file dei tag: uno per i tag e un altro per i TAG . In entrambe le occasioni, Vim scopre che c'è una corrispondenza. Questo fa sì che Vim confonda uno stesso file di tag per due file diversi.

Di conseguenza, Vim utilizzerà due file di tag:

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

Pertanto, si è verificato un problema con i tag duplicati.

Se l'opzione "tag" include solo tag :

:set tags=tags

Il problema non esisterà.


A proposito, perché Vim non dovrebbe interrompere la ricerca del file tag quando ne ha già trovato uno? Pertanto, non esiste un problema duplicato.
Feng Yu,

In termini di file, alcune persone suddividono i loro progetti in più parti. Ad esempio, la mia fonte principale potrebbe essere taggata in un file e una libreria condivisa taggata in un altro, ma vorrei poter trovare una definizione in entrambi i modi. In termini di continuazione una volta trovato un simbolo nei file dei tag, a volte un progetto potrebbe avere varianti, dove ci sono due funzioni con lo stesso nome ma solo una o l'altra viene creata / collegata per una data variante. Quando passi a una definizione del genere, dovresti essere in grado di scegliere quale variante ti interessa in questo momento dall'elenco, piuttosto che solo la prima v
John O'M.

(Continua) Vim trova.
John O'M.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.