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 .
và 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.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
Đ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>
Có 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.
make tags
trong 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.