Tôi chủ yếu sử dụng vim/gvim làm trình chỉnh sửa và đang xem sử dụng kết hợp lxr (the Linux Cross Reference) và cscope hoặc ctags để khám phá nguồn hạt nhân. Tuy nhiên, tôi chưa bao giờ sử dụng hoặc là cscope hoặc ctags và muốn nghe lý do tại sao người ta có thể chọn một người khác xem xét việc sử dụng vim của tôi làm trình chỉnh sửa chính.cscope hoặc ctags tại sao chọn cái khác?
Trả lời
ctags cho phép hai tính năng: cho phép bạn chuyển từ các cuộc 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 cuộc gọi đến một phương thức, nhấn g]
hoặc CTRL-]
sẽ chuyển đến vị trí mà phương thức đó được xác định hoặc triển khai. Tính năng thứ hai có nghĩa là khi bạn nhập foo.
hoặc foo->
và nếu foo là cấu trúc, thì trình đơn bật lên có 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 bổ sung thêm khả năng nhảy tới bất kỳ nơi nào mà hàm cũng được gọi.
Vì vậy, cho đến khi nhảy xung quanh một cơ sở mã là có liên quan, ctags sẽ chỉ dẫn bạn tới vị trí mà hàm được thực hiện, trong khi cscope có thể cho bạn biết nơi hàm cũng được gọi.
Tại sao bạn chọn cái này qua cái kia? Vâng, tôi sử dụng cả hai. ctags là dễ dàng hơn để thiết lập, nhanh hơn để chạy và nếu bạn chỉ quan tâm về nhảy một cách nó sẽ cho bạn thấy ít dòng. Bạn chỉ có thể chạy :!ctags -R .
và g]
chỉ hoạt động. Nó cũng cho phép điều hoàn chỉnh omni đó.
Cscope tuyệt vời cho các cơ sở mã lớn hơn, không xác định. 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 các tệp để phân tích cú pháp. Cũng trong vim, theo mặc định không có ràng buộc khóa nào được thiết lập - bạn cần chạy theo cách thủ công :cscope blah blah
.
Để giải quyết vấn đề nắm tay tôi đã có một kịch bản bash cscope_gen.sh
trô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
này tìm kiếm cho mã mà tôi quan tâm, tạo danh sách cscope.files và tạo ra 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 lập bản đồ tìm kiếm cscope để Ctrl-Space x 2 với đoạn này, mà giảm nhẹ Downer khác của cscope:
nmap <[email protected]><[email protected]> :cs find s <C-R>=expand("<cword>")<CR><CR>
Có this cscope_maps.vim plugin rằng thiết lập một loạt các cam kết ràng buộc tương tự. Tôi không bao giờ có thể nhớ những gì tất cả các tùy chọn có nghĩa là, do đó, có xu hướng dính vào ctrl-không gian.
Vì vậy, để kết luận: ctags dễ thiết lập hơn và hầu hết hoạt động mà không làm nhiều việc khác, điều quan trọng là cũng cần phải hoàn tất. 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 được biết đến, nhưng đòi hỏi nhiều công việc chân hơn.
Có cách nào để làm cho ctags chính xác hơn không? Tôi đã làm 'làm cho thẻ' trong thư mục gốc của hạt nhân và đã được chơi với nhảy xung quanh và hầu hết thời gian kết thúc ở vị trí sai. Tôi đọc rằng ctags có vấn đề với tiền xử lý c, nhưng xem xét rằng ctags được sử dụng trong lxr có rõ ràng phải là một cái gì đó có thể được thực hiện. –
Nếu có macro voodoo sâu, thì ctags có thể sẽ thất bại :-(Tôi sử dụng nó chủ yếu cho công cụ C++, phụ thuộc ít hơn vào khía cạnh đó (mặc dù điều đó có vấn đề riêng ...) – richq
Tôi hoàn toàn đồng ý với điều đó. .. hạt nhân Linux có đầy đủ các macro và ctags lạ thất bại ... đó là lý do tại sao tôi chuyển sang cscope – LB40
tôi ở trong hoàn cảnh tương tự cách đây vài tháng ...
Việc thiếu chính xác của ctags là một nỗi đau trong một .., và tôi tìm cscope tốt hơn cho tất cả các macro thứ liên quan (và có một loạt các macro trong hạt nhân Linux) ..
liên quan đến việc sử dụng, điều đó thực sự đơn giản ... bạn chỉ cần gõ cscope -R vào thư mục gốc của hạt nhân 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 đó hoàn hảo ...)
Sau đó, các tổ hợp phím đều dựa trên Ctrl-\ (bạn có thể remap nó 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 các hạt nhân , Tôi không cần quá nhiều sự hoàn thành ....
Dù sao, đi cho cscope, điều này thuận tiện hơn, chính xác hơn nhiều.
<< bạn chỉ cần gõ cscope -R vào thư mục gốc của hạt nhân .... Tốt hơn để gõ "make cscope" dưới 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 nhân Linux và do đó có nhiều định nghĩa cho cùng một ký hiệu C. – kumar
Hmm ... Bạn có lẽ nên sử dụng etags thay vì ctags ...
Nếu bạn sử dụng cscope, sau đó bạn có thể thấy gọi chuỗi, tức là, Đấng kêu gọi chức năng này & có chức năng thực hiện cuộc gọi chức năng này?
Tôi không chắc chắn nếu điều này có thể được thực hiện bằng etags/ctags ...
Đó chỉ là một tính năng ... những gì về việc tìm ra các tập tin có chứa một định nghĩa hàm cụ thể không? Đ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 codebase lớn, chẳng hạn như hạt nhân Linux. 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 là không lớn, bởi vì bạn phải nhấp chuột, đi qua mạng, vv, trong khi bạn có thể xây dựng cơ sở dữ liệu cscope và các thẻ trên mã kernel và không cần phải đi qua mạng (không giống như LXR) .
Không phải là etags chỉ dành cho emacs? Tôi sử dụng g/vim độc quyền. –
Có, bạn đã đúng. Từ trang người đàn ông: 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 ra một bảng tương tự trong một định dạng được hiểu bởi vi (1). – rmk
có hai hương vị của etags và ctags tôi tin. Một là emacs một, khác là một ctags exuberant một. Đầu tiên được viết đầu tiên cho emacs, nhưng có thể được sử dụng cho vi quá; thứ hai được viết lần đầu tiên cho vi, nhưng có thể được sử dụng cho emacs quá. Tôi tìm thấy một thứ hai (ctags exuberant) dễ sử dụng hơn, mặc dù tôi là một người dùng emacs. Nếu bạn cài đặt gói exuberant-ctags, các liên kết đến các tệp nhị phân etags/ctags sẽ thay đổi và trỏ đến các tệp nhị phân khác nhau. – ustun
Bỏ phiếu để đóng quá rộng, như hầu hết các công cụ A so với công cụ B câu hỏi. –
Tôi nghĩ rằng đó là sự đồng thuận chung: http://meta.stackexchange.com/questions/222060/modify-the-recommend-a-tool-close-reason-to-also-forbid-comparison-questions || http://meta.stackexchange.com/questions/211269/why-stackoverflow-doesnt-allow-comparison-questions-or-recommendations-for-tool || http://stackoverflow.com/questions/20537271/pros-and-cons-of-calabash-ios Tất nhiên, cảm thấy tự do để tranh cãi nó, tôi có thể sai. –