あふれんばかりのCtags-重複タグの問題


8

ここにファイルがあります-- ChipBooter.cpp私のプロジェクトで(この質問に関連していないいくつかの詳細を省略してください):

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

ヒットg<C-]>しての定義にジャンプするとDpDetect、Vimは一致するタグが重複するリストを表示しました。

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

これは同じ定義です!

この問題は、ヒットするたびに発生しg<C-]>、常にリストの長さが2倍になります。


もっと詳しく

あふれんばかりのCtagsバージョン:5.8。Vimのバージョンは7.3

これは私のディレクトリ階層の視覚的表現です:

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

私はファイルを生成するためのディレクトリを含んで実行しctags -RましSourceた。OMUtags

を使用してvimを起動しvim -u NONE -Nます。.vimrcプラグインが無効になっています。

ファイルDpDetectには約1つのエントリしかありませんtags

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

tags.vimrc無効になっているため、デフォルト値です。

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

更新

@romainlは、Vimは2つのタグファイルを使用しているようです:tagsTAGS

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

TAGSファイル()tagsを除外するオプションを変更した場合、重複タグの問題は発生しません。:set tags=./tags,tags

TAGSファイルはどこにありますか?tagsプロジェクトディレクトリにはファイルしかありません。

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

1
の出力は:echo tagfiles()何ですか?
romainl

1
Vimは二つのタグファイルを使用しているようだ、tagsTAGS。にTAGSファイルはあり/home/yufeng/mount/svncode/omu/zycp/Source/ますか?大文字と小文字を区別する問題でしょうか?
romainl

1
@romainl私はあなたが何かをしていると思います。最近はすべてのvimの新人は、Mac OS X上で動作していることを考えると、これはOPを助けるかもしれない:apple.stackexchange.com/questions/71357/...は、 私はVimはUnixの内のすべてのファイルシステムは大文字と小文字が区別されますことを想定していることを推測します。
Vitor

@Vitor、私はVimの根性についてあまり知らないが、私はそれがためにファイルシステムを求めて想像することができますtagsを求め、そのファイルとTAGSファイル。大文字と小文字を区別するFSは両方の質問にyesと答え、Vimは2つあると考えて同じファイルを2回検索しますが、大文字と小文字を区別しないFSは最初の質問にのみyesと答えます。
romainl

VitorのリンクはMac OS Xの場合の方法を示しています。Googleは他のOSの場合を教えてくれます。
romainl

回答:


5

@romainlが言ったように、それは確かにFS(ファイルシステム)の大文字と小文字の区別の問題です。

私のプロジェクトファイルは、以下を使用してWindow 7からFedoraにマウントされています。

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

mount.cifsのmanページ:

サーバーでサポートされている場合は、大文字と小文字が区別されます。

これは、マウントがサーバーFSの大文字と小文字の区別を保持することを意味します。サーバーのFSで大文字と小文字が区別される場合、これらのマウントされたファイルでは大文字と小文字が区別されます。サーバーのFSが大文字と小文字を区別しない場合、それらは大文字と小文字を区別しません。

Windows 7では大文字と小文字が区別されないため、これらのプロジェクトファイルでは大文字と小文字が区別されません。

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

「タグ」オプションにタグタグの両方が含まれている場合:

:set tags=tags,TAGS

Vimはタグファイルを2回検索します。1つはタグ、もう1つはタグです。どちらの場合も、Vimは1つの適合があると判断します。これにより、Vimは1つの同じタグファイルを2つの異なるファイルと間違えます。

その結果、Vimは2つのタグファイルを使用します。

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

したがって、重複タグの問題が発生しました。

「タグ」オプションにタグのみが含まれる場合:

:set tags=tags

問題は存在しません。


ところで、Vimがタグファイルを既に見つけたのに、なぜ検索しないのですか?したがって、重複する問題は存在しません。
Feng Yu

ファイルに関しては、プロジェクトを複数の部分に分割する人もいます。たとえば、私のメインソースが1つのファイルでタグ付けされ、共有ライブラリが別のファイルでタグ付けされる可能性がありますが、どちらの方法でも定義を見つけられるようにしたいと考えています。タグファイルでシンボルが見つかったら続行するという点で、プロジェクトにバリアントが含まれる場合があります。この場合、同じ名前の関数が2つありますが、特定のバリアントに対してビルドまたはリンクされるのはどちらか一方だけです。そのような定義にするとジャンプ、あなたはむしろ、最初のものだけVよりも、リストから今あなたが気にどのバリアント選ぶことができるようにしたいと思います
ジョンO'M。

(続き)Vimが発見。
ジョンO'M。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.