Pregunta:
Aquí hay un archivo – ChipBooter.cpp
– en mi proyecto (omita algunos detalles que no están relacionados con esta pregunta):
class ChipBooter {
public:
void Boot() {
this->DpDetect();
}
void DpDetect() {}
}
Cuando DpDetect
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 de Ctags: 5.8
. La versión de Vim es 7.3
Aquí hay una representación visual de mi jerarquía de directorios:
Source
`---tags
|
`---OMU
`---src
`---boot
`---src
`---ChipBooter.cpp
ctags -R
en Source
que contiene el directorio OMU
para generar el archivo de tags
.
Lanzo vim usando vim -u NONE -N
; .vimrc
y los complementos están deshabilitados.
Solo hay una entrada sobre DpDetect
en el archivo de tags
:
DpDetect OMU/src/boot/src/ChipBooter.cpp /^void ChipBooter::DpDetect()$/;" f class:ChipBooter
tags
es el valor predeterminado, porque .vimrc
está deshabilitado.
:set tags?
tags=./tags,./TAGS,tags,TAGS
Actualizar
@romainl dijo Vim parece estar usando ambos dos archivos de etiquetas: tags
y TAGS
.
:echo tagfiles()
['tags', 'TAGS']
Si cambio la opción de tags
para excluir el archivo TAGS ( :set tags=./tags,tags
), el problema de las etiquetas duplicadas no existe.
¿Dónde está el archivo TAGS
? Solo hay un archivo de tags
en el directorio de mi proyecto.
$ find {My project root directory} -iname tags
./tags
Respuesta:
Como dijo @romainl, de hecho es un problema de distinción entre mayúsculas y minúsculas del 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 :
sensible a mayúsculas y minúsculas es el valor predeterminado si el servidor lo admite.
Significa que Mount conservará 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 distinguirán entre mayúsculas y minúsculas; Si el FS del servidor no distingue entre mayúsculas y minúsculas, no distingue entre mayúsculas y minúsculas.
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 momentos, Vim encuentra que hay uno que encaja. Esto hace que Vim confunda un mismo archivo de etiquetas con dos archivos diferentes.
En consecuencia, Vim utilizará dos archivos de etiquetas:
:echo tagfiles()
['tags', 'TAGS']
Por lo tanto, ocurrió un problema de etiquetas duplicadas.
Si la opción 'etiquetas' incluye solo etiquetas :
:set tags=tags
El problema no existirá.