Ctags exuberantes - problema de tags duplicadas

8

Aqui está um arquivo - ChipBooter.cpp- no meu projeto (Omita alguns detalhes que não estão relacionados a esta pergunta):

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

Quando pressionei g<C-]>para ir para a definição de DpDetect, o Vim exibiu uma lista com tags correspondentes duplicadas:

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

Esta é a mesma definição!

Esse problema ocorre toda vez que eu clico g<C-]>e sempre dobra o comprimento da lista.


Mais detalhes

Versão exuberante Ctags: 5.8. A versão do Vim é7.3

Aqui está uma representação visual da minha hierarquia de diretórios:

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

Eu corri ctags -Rem Sourceque contém o OMUdiretório para gerar o tagsarquivo.

Eu inicio o vim usando vim -u NONE -N; .vimrce plug-ins está desativado.

Há apenas uma entrada DpDetectno tagsarquivo:

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

tagsé o valor padrão, porque .vimrcestá desativado.

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

Atualizar

@romainl disse que o Vim parece estar usando os dois arquivos de tags : tagse TAGS.

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

Se eu mudar a tagsopção de excluir o arquivo TAGS ( :set tags=./tags,tags), o problema de tags duplicadas não existe.

Onde está o TAGSarquivo? Existe apenas um tagsarquivo no diretório do meu projeto.

$ find {My project root directory} -iname tags
./tags
Feng Yu
fonte
2
Qual é a saída de :echo tagfiles()?
Romainl
1
O Vim parece estar usando dois arquivos de tags tagse TAGS. Você tem um TAGSarquivo /home/yufeng/mount/svncode/omu/zycp/Source/? Poderia ser um problema de distinção entre maiúsculas e minúsculas?
Romainl
1
@romainl Eu acho que você está em algo. Como todos os novatos do vim atualmente estão trabalhando no Mac OS X, isso pode ajudar o OP: apple.stackexchange.com/questions/71357/… Eu acho que o Vim está assumindo que no Unix todos os sistemas de arquivos diferenciam maiúsculas de minúsculas.
Vitor
@ Victor, eu não sei muito sobre as entranhas do Vim, mas posso imaginá-lo pedindo um arquivo ao sistema de tagsarquivos e depois pedindo um TAGSarquivo. Um FS que diferencia maiúsculas de minúsculas responderia sim a ambas as perguntas, forçando o Vim a procurar duas vezes no mesmo arquivo, pensando que existem duas, enquanto um FS que não diferencia maiúsculas de minúsculas responderia sim apenas à primeira pergunta.
Romainl
O link de Vitor informa como o Mac OS X. O Google informa sobre outros sistemas operacionais.
Romainl

Respostas:

5

Como o @romainl disse, é realmente um problema de diferenciação de maiúsculas e minúsculas do FS (sistema de arquivos).

Meu arquivo de projeto é montado da Janela 7 para o meu Fedora usando:

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

Na página do manual mount.cifs :

diferencia maiúsculas de minúsculas é o padrão se o servidor suportar.

Isso significa que o Mount preservará a distinção entre maiúsculas e minúsculas do servidor FS. Se o FS do servidor faz distinção entre maiúsculas e minúsculas, esses arquivos montados diferenciam maiúsculas de minúsculas; Se o FS do servidor não diferencia maiúsculas de minúsculas, ele não diferencia maiúsculas de minúsculas.

O Windows 7 não diferencia maiúsculas de minúsculas, o que torna esses arquivos de projeto que não diferenciam maiúsculas de minúsculas.

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

Se a opção "tags" incluir tags e TAGS :

:set tags=tags,TAGS

O Vim pesquisará o arquivo de tags duas vezes: um para tags e outro para TAGS . Nos dois momentos, o Vim descobre que há um encaixe. Isso faz com que o Vim confunda um mesmo arquivo de tags com dois arquivos diferentes.

Conseqüentemente, o Vim usará dois arquivos de tags:

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

Assim, ocorreu um problema com tags duplicadas.

Se a opção "tags" incluir apenas tags :

:set tags=tags

O problema não existirá.

Feng Yu
fonte
BTW, por que o Vim não parava de procurar no arquivo de tags quando ele já encontrou um? Assim, o problema duplicado não existirá.
Feng Yu
Em termos de arquivos, algumas pessoas dividem seus projetos em várias partes. Por exemplo, minha fonte principal pode estar marcada em um arquivo e uma biblioteca compartilhada em outro, mas eu gostaria de encontrar uma definição de qualquer maneira. Em termos de continuar quando um símbolo é encontrado nos arquivos de tags, às vezes um projeto pode ter variantes, onde existem duas funções com o mesmo nome, mas apenas uma ou a outra é criada / vinculada para uma determinada variante. Ao pular para uma definição como essa, você poderá escolher qual variante se importa agora na lista, em vez de apenas a primeira v
John O'M.
(Continuação) Vim encontra.
John O'M.