2010-06-26 28 views
15

Tôi đã tự hỏi làm thế nào mọi người sử dụng thẻ trong emacs khi làm việc trên một codebase lớn (khoảng 50000 cpp | .h | .cs tập tin). Một số đồng nghiệp của tôi sử dụng các công cụ lập chỉ mục (các tên thoát khỏi tôi) trả về tất cả các kết quả trên codebase tính bằng giây. Tôi dường như không thể đạt được bất kỳ nơi nào gần với hiệu suất đó trên các emacs và các thẻ, nhưng về cơ bản nó giống nhau!Tags trong emacs với một codebase lớn

Một số phương pháp tôi đã cố gắng:

  1. Tạo một file TAGS cho toàn bộ kho lưu trữ. Điều này thường khá lớn và thường khó xử khi sử dụng (đôi khi quá nhiều thẻ khớp).
  2. Tạo các tệp TAGS riêng biệt cho cpp | h | cs. Một chút tập trung hơn nếu tôi biết (khoảng (ít nhất là ngôn ngữ lập trình sẽ được sử dụng)) những gì tôi xảy ra để được tìm kiếm.
  3. Các tệp thẻ nhỏ hơn trên một phần của kho lưu trữ. Đây là tuyệt vời khi tôi khá chắc chắn của khu vực nhưng chi phí quản lý là một nỗi đau. Tôi thường sẽ tạo ra chúng như và khi cần thiết.

Mọi đề xuất \ ví dụ về quy trình công việc của bạn được đánh giá cao.

+0

Tệp thẻ là tập tin liệt kê tệp văn bản (chưa được lập chỉ mục). Nó là một chỉ mục của mã của bạn, nhưng để tìm một mã định danh trong nó, bạn cần phải đi qua tệp đến điểm đó. Một công cụ lập chỉ mục sử dụng một cơ sở dữ liệu thực với một chỉ mục (vào chính các thẻ) sẽ dễ dàng đánh bại điều đó. Thẻ của bạn lớn như thế nào? – Ken

+1

Điểm tốt - đã không nhận ra điều đó. Bất kỳ đề xuất nào về cách đặt thẻ emacs + tốt hơn một chút? Tập tin thẻ của tôi là khoảng 30 megs – cristobalito

+1

Trải nghiệm của tôi với các thẻ không phải là rất rộng rãi, xin lỗi - không bao giờ sử dụng nó trên một dự án lớn. Cá nhân, tại thời điểm đó tôi có lẽ sẽ nhìn vào hooking một công cụ tìm kiếm mã vào Emacs. Ví dụ, Beagle có thể lập chỉ mục các tệp C++/C#, sẽ cập nhật chỉ mục của nó bất cứ khi nào bạn lưu, trả về kết quả nhanh chóng và có ít nhất một giao diện Emacs (nguyên thủy) cho nó. Nó không được thiết kế đặc biệt cho mã nguồn, vì vậy, nó có thể cần một số tinh chỉnh để làm việc tốt như là một thay thế thẻ. Chúc may mắn với bất cứ điều gì bạn kết thúc với! – Ken

Trả lời

5

Dưới đây là một kịch bản tôi sử dụng:

#!/usr/bin/bash 
echo "Creating list of files to build tags..." 
find `pwd` -name '*.c' -o -name '*.h' > cscope_files 

echo "Building cscope and ctags databases..." 
cscope -bqki cscope_files 
ctags -eL cscope_files 

> cat cscope_files | wc -l 
10700 

Đối với 10700 file đó được so sánh với dự án của bạn, nhảy giữa các thẻ là tức thời. Khi bạn nhận thấy điều này xây dựng cả cơ sở dữ liệu cscope và etags. Tôi bắt đầu kịch bản này ở trên cùng của cây. Ngoài ra nếu đây là bất kỳ trợ giúp, đây là những keybindings trong tập tin .emacs.el của tôi.

(defun hide-cscope-buffer() 
    "Turn off the display of cscope buffer" 
    (interactive) 
    (if (not cscope-display-cscope-buffer) 
     (progn 
     (set-variable 'cscope-display-cscope-buffer t) 
     (message "Turning ON display of cscope results buffer.")) 
    (set-variable 'cscope-display-cscope-buffer nil) 
    (message "Toggling OFF display of cscope results buffer."))) 


(global-set-key [f9] 'cscope-find-this-symbol) 
(global-set-key [f10] 'cscope-find-global-definition-no-prompting) 
(global-set-key [f11] 'cscope-find-functions-calling-this-function) 
(global-set-key [f12] 'cscope-find-this-file) 
(global-set-key (kbd "C-t") 'cscope-pop-mark) 
(global-set-key (kbd "C-n") 'cscope-next-symbol) 
(global-set-key (kbd "C-p") 'cscope-prev-symbol) 
(global-set-key (kbd "C-b") 'hide-cscope-buffer) 
(global-set-key [S-f7] 'cscope-next-file) 
(global-set-key [S-f8] 'cscope-prev-file) 
(global-set-key [S-f9] 'cscope-find-this-text-string) 
(global-set-key [S-f10] 'cscope-find-global-definition) 
(global-set-key [S-f11] 'cscope-find-egrep-pattern)                               
(global-set-key [S-f12] 'cscope-find-files-including-file) 

Tôi không phải là người dùng emacs thường xuyên. Chúng được sử dụng bởi tôi khi tôi đang cố gắng chuyển sang emacs, nhưng sau đó trở lại vim, nơi tôi tìm cách để làm tất cả những điều mà tôi đã hạnh phúc làm trong các emacs.

Cập nhật: Đối với nhiều file thẻ trong một hệ thống phân cấp thư mục, hãy nhìn vào các Nhiều thẻ tập tin phần của article này.

+0

Sự nhảy giữa các thẻ không thực sự là vấn đề - hầu như ngay lập tức. Nó thực sự là khi tôi đang làm một thẻ tìm kiếm trên toàn bộ repo, với một tập tin duy nhất số lượng các trận đấu có thể rất lớn. Nếu tôi đi cho các phần nhỏ của repo, tôi thực sự cần phải chắc chắn nơi tôi đang tìm kiếm. Tôi đoán sẽ tốt hơn nếu bạn có một hệ thống phân cấp thẻ treelike - Tôi truy cập vào một cấp độ cao và nó sẽ lấy các thẻ từ bất kỳ thư mục con nào. – cristobalito

+0

Hãy xem liên kết trong câu trả lời ở trên. – Sudhanshu

+0

Tuyệt vời - sẽ cho phép điều đó! – cristobalito

4

tôi đã viết một số gói để giúp quản lý nhiều hits thẻ và nhiều tác phẩm TAGS:

http://www.emacswiki.org/emacs/EtagsSelect

http://www.emacswiki.org/emacs/EtagsTable

+0

Điều đó thực sự hữu ích - những thứ tuyệt vời. Nó chắc chắn sẽ giải quyết một số vấn đề tôi đã gặp phải. Tôi chắc chắn sẽ cho nó một chuyến đi khi tôi trở lại văn phòng. – cristobalito

+1

Tôi đã sử dụng etags-select trong một thời gian, và thật tuyệt vời (cảm ơn bạn, Scott!) Liên kết 'M-.' với' etags-select-find-tag' thay vì 'find-tag' và bạn ngay lập tức tốt hơn. – phils

2

Bạn có thể muốn có một cái nhìn tại GNU Global là tốt. Nó hỗ trợ C và C++ (cùng với Yacc, Java, PHP4 và assembly), vì vậy nó có thể hoạt động tốt cho C# (tôi chưa viết bất kỳ C# nào, vì vậy tôi cũng có thể nói vô nghĩa).

Nếu nó hoạt động, nó phải nhanh hơn đáng kể so với tệp TAGS thông thường.

1

Như đã đề cập, GNU Global khá tốt. Đây là một short introduction để sử dụng nó từ bên trong emacs.

Lưu ý, nếu dự án của bạn thực sự là 50K tệp (và 50 nghìn vị trí), lần chạy đầu tiên (để lập chỉ mục tất cả nội dung đó) có thể hơi chậm.

+0

Cảm ơn bạn đã nhận xét - Tôi thực sự đã thấy bài đăng đó trở lại (tôi đăng ký blog) nhưng đã quên. Bất kỳ ý tưởng nào cách nhanh nhất để cài đặt GNU Global trên Win7 là gì? – cristobalito

+1

trên cửa sổ? điều đó có thể khó; Tôi nhớ rằng gnu toàn cầu đối với win32 đã trở nên không rõ ràng vài năm trước ... có thể một hệ thống gắn thẻ khác như ctags (exuberant hay không) có thể dễ dàng hơn trong việc thiết lập nhưng chưa sử dụng chúng. – djcb

Các vấn đề liên quan