Ctags Riang - Masalah tag duplikat

8

Ini file - ChipBooter.cpp- di proyek saya (Abaikan beberapa detail yang tidak terkait dengan pertanyaan ini):

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

Ketika saya menekan g<C-]>untuk melompat ke definisi DpDetect, Vim menampilkan daftar dengan tag yang cocok duplikat:

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

Ini definisi yang sama!

Masalah ini terjadi setiap kali saya menekan g<C-]>dan selalu menggandakan panjang daftar.


Keterangan lebih lanjut

Versi riang Ctags: 5.8. Versi Vim adalah7.3

Berikut ini adalah representasi visual dari hierarki direktori saya:

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

Saya berlari ctags -Rdi Sourcemana berisi OMUdirektori untuk menghasilkan tagsfile.

Saya meluncurkan vim menggunakan vim -u NONE -N; .vimrcdan plugin dinonaktifkan.

Hanya ada satu entri tentang DpDetectdalam tagsfile:

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

tagsadalah nilai default, karena .vimrcdinonaktifkan.

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

Memperbarui

@romainl berkata Vim tampaknya menggunakan kedua file tag tersebut : tagsdan TAGS.

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

Jika saya mengubah tagsopsi untuk mengecualikan file TAGS ( :set tags=./tags,tags), masalah tag duplikat tidak ada.

Di mana TAGSfile itu? Hanya ada tagsfile di direktori proyek saya.

$ find {My project root directory} -iname tags
./tags
Feng Yu
sumber
2
Apa output dari :echo tagfiles()?
romainl
1
Vim tampaknya menggunakan dua file tag, tagsdan TAGS. Apakah Anda memiliki TAGSfile /home/yufeng/mount/svncode/omu/zycp/Source/? Mungkinkah itu masalah sensitivitas kasus?
romainl
1
@romainl, saya pikir Anda sedang melakukan sesuatu. Mengingat bahwa setiap pendatang baru vim saat ini bekerja pada Mac OS X, ini dapat membantu OP: apple.stackexchange.com/questions/71357/... Saya akan menebak bahwa Vim mengasumsikan bahwa di Unix semua sistem file sensitif terhadap huruf besar-kecil.
Vitor
@Vitor, saya tidak tahu banyak tentang nyali Vim tapi saya bisa membayangkannya meminta sistem file untuk tagsfile dan kemudian meminta TAGSfile. FS peka huruf besar kecil akan menjawab ya untuk kedua pertanyaan, memaksa Vim mencari dua kali dalam file yang sama dengan berpikir ada dua, sedangkan FS peka huruf kecil akan menjawab ya hanya untuk pertanyaan pertama.
romainl
Tautan Vitor memberi tahu Anda cara untuk Mac OS X. Google akan memberi tahu Anda untuk OS lain.
romainl

Jawaban:

5

Seperti yang dikatakan @romainl, Ini memang masalah sensitivitas huruf FS (sistem file).

File proyek saya dipasang dari Window 7 ke Fedora saya menggunakan:

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

Dari halaman manual mount.cifs :

case sensitive adalah default jika server mendukungnya.

Ini berarti bahwa Mount akan menjaga sensitivitas case dari server FS. Jika FS server peka huruf besar kecil, file yang dipasang ini akan peka huruf besar kecil; Jika FS server tidak peka huruf besar kecil, mereka akan peka huruf besar kecil.

Windows 7 adalah case-insensitive, yang membuat file proyek ini case-insensitive.

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

Jika opsi 'tag' menyertakan tag dan TAG :

:set tags=tags,TAGS

Vim akan mencari file tag dua kali: satu untuk tag , yang lain untuk TAGS . Di kedua kali, Vim menemukan bahwa ada satu yang cocok. Ini membuat kesalahan Vim satu file tag yang sama untuk dua file yang berbeda.

Akibatnya, Vim akan menggunakan dua file tag:

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

Dengan demikian, masalah tag duplikat terjadi.

Jika opsi 'tag' hanya menyertakan tag :

:set tags=tags

Masalahnya tidak akan ada.

Feng Yu
sumber
BTW, mengapa Vim tidak berhenti mencari file tag ketika sudah menemukan satu tag? Dengan demikian, masalah rangkap tidak akan ada.
Feng Yu
Dalam hal file, beberapa orang memecah proyek mereka menjadi beberapa bagian. Sebagai contoh, sumber utama saya mungkin ditandai dalam satu file dan perpustakaan bersama ditandai di yang lain, tetapi saya ingin dapat menemukan definisi dengan cara apa pun. Dalam hal melanjutkan setelah simbol ditemukan dalam file tag, kadang-kadang proyek mungkin memiliki varian, di mana ada dua fungsi dengan nama yang sama tetapi hanya satu atau yang lain dibangun / ditautkan untuk varian tertentu. Ketika melompat ke definisi seperti itu, Anda ingin dapat memilih varian mana yang Anda sukai saat ini dari daftar, daripada hanya yang pertama v
John O'M.
(Lanjutan) Vim menemukan.
John O'M.