cscope hoặc ctags tại sao chọn cái này hơn cái kia? [đóng cửa]


130

Tôi chủ yếu sử dụng vim / gvim như một trình soạn thảo và đang xem xét sử dụng kết hợp lxr (Tham khảo chéo Linux)cscope hoặc ctags để khám phá nguồn kernel. Tuy nhiên, tôi chưa bao giờ sử dụng cscope hoặc ctags và muốn biết lý do tại sao người ta có thể chọn cái này hơn cái kia khi xem xét việc tôi sử dụng vim làm biên tập viên chính.

Câu trả lời:


156

ctags cho phép hai tính năng: cho phép bạn chuyển từ các lệnh gọi hàm sang định nghĩa của chúng và hoàn thành omni. Điều đầu tiên có nghĩa là khi bạn kết thúc một cuộc gọi đến một phương thức, nhấn g]hoặc CTRL-]sẽ nhảy đến nơi mà phương thức đó được xác định hoặc thực hiện. Tính năng thứ hai có nghĩa là khi bạn nhập foo.hoặc foo->, và nếu foo là một cấu trúc, thì một menu bật lên với hoàn thành trường sẽ được hiển thị.

cscope cũng có tính năng đầu tiên - sử dụng set cscopetag- nhưng không phải là tính năng cuối cùng. Tuy nhiên, cscope cũng bổ sung khả năng nhảy đến bất kỳ nơi nào có chức năng được gọi là tốt.

Vì vậy, liên quan đến việc nhảy xung quanh một cơ sở mã, ctags sẽ chỉ dẫn bạn đến nơi thực hiện chức năng, trong khi cscope có thể chỉ cho bạn nơi một hàm được gọi là quá.

Tại sao bạn lại chọn cái này? Vâng, tôi sử dụng cả hai. ctags dễ cài đặt hơn, chạy nhanh hơn và nếu bạn chỉ quan tâm đến việc nhảy một chiều, nó sẽ hiển thị cho bạn ít dòng hơn. Bạn chỉ có thể chạy :!ctags -R .g]chỉ hoạt động. Nó cũng cho phép điều đó hoàn thành omni.

Cscope là tuyệt vời cho các cơ sở mã lớn hơn, chưa biết. Việc thiết lập là một nỗi đau vì cscope cần một tệp chứa danh sách tên của các tệp để phân tích. Ngoài ra, trong vim, theo mặc định, không có ràng buộc chính nào được thiết lập - bạn cần chạy:cscope blah blah thủ công.

Để giải quyết vấn đề đầu tiên tôi đã có một tập lệnh bash cscope_gen.shtrông như thế này:

#!/bin/sh
find . -name '*.py' \
-o -name '*.java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp'  \
> cscope.files

# -b: just build
# -q: create inverted index
cscope -b -q

Điều này tìm kiếm mã mà tôi quan tâm, tạo danh sách cscope.files và tạo cơ sở dữ liệu. Bằng cách đó tôi có thể chạy ":! Cscope_gen.sh" thay vì phải nhớ tất cả các bước thiết lập.

Tôi ánh xạ tìm kiếm cscope đến ctrl-space x 2 với đoạn mã này, điều này làm giảm nhẹ sự xuống cấp khác của cscope:

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

plugin cscope_maps.vim này thiết lập một loạt các ràng buộc tương tự. Tôi không bao giờ có thể nhớ tất cả các tùy chọn có nghĩa là gì, vì vậy có xu hướng dính vào không gian ctrl.

Vì vậy, để kết luận: ctags dễ dàng hơn để thiết lập và chủ yếu hoạt động mà không cần làm gì khác, nó cũng rất quan trọng đối với omni-perfect. cscope cung cấp nhiều tính năng hơn nếu bạn phải duy trì một cơ sở mã lớn và hầu như không xác định, nhưng đòi hỏi nhiều công việc chân hơn.


2
Có cách nào để làm cho ctags chính xác hơn? Tôi đã làm make tagstrong thư mục gốc của kernel và đã chơi với nhảy xung quanh và hầu hết thời gian kết thúc ở sai vị trí. Tôi đọc rằng ctags có vấn đề với bộ tiền xử lý c, nhưng xem xét rằng ctags được sử dụng trong lxr rõ ràng phải có một cái gì đó có thể được thực hiện.
Robert S. Barnes

2
Nếu có voodoo vĩ mô sâu, thì ctags có thể sẽ thất bại :-( Tôi sử dụng nó chủ yếu cho các công cụ C ++, vốn ít phụ thuộc vào khía cạnh đó (mặc dù điều đó có vấn đề riêng của nó ...)
richq

12
đặt cscopetag( cst) để thực hiện các lệnh :tagCTRL-]tìm kiếm thông qua cscope trước, sau đó gắn thẻ
Hasturkun

1
Ngoài ra, ctags khá chậm khi tìm kiếm đệ quy, sử dụng "ctags -L cscope.files" sẽ tăng tốc đáng kể việc tạo thẻ của bạn.
Aaron H.

1
@ RobertS.Barnes một số loại giải pháp đang sử dụng g C-], vim sẽ hiển thị cho bạn danh sách các thẻ khớp với tên. Bạn vẫn sẽ cần tìm định nghĩa phù hợp mà bạn đang tìm kiếm bằng tay.
Hubert Kario

15

Tôi đã ở trong tình trạng tương tự vài tháng trước ...

Sự thiếu chính xác của ctags là một nỗi đau trong một .. và tôi thấy cscope tốt hơn nhiều cho tất cả các công cụ liên quan đến macro (và có một loạt các macro trong kernel linux) ..

Liên quan đến việc sử dụng, điều đó thực sự đơn giản ... bạn chỉ cần nhập cscope -R vào thư mục gốc của kernel và sau đó bạn không có gì phải lo lắng .. (ý tôi là nếu bạn chỉ muốn khám phá điều đó thật hoàn hảo ...)

Sau đó, tất cả các ràng buộc chính đều dựa trên Ctrl- \ (bạn có thể ánh xạ lại nếu bạn bị dị ứng với Ctrl), bạn chủ yếu sử dụng s và g ....,

Phát triển cho kernel, tôi không cần quá nhiều để hoàn thành ....

Dù sao, đi cho cscope, điều này là thuận tiện hơn, chính xác hơn nhiều.


4
<< bạn chỉ cần nhập cscope -R vào thư mục gốc của kernel .... Tốt hơn là nhập "make cscope" trong kernel, nếu không, bạn sẽ kết thúc với tất cả các Kiến trúc có trong kernel Linux và do đó nhiều định nghĩa cho cùng một ký hiệu C.
kumar

4

Hmm ... Có lẽ bạn nên sử dụng etags thay vì ctags ...

Nếu bạn sử dụng cscope, thì bạn có thể thấy các chuỗi cuộc gọi, tức là ai gọi chức năng này & chức năng này gọi chức năng nào?

Tôi không chắc chắn nếu điều này có thể được thực hiện bằng cách sử dụng etags / ctags ...

Đó chỉ là một tính năng ... còn việc tìm ra tệp chứa định nghĩa hàm cụ thể thì sao? Điều này bạn chỉ nhận được trong cscope.

Tôi sử dụng cả hai cscope và etags, cả hai đều tốt cho những thứ khác nhau, đặc biệt là khi làm việc với một cơ sở mã lớn, chẳng hạn như Linux Kernel. Trong thực tế, tôi đã bắt đầu sử dụng cscope và etags khi tôi bắt đầu làm việc với Linux Kernel / Xen.

LXR không phải là tuyệt vời, vì bạn phải nhấp, truy cập mạng, v.v., trong khi bạn có thể xây dựng cơ sở dữ liệu cscope và thẻ trên mã hạt nhân của mình và không phải truy cập mạng (không giống như lxr).


Không phải là etags chỉ cho emacs? Tôi sử dụng g / vim độc quyền.
Robert S. Barnes

Vâng, bạn đúng. Từ trang man: Chương trình etags được sử dụng để tạo tệp bảng thẻ, theo định dạng được hiểu bởi emacs (1); chương trình ctags được sử dụng để tạo một bảng tương tự theo định dạng được hiểu bởi vi (1).
rmk

1
Tôi tin rằng có hai hương vị của etags và ctags. Một là emacs một, hai là ctags cường điệu một. Đầu tiên được viết đầu tiên cho emacs, nhưng cũng có thể được sử dụng cho vi; cái thứ hai được viết đầu tiên cho vi, nhưng cũng có thể được sử dụng cho emacs. Tôi thấy cái thứ hai (ctags exuberant) dễ sử dụng hơn, mặc dù tôi là người dùng emacs. Nếu bạn cài đặt gói exuberant-ctags, các liên kết đến nhị phân etags / ctags sẽ thay đổi và trỏ đến các nhị phân khác nhau.
ustun

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.