Etiquetas exuberantes: problema de etiquetas duplicadas

8

Aquí hay un archivo - ChipBooter.cppen mi proyecto (omita algunos detalles que no están relacionados con esta pregunta):

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

Cuando presioné g<C-]>para saltar a la definición de DpDetect, Vim mostró una lista con etiquetas coincidentes 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 es la misma definición!

Este problema ocurre cada vez que presiono g<C-]>y siempre duplica la longitud de la lista.


Más detalles

Versión exuberante Ctags: 5.8. La versión de Vim es7.3

Aquí hay una representación visual de mi jerarquía de directorios:

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

Corrí ctags -Ren el Sourceque contiene el OMUdirectorio para generar el tagsarchivo.

Lanzo vim usando vim -u NONE -N; .vimrcy los complementos están deshabilitados.

Solo hay una entrada DpDetecten el tagsarchivo:

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

tagses el valor predeterminado, porque .vimrcestá deshabilitado.

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

Actualizar

@romainl dijo que Vim parece estar usando ambos archivos de etiquetas : tagsy TAGS.

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

Si cambio la tagsopción para excluir el archivo TAGS ( :set tags=./tags,tags), el problema de etiquetas duplicadas no existe.

¿Dónde está el TAGSarchivo? Solo hay un tagsarchivo en el directorio de mi proyecto.

$ find {My project root directory} -iname tags
./tags
Feng Yu
fuente
2
¿Cuál es la salida de :echo tagfiles()?
romainl
1
Vim parece estar usando dos archivos de etiquetas tagsy TAGS. ¿Tienes un TAGSarchivo /home/yufeng/mount/svncode/omu/zycp/Source/? ¿Podría ser un problema de mayúsculas y minúsculas?
romainl
1
@romainl Creo que estás haciendo algo. Dado que todos los recién llegados a vim hoy en día están trabajando en Mac OS X, esto podría ayudar al OP: apple.stackexchange.com/questions/71357/ ... Supongo que Vim está asumiendo que en Unix todos los sistemas de archivos distinguen entre mayúsculas y minúsculas.
Vitor
@Vitor, no sé mucho sobre las agallas de Vim, pero puedo imaginarlo pidiendo un archivo al sistema de tagsarchivos y luego pidiéndolo TAGS. Un FS sensible a mayúsculas y minúsculas respondería sí a ambas preguntas, obligando a Vim a buscar dos veces en el mismo archivo pensando que hay dos, mientras que un FS insensible a mayúsculas y minúsculas respondería sí solo a la primera pregunta.
romainl
El enlace de Vitor le dice cómo para Mac OS X. Google le informará sobre otros sistemas operativos.
romainl

Respuestas:

5

Como dijo @romainl, de hecho es un problema de mayúsculas y minúsculas FS (sistema de archivos).

Mi archivo de proyecto se monta desde Windows 7 a mi Fedora usando:

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

Desde la página de manual de mount.cifs :

La distinción entre mayúsculas y minúsculas es la predeterminada si el servidor lo admite.

Significa que el Mount preservará la distinción entre mayúsculas y minúsculas del servidor FS. Si el FS del servidor distingue entre mayúsculas y minúsculas, estos archivos montados serán sensibles a mayúsculas y minúsculas; Si el FS del servidor no distingue entre mayúsculas y minúsculas, no lo hará.

Windows 7 no distingue entre mayúsculas y minúsculas, lo que hace que estos archivos de proyecto no distingan entre mayúsculas y minúsculas.

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

Si la opción 'etiquetas' incluye tanto etiquetas como TAGS :

:set tags=tags,TAGS

Vim buscará el archivo de etiquetas dos veces: una para etiquetas , otra para TAGS . En ambos tiempos, Vim descubre que hay uno que se ajusta. Esto hace que Vim confunda un mismo archivo de etiquetas con dos archivos diferentes.

En consecuencia, Vim usará dos archivos de etiquetas:

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

Por lo tanto, el problema de etiquetas duplicadas sucedió.

Si la opción 'etiquetas' solo incluye etiquetas :

:set tags=tags

El problema no existirá.

Feng Yu
fuente
Por cierto, ¿por qué Vim no deja de buscar el archivo de etiquetas cuando ya ha encontrado uno? Por lo tanto, el problema duplicado no existirá.
Feng Yu
En términos de archivos, algunas personas dividen sus proyectos en varias partes. Por ejemplo, mi fuente principal podría estar etiquetada en un archivo y una biblioteca compartida etiquetada en otro, pero me gustaría poder encontrar una definición de cualquier manera. En términos de continuar una vez que se encuentra un símbolo en los archivos de etiquetas, a veces un proyecto puede tener variantes, donde hay dos funciones del mismo nombre pero solo una u otra se construye / vincula para una variante dada. Al saltar a una definición como esa, querrá poder elegir qué variante le interesa en este momento de la lista, en lugar de solo la primera v
John O'M.
(Continúa) Vim encuentra.
John O'M.