Hỗ trợ emacs có thể đi đến khai báo chức năng trong toàn bộ dự án không?


12

Các emacs có một chức năng hoặc thư viện có thể cho phép người dùng đi đến khai báo hàm ngay cả khi nó được định nghĩa trong một tệp khác không?

Nếu vậy, những ngôn ngữ có hỗ trợ cho?

Cảm hứng cho câu hỏi này, xuất phát từ bài viết dưới đây nói về một số lý do tại sao emacs sẽ không bao giờ có thể cạnh tranh với IDE.

http://henrikwarne.com/2012/06/17/programmer-productivity-emacs-versus-intellij-idea/


Cách emacs thường xử lý việc này là bằng cách dựa vào các chương trình được biên dịch bên ngoài (như clang) để hiểu mã nguồn nhanh chóng và trả lời các truy vấn được truyền qua dòng lệnh. Kiểm tra irony-clangđến cuối này. Bạn đã đọc các bình luận về bài viết?
Sean Allred

1
Các chức năng được cung cấp bởi alchemist.el, cho elixir hoặc omarnarp cho C #, cả hai đều dựa vào các chương trình bên ngoài để điều hướng / tái cấu trúc / công cụ ide-ish gần giống với hầu hết các IDE ngoài kia. (ít nhất là cho hầu hết các trường hợp sử dụng). Emacs không cùng ngành với IDE, vì vậy tôi không nghĩ rằng điều đó hợp lý để nói rằng nó sẽ không bao giờ có cơ hội cạnh tranh.
Renan Ranelli 19/03/2015

@RenanRanelli IDE cũng giống như vậy, ngoại trừ chúng ta phải thực hiện tích hợp thủ công thay vì ai đó đã làm điều đó và gọi nó là "IDE".
Từ Đô

Năm 2019 chỉ có một giải pháp bạn nên xem xét theo ý kiến ​​của tôi. Và đó là rtags với hoàn thành công ty. Quên etags hoặc CEDET cồng kềnh, không ổn định. rtags sử dụng thông tin thời gian biên dịch để cung cấp cấu trúc TRỰC TIẾP cho những gì dự án của bạn đang sử dụng. toàn cầu et al là khủng khiếp - họ được tôn vinh "greps" mà làm rất nhiều phỏng đoán và thường xuyên đưa bạn đến sai địa điểm. github.com/Andersbakken/rtags
RichieHH

Câu trả lời:


14

Bạn có thể chuyển đến bất kỳ định nghĩa / tham chiếu nào của toàn bộ dự án lớn như cây nguồn Linux (hơn 36k) ngay lập tức. Xem hướng dẫn C / C ++ của tôi để biết chi tiết. Đối với C / C ++, tôi khuyên bạn nên sử dụng GNU Global hỗ trợ C, C ++, Yacc, Java, PHP4 và lắp ráp.

Điều quan trọng là, nếu bạn muốn có các tính năng IDE của một ngôn ngữ, bạn phải cài đặt plugin của ngôn ngữ đó. Dưới đây là một số gói cho các ngôn ngữ động mà tôi biết:

  • Phát triển web trực tiếp: chế độ xiên .
  • Javascript: Chim nhạn . Nhưng trước đó, hãy nhớ cài đặt chế độ js2 . Đối với những gì js2-modekhông, xem mô tả ; nhưng về bản chất, js2-modelà một trình phân tích cú pháp Javascript hoàn chỉnh tạo ra AST để thực hiện các tính năng IDE phù hợp. Nếu bạn cài đặt skewer-modehơn bạn sẽ có js2-modetheo mặc định, vì skewer-modephụ thuộc vào nó.
  • Python: elpy , xem các tính năng IDE
  • Ruby: áo choàng cung cấp các tính năng này:
  • Chuyển đến định nghĩa phương thức
  • Nhảy tới siêu hoặc một hàm tạo được gọi tại điểm
  • Chuyển đến một mô-đun hoặc lớp (miễn là nó có ít nhất một phương thức được xác định)
  • Hiển thị tài liệu phương pháp
  • Hiển thị thông tin về phương thức được gọi tại điểm bằng ElDoc
  • Phương pháp và tên liên tục hoàn thành

Bạn cũng có thể sử dụng ctagsđể hỗ trợ nhiều ngôn ngữ như shell script hoặc Tcl ...


Bất kỳ đề xuất bộ cho javascript?
dùng2522280

@BarryG Có Ternj2-modetôi đã chỉnh sửa trong câu trả lời của mình.
Từ Đô

2
Tôi muốn chỉ ra rằng đó anacondacó thể là một giải pháp cụ thể hơn cho định nghĩa nhảy trong Python.
PythonNut

@TuDo Bạn đã đặt danh sách tính năng của Robe trong ESS.
Dmitry

Đối với C ++, cũng có rtagsycmd . Tôi sử dụng ycmd, cũng hoạt động với ví dụ Python, C #, Go và các ngôn ngữ khác. Tôi sử dụng dumb-jumplời khuyên-rg như một dự phòng hoặc để hiển thị cách sử dụng hoặc nhận xét / tài liệu đề cập đến một biểu tượng.
unhammer

17

Tôi gặp vấn đề tương tự với emacs, vì vậy tôi đã thực hiện Dumb Jump . Tôi đã thử nhiều giải pháp được đề cập trong câu trả lời được chấp nhận, nhưng tôi luôn gặp phải một hoặc nhiều vấn đề sau:

  • Giải pháp chỉ hoạt động cho một ngôn ngữ lập trình duy nhất
  • Giải pháp yêu cầu tệp chỉ mục (TAG) hoặc quá trình liên tục

Tôi rất muốn một giải pháp "chỉ hoạt động" và không yêu cầu tùy chỉnh hoặc thiết lập. Đó là, tôi muốn sao chép một repo ngẫu nhiên trên Github và điều hướng xung quanh nó như bất kỳ dự án nào khác của riêng tôi.

Ngay bây giờ Dumb Jump có hỗ trợ cơ bản cho:

  • JavaScript
  • Emacs Lisp
  • Con trăn
  • Đi
  • PHP
  • Hồng ngọc
  • Faust
  • R
  • Lua
  • Rỉ
  • ...và hơn thế nữa

có sẵn thông qua các vấn đề và PR của MELPA và GitHub được chào đón nhiều hơn.


4

Giải pháp chính cho vấn đề này trong emacs là sử dụng các tệp TAGS, được tạo bởi các chương trình như etags hoặc gtags. Bản thân tôi sử dụng (và đề xuất) các ctags quá mức và etags-select.el để giúp bạn thu hẹp điểm đến khi biểu tượng tìm kiếm nằm ở nhiều đích. Các ngôn ngữ được hỗ trợ khá nhiều, xem hướng dẫn sử dụng của từng công cụ. Thậm chí còn có hỗ trợ để thêm ngôn ngữ của riêng bạn, theo đó bạn có thể cung cấp một biểu thức chính quy hướng dẫn ctags cách cô lập các thẻ bạn quan tâm.


1
Oh! Làm thế nào tôi có thể quên về tagsfiles? ctags -e -R *từ thư mục gốc sẽ thiết lập nó cho bạn.
Sean Allred

Đây có phải là một giải pháp chấp nhận được khi dự án của bạn có nhiều phụ thuộc (chẳng hạn như các dự án phát triển web javascript gần đây)?
Rudolf Olah

Số lượng phụ thuộc không phải là một trở ngại. Bạn có thể có một tệp thẻ lớn tổng hợp nhiều thư viện khác nhau; Tôi đã làm điều này trong nhiều năm, lệnh gọi ctags tầm thường làm điều này. Hoặc những gì tôi khuyên bây giờ là có một tệp thẻ riêng cho mỗi phụ thuộc; emacs đủ thông minh để tải nhiều tập tin thẻ. Để dễ dàng điều này, tìm kiếm etags-table.el, giúp tải các nhóm tệp thẻ cho mỗi dự án.
InHarmsWay
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.