Làm thế nào để nhảy đến chức năng gọi?


14

Sau khi tạo tệp thẻ với exuberant-ctagstôi có thể chuyển từ lệnh gọi hàm sang khai báo <C-]>khá thuận tiện.

Câu hỏi của tôi là làm thế nào để làm điều đó theo cách khác? Khi con trỏ của tôi nằm trên định nghĩa của hàm, làm thế nào tôi có thể đi đến các dòng nơi hàm được gọi?

Khi tôi tìm đến tệp được tạo bởi ctags, tôi chỉ thấy các thông tin liên quan đến vị trí của định nghĩa chứ không phải các cuộc gọi, điều đó có nghĩa là tôi không thể làm điều đó, đó là một cách giải quyết thông minh hoặc tôi cần sử dụng một cái gì đó khác hơn exuberant-ctags?


Ack hoặc Ag cũng sẽ hoạt động và bạn có thể tìm thấy các trình bao bọc plugin cho các công cụ dòng lệnh này khá dễ dàng. Ví dụ: github.com/mileszs/ack.vimgithub.com/rking/ag.vim
dash-tom-bang

Câu trả lời:


11

Bạn không thể chuyển đến các cuộc gọi chức năng với ctags. Đối với C / C ++ và Java thì có cscope, và nó tích hợp độc đáo với Vim (xem :help cscope). Đối với các ngôn ngữ khác, bạn có thể tìm thấy một công cụ tạo / xuất cscopecơ sở dữ liệu tương thích (fi hscopecho Haskell và starscopecho Ruby, Go và JavaScript). Bạn cũng có thể sử dụng cscopevới cơ sở dữ liệu toàn cầu GNU , bằng cách trỏ cscopeprgđến gtags-cscope.

Một lưu ý phụ: nếu đôi khi bạn không sử dụng Engrish một cách khó hiểu , thì có lẽ bạn cũng muốn sử dụng phổ biến-ctags thay vì exuberant-ctags. Sau này đã không được cập nhật trong năm. Các cựu là một ngã ba tích cực duy trì.


Cscope có hỗ trợ các ngôn ngữ khác ngoài C / C ++ và Java không?
edi9999

@ edi9999 cscopetự hỗ trợ C / C ++, Lex và Yacc. Sự hỗ trợ cho Java rất hữu ích. Bạn có thể nhận hỗ trợ cho PHP và JavaScript (kiểu cũ) từ GNU global, thông qua gtags-cscopetiện ích. Và, như tôi đã nói ở trên, có những người lập chỉ mục khác có thể xuất cscopecơ sở dữ liệu tương thích.
Sato Katsura

8

Bạn không thể làm điều đó với ctags.

Hãy thử một giải pháp thay thế mạnh mẽ hơn như cscope (thậm chí có phần trợ giúp riêng :help cscope:) hoặc toàn cầu .


Cscope có hỗ trợ các ngôn ngữ khác ngoài C / C ++ và Java không?
edi9999

Vâng, ít nhất là PHP và JavaScript.
romainl

1
@romainl Không, cscopenó hỗ trợ cả PHP và JavaScript. Tuy nhiên, bạn có thể lập chỉ mục các tệp PHP và JavaScript bằng GNU global, sau đó chạy gtags-cscopeđể sử dụng gtagstệp kết quả với cscope.
Sato Katsura

@SatoKatsura, vâng, cscope hỗ trợ JavaScript (và CSS, một cách rõ ràng).
romainl

2
@romainl Bạn nên xem xét cscopecác nguồn của thay vì suy đoán dựa trên các thử nghiệm nhanh. cscopecó một trình phân tích cú pháp C khá thoải mái. Đó là tất cả những gì nó có, và tất cả những gì nó có. Với trình phân tích cú pháp đó, nó "hỗ trợ" rất nhiều ngôn ngữ, cho các giá trị "hỗ trợ" phù hợp. Các cấu trúc được nhận ra miễn là chúng trông giống hoặc ít hơn C. Đó là lý do tại sao các lớp Java và các cấu trúc PHP mới hơn không được nhận ra. So sánh fi với Starscope , thực sự cho phép thêm các ngôn ngữ mới.
Sato Katsura

8

Bạn có thể sử dụng lệnh grep của Vim để tìm kiếm tất cả các tệp trong dự án của bạn:

:grep! "\<<cword>\>" . -r
:copen

Chúng ta hãy đặt nó trong một keybind:

nnoremap <F4> :grep! "\<<cword>\>" . -r<CR>:copen<CR>

Tôi thấy tìm kiếm toàn dự án một khóa này là vô giá khi tôi đang khám phá một cơ sở mã lớn không quen thuộc.

\<\>là các chuỗi regrec chỉ ra sự bắt đầu và kết thúc của một từ, vì vậy bạn sẽ không nhận được một phần khớp. ( -wTùy chọn grep có thể là một cách khác để đạt được điều này.)

Tuy nhiên, đây là một tìm kiếm không thông minh , vì vậy nó có thể tạo ra kết quả dương tính giả nếu cùng một từ xuất hiện trong bối cảnh không liên quan.


Thay vào đó , thực tế, tôi sử dụng phiên bản sửa đổi của plugin grep.vim . Điều này hơi thân thiện hơn để sử dụng:

  • Nó cho phép bạn chỉnh sửa mẫu tìm kiếm và dòng lệnh grep (để bạn có thể nhắm mục tiêu các thư mục cụ thể như src/ lib/thay vì .) và ghi nhớ các thay đổi.
  • Tôi đã thêm hỗ trợ cho csearch của Google . Điều này có thể nhanh hơn nhiều so với grep vì nó xây dựng một chỉ mục các từ thay vì quét từng tệp mỗi lần. Đáng chú ý, csearch sử dụng một tiêu chuẩn regrec hơi khác nhau, do đó \bphải được sử dụng thay vì \<\>.

Tôi cấu hình nó và loại trừ một số tập tin tiêu chuẩn như thế này .

Để truy cập nhanh, tôi tạo hai keybinds . F3cho phép tôi chỉnh sửa dòng lệnh, F4sử dụng dòng lệnh được cấu hình trước đó mà không cần thêm bất kỳ tổ hợp phím nào. Cơ chế này khá xấu, và có thể sử dụng một số dọn dẹp, nhưng nó đã phục vụ tốt cho tôi.

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.