Ctags quá mức - Vấn đề thẻ trùng lặp


8

Đây là một tệp - ChipBooter.cpp- trong dự án của tôi (Bỏ qua một số chi tiết không liên quan đến câu hỏi này):

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

Khi tôi nhấn g<C-]>để chuyển sang định nghĩa DpDetect, Vim hiển thị một danh sách với các thẻ trùng khớp:

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

Đây là định nghĩa tương tự!

Vấn đề này xảy ra mỗi khi tôi nhấn g<C-]>và luôn nhân đôi độ dài của danh sách.


Thêm chi tiết

Phiên bản Ctags quá khích : 5.8. Phiên bản Vim là7.3

Đây là một đại diện trực quan của hệ thống phân cấp thư mục của tôi:

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

Tôi chạy ctags -Rtrong Sourceđó chứa OMUthư mục để tạo tagstập tin.

Tôi khởi chạy vim bằng cách sử dụng vim -u NONE -N; .vimrcvà plugin bị vô hiệu hóa.

Chỉ có một mục nhập DpDetecttrong tagstệp:

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

tagslà giá trị mặc định, vì .vimrcbị vô hiệu hóa.

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

Cập nhật

@romainl cho biết Vim dường như đang sử dụng cả hai tệp thẻ : tagsTAGS.

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

Nếu tôi thay đổi tagstùy chọn để loại trừ tệp TAGS ( :set tags=./tags,tags), vấn đề về thẻ trùng lặp sẽ không tồn tại.

Đâu là TAGStập tin? Chỉ có một tagstập tin trong thư mục dự án của tôi.

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

1
Đầu ra của là :echo tagfiles()gì?
romainl

1
Vim dường như đang sử dụng hai tập tin thẻ tagsTAGS. Bạn có một TAGStập tin trong /home/yufeng/mount/svncode/omu/zycp/Source/? Nó có thể là một vấn đề nhạy cảm trường hợp?
romainl

1
@romainl Tôi nghĩ bạn đang làm gì đó. Cho rằng mọi người mới sử dụng vim hiện đang làm việc trên Mac OS X, điều này có thể giúp OP: apple.stackexchange.com/questions/71357/. Tôi đoán rằng Vim cho rằng trong Unix tất cả các hệ thống tệp đều phân biệt chữ hoa chữ thường.
Vitor

@Vitor, tôi không biết nhiều về ruột của Vim nhưng tôi có thể tưởng tượng nó yêu cầu hệ thống tệp cho một tagstệp và sau đó yêu cầu TAGStệp. Một FS phân biệt chữ hoa chữ thường sẽ trả lời có cho cả hai câu hỏi, buộc Vim phải tìm kiếm hai lần trong cùng một tệp với suy nghĩ có hai, trong khi một FS không phân biệt chữ hoa chữ thường chỉ trả lời có cho câu hỏi đầu tiên.
romainl

Liên kết của Vitor cho bạn biết Mac OS X. Google sẽ cho bạn biết các hệ điều hành khác như thế nào.
romainl

Câu trả lời:


5

Như @romainl đã nói, Đây thực sự là một vấn đề phân biệt chữ hoa chữ thường (hệ thống tệp).

Tệp dự án của tôi được gắn từ Window 7 vào Fedora của tôi bằng cách sử dụng:

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

Từ trang man mount.cifs :

trường hợp nhạy cảm là mặc định nếu máy chủ hỗ trợ nó.

Điều đó có nghĩa là Mount sẽ bảo vệ độ nhạy trường hợp của máy chủ FS. Nếu FS của máy chủ phân biệt chữ hoa chữ thường, các tệp được gắn này sẽ phân biệt chữ hoa chữ thường; Nếu FS của máy chủ không phân biệt chữ hoa chữ thường, chúng sẽ không phân biệt chữ hoa chữ thường.

Windows 7 không phân biệt chữ hoa chữ thường, làm cho các tệp dự án này không phân biệt chữ hoa chữ thường.

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

Nếu tùy chọn 'tags' bao gồm cả thẻTAGS :

:set tags=tags,TAGS

Vim sẽ tìm kiếm tệp thẻ hai lần: một cho thẻ , một cho TAGS . Trong cả hai lần, Vim thấy rằng có một sự phù hợp. Điều này làm cho Vim nhầm một tệp thẻ giống nhau cho hai tệp khác nhau.

Do đó, Vim sẽ sử dụng hai tệp thẻ:

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

Do đó, vấn đề thẻ trùng lặp đã xảy ra.

Nếu tùy chọn 'tags' chỉ bao gồm các thẻ :

:set tags=tags

Vấn đề sẽ không tồn tại.


BTW, tại sao Vim không dừng tìm kiếm tệp thẻ khi nó đã tìm thấy? Do đó, vấn đề trùng lặp sẽ không tồn tại.
Feng Yu

Về các tập tin, một số người chia dự án của họ thành nhiều phần. Ví dụ: nguồn chính của tôi có thể được gắn thẻ trong một tệp và thư viện dùng chung được gắn thẻ ở tệp khác, nhưng tôi muốn có thể tìm thấy một định nghĩa theo bất kỳ cách nào. Về mặt tiếp tục một khi một biểu tượng được tìm thấy trong các tệp thẻ, đôi khi một dự án có thể có các biến thể, trong đó có hai chức năng cùng tên nhưng chỉ một hoặc một chức năng khác được xây dựng / liên kết cho một biến thể nhất định. Khi chuyển sang một định nghĩa như vậy, bạn muốn có thể chọn biến thể nào bạn quan tâm ngay bây giờ từ danh sách, thay vì chỉ một biến thể đầu tiên v
John O'M.

(Tiếp theo) Vim tìm thấy.
John O'M.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.