2013-06-27 13 views
16

Số Ctager không hoạt động tốt với Ruby, bạn có thể thấy có rất nhiều hack trong mã ruby.c và về cơ bản nó không nhận ra nhiều trường hợp. Một trong những quan trọng nhất là bit này:Bạn có biết một máy phát ctags thay thế cho Ruby

class SomeModule::SomeClass 
end 

Ctags tạo:

SomeModule someclass.rb /^class SomeModule::SomeClass$/;" c 

đó là sai. Mục nhập chính xác và dự kiến ​​là:

SomeClass someclass.rb /^class SomeModule::SomeClass$/;" c 

Điều này rất hạn chế. Có một số bản vá lỗi cho các thẻ có sẵn không hoạt động, ví dụ: https://github.com/xtao/overlay/blob/master/dev-util/ctags/files/ctags-5.5.4-ruby-classes.patch nhưng nhìn vào codebase ruby ​​ctags, điều này thực sự cần viết lại hoàn toàn.

Vì vậy, tôi đã chơi với tùy chọn khác là https://github.com/rdoc/rdoc-tags hoạt động đẹp hơn, nhưng chậm. Tôi có nghĩa là thực sự SLOW. Tạo thẻ trên dự án của tôi là 2 giây với ctags nhưng một giờ bằng công cụ này. Có thật không.

Tôi đã tìm thấy một dự án cũ đã phân tích cú pháp Ruby trên chính nó và tạo thẻ, nhưng nó chỉ dành cho Ruby 1.8. Đó là chậm hơn so với ctags, nhưng không phải là xấu.

Vì vậy, tôi đang tìm kiếm một số lựa chọn thay thế. Bạn có biết về bất kỳ máy phát ctash ruby ​​hoạt động nào khác cung cấp cho bạn đầu ra thích hợp và nhanh không?

Cảm ơn!

Chỉnh sửa: Tôi đã tìm thấy dự án rất đẹp mà hoạt động với Ruby 1.9+ và chính xác và nhanh chóng. Tôi khuyên bạn nên nó:

https://github.com/tmm1/ripper-tags

+0

Hoặc có thể nếu bạn biết nhanh và làm việc phân tích cú pháp của Ruby | lexer dễ sử dụng để tôi có thể viết trình tạo thẻ của riêng tôi. Nên làm việc với Ruby 1.8-2.0. – lzap

+1

Lưu ý phụ về việc sử dụng 'lớp SomeModule :: SomeClass': nó không tạo ra một phạm vi lexcical với' SomeModule' làm cha mẹ, bạn nên tránh nó - xem http://stackoverflow.com/questions/15119724/ruby-lexical- phạm vi-vs-thừa kế – tight

Trả lời

14

ctags exuberant ra khỏi hộp không làm một số điều hữu ích:

  • Nó không đối phó với:

    module A::B 
    
  • Thẻ không gắn thẻ (ít nhất một số) phương thức "toán tử" như ‘==’

  • Thẻ không hỗ trợ thẻ đủ điều kiện, —type=+

  • Nó không xuất thẻ cho hằng số hoặc thuộc tính.

Có bản vá nhưng chỉ dành cho phiên bản 5.5 và không hoạt động nữa.

dự án khác:

Source

+0

Vâng, tôi đã thấy điều này, nhưng tôi không thể tìm thấy bản vá cụ thể này. Tôi chỉ có một cho 5.5 phiên bản mà không làm việc ở tất cả. – lzap

+0

Tôi đã có thẻ rdoc. Tôi đã thêm liên kết. Kiểm tra nó ra. –

+0

Cảm ơn bạn đã liên kết, tôi đã thử nó và chậm chạp như địa ngục. Ví dụ. phân tích cú pháp "con rối" dự án = 1 giờ. :-( – lzap

15

Ripper-thẻ nỗ lực không giải quyết tất cả những gì được mô tả ở đây. Nó dựa trên bộ phân tích cú pháp chính thức của Ruby cũng khá nhanh. https://github.com/tmm1/ripper-tags

gem install ripper-tags 
cd your_project/ 
ripper-tags -R 

Nó cũng hỗ trợ Emacs.

+2

Ok chờ đợi nhiều khuyến nghị hơn, nhưng tôi khá hài lòng với các thẻ ripper, tôi sẽ chấp nhận câu trả lời của riêng mình mà không gây nhầm lẫn cho người đọc: -D – lzap

+0

ripper-tags cũng không lập chỉ mục các mô-đun lồng nhau: https://github.com/tmm1/ripper-tags/issues/48 –

+2

Yay! Gần đây, các thẻ ripper được thêm hỗ trợ cho lồng nhau/hằng số https://github.com/tmm1/ripper-tags/pull/44 –

1

Một miếng vá có sẵn như là của 2013-02

công cụ tạo thẻ rspec sẽ không nhận ra đúng describe khối bắt đầu bằng semicolor (:some-method), nhưng khác hơn thế, nó rất tuyệt.

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