Tôi có thể chuyển đến một khai báo hàm hoặc định nghĩa trong một dự án tệp nguồn C ++ không?


14

Tôi có thể chuyển đến một khai báo hàm hoặc định nghĩa trong một dự án tệp nguồn C ++ không?

Hãy nói tôi có một tập tin tiêu đề foo.hpp:

int bar();

và một tệp nguồn foo.cpp:

#include "foo.hpp"
int bar() { return 42; }

và một tập tin chính main.cpp:

#include "foo.hpp"
int main() { bar(); return 0; }

Vim có thể tìm thấy cả định nghĩa và khai báo của hàm bar()từ mainhàm không?

Câu trả lời:


13

Ctags quá mức là cách đơn giản nhất để đạt được điều này. Trong GNU / Linux (ví dụ Ubuntu hoặc Debian), bạn sẽ có thể làm

sudo apt-get install exuberant-ctags

(Đối với OSX "$ brew install ctags" nên đủ; đối với Windows, bạn có thể muốn truy cập http://ctags.sourceforge.net/ và tải xuống tệp thực thi độc lập)

Sau đó điều hướng đến thư mục gốc của dự án của bạn và chạy

ctags -R --exclude=.git .

Thao tác này sẽ quét toàn bộ dự án của bạn và tạo tệp ./tags mà vim sẽ tự động sử dụng để cung cấp cho bạn khả năng chuyển đến các chức năng chỉ bằng cách bấm phím. Cụ thể là:

Ctrl + ]

với con trỏ của bạn được đặt trên hàm bạn muốn xem triển khai. Có kết hợp khác và nhiều chức năng chế độ lệnh cho phép bạn điều khiển các mã của bạn bằng cách ctags cũng như (ví dụ Ctrl+ tđể chuyển đến ngăn xếp vào thẻ cũ). Xem :help 29.1để biết tổng quan.

Lưu ý rằng bạn phải chạy lại ctags cho mỗi thay đổi quan trọng trong mã và để nó lập chỉ mục lại dự án của bạn. Bạn có thể làm điều đó bằng tay, hoặc dạy vim làm điều đó trên phím nóng hoặc viết.

Gợi ý: nếu bạn sử dụng rộng rãi các ctags, có thể plugin vim-taglist ( http://vim-taglist.sourceforge.net ) cũng đáng xem. Nó cung cấp cho bạn một phác thảo kiểu IDE với một danh sách tất cả các hàm cho lớp / tệp đó.


Hai điều đáng để biết: vạn năng-vạn năng có nhiều cách thay thế cho các cường điệu-ctags. Ngoài ra, cách để git đồng bộ thẻ của bạn
D. Ben Knoble

4

Cho đến nay tôi có thể đặt tên cho hai giải pháp cho vấn đề tìm khai báo hoặc định nghĩa của hàm. Tôi biết có một giải pháp dựa trên các thẻ được biết rõ khác, nhưng khi tôi không sử dụng nó, tôi sẽ để người khác đưa nó cho bạn.

Đầu tiên hợp thời trang hơn: YouCompleteMe có một :GoToDefinitionvà một :GoToDeclarationcặp lệnh.

Cách tôi sử dụng (thật khó để thay đổi thói quen dài 10 năm). Plugin lh-tags của tôi có cách tạo cơ sở dữ liệu ctags và cập nhật dần dần. Và nó cũng cung cấp một cách ( CTRL+W Meta+Down) để trình bày tất cả các khai báo và định nghĩa khớp với những gì nằm dưới con trỏ (/ những gì được chọn). Vì giải pháp này phụ thuộc vào ctags, nên sẽ không thể biết quá tải định danh nào dưới con trỏ cũng thực sự liên quan. Các giải pháp dựa trên ctags khác nên xấu (/ tốt) về chủ đề này. Tuy nhiên, YCM sẽ tốt hơn nhiều ở đây.

Discl.: Tôi đã thực hiện các thẻ lh như là một thay thế tiện lợi hơn :tselect.

(Trên thực tế tôi nhớ một giải pháp thứ ba: Tôi đã bắt đầu một nhánh của clang-indexerplugin vim có liên quan sẽ gói gọn nó. Nhưng với YCM, tôi sẽ quên giải pháp này)

EDIT: Tính đến năm 2019, giải pháp hiệu quả nhất phụ thuộc vào máy chủ LSP . Tôi đang sử dụng COC + ccls để lập chỉ mục, nhảy và làm nhiều thứ khác. Tôi quay trở lại các giải pháp dựa trên thẻ khi tôi quá lười biếng để định cấu hình COC cho dự án mà tôi sẽ không mất nhiều thời gian hoặc nơi tôi không thể cài đặt các phiên bản gần đây của clang và ccls.


1
Cảm ơn bạn đã đầu vào, sẽ kiểm tra từng giải pháp. Tôi đã thử nghiệm YouCompleteMe và chỉ GoToDeclarationhoạt động với nhiều tệp nguồn. Đây là một trích dẫn từ các tài liệu về GoToDefinition: For C-family languages this only works ... when the definition of the symbol is in the current translation unit.. Ngoài ra, các lệnh là :YcmCompleter GoTo*.
Allan Hasegawa

Tôi đã bỏ lỡ dòng này. Điều đó có nghĩa là clang_indexer vẫn có thể hữu ích. Các giải pháp khác có thể là một chút khó khăn để cài đặt. Đừng ngần ngại gửi cho tôi một email nếu cần.
Luc Hermitte

3

Có một vài lựa chọn thay thế. Đầu tiên là ctags. Nếu bạn cần một người lập chỉ mục nâng cao hơn thì đó cscopelà một sự thay thế tốt hơn. Chẳng hạn, nó sẽ cho phép bạn liệt kê tất cả những người gọi hàm đã cho. Các công cụ này sẽ lập chỉ mục mã của bạn mà không thực sự hiểu đúng về mã (chúng có định nghĩa ngữ pháp đơn giản để biết ký hiệu đã cho nghĩa là gì). Nó cũng tương đối dễ dàng để mở rộng ngữ pháp đó. Các taglistplugin là một phải có cho những điều này và nó có thể mở rộng indexer ngữ pháp để hiển thị kết quả trong taglist.

Nếu bạn cần một cái gì đó nhiều hơn chỉ mục thì như kiểm tra cú pháp thì YouCompleteMecó lẽ là cách để đi. Nó được xây dựng trên đầu trang llvmvà do đó có trình phân tích cú pháp thích hợp. Điều này cho phép kiểm tra cú phápvà ngữ nghĩa .

Sau đó, nếu bạn làm việc với một mã có ngôn ngữ cụ thể của miền hoặc mã nhúng thì cuối cùng bạn thường chỉ lấy các tệp thông qua. Thay thế là Ackkịch bản perl cố gắng giúp với nhiệm vụ này.


0

Tôi nghĩ rằng ctags đó là những gì bạn cần. Vim được tích hợp với ctags nguyên bản và có thể dễ dàng chuyển sang các định nghĩa và khai báo hàm.

Hãy xem bài viết này http://andrew.stwrt.ca/posts/vim-ctags


Vui lòng thêm một bản tóm tắt của bài viết được liên kết. Câu trả lời chỉ liên kết trở nên vô dụng khi liên kết bị chết.
muru 20/2/2015
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.