Dapatkah dukungan emacs pergi ke deklarasi fungsi di seluruh proyek?


12

Apakah emacs memiliki fungsi atau pustaka yang dapat memungkinkan pengguna untuk pergi ke deklarasi fungsi bahkan jika itu didefinisikan dalam file lain?

Jika demikian, bahasa apa yang ada dukungan untuk?

Inspirasi untuk pertanyaan ini, berasal dari artikel di bawah ini yang berbicara tentang beberapa alasan mengapa emacs tidak akan pernah dapat bersaing dengan IDE.

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


Cara emacs umumnya menangani ini adalah dengan mengandalkan eksternal, program yang dikompilasi (seperti dentang) untuk memahami kode sumber dengan cepat dan menanggapi pertanyaan yang dikirimkan melalui baris perintah. Lihatlah irony-clangtujuan ini. Apakah Anda membaca komentar di artikel?
Sean Allred

1
Fungsionalitas yang disediakan oleh alchemist.el, untuk elixir, atau omnisharp untuk C #, keduanya bergantung pada program eksternal untuk navigasi / refactoring / hal-hal ide yang cukup mirip dengan kebanyakan IDE di luar sana. (setidaknya untuk sebagian besar kasus penggunaan). Emacs tidak berada dalam bisnis yang sama dengan IDE, jadi saya pikir itu tidak masuk akal untuk mengatakan bahwa ia tidak akan pernah memiliki kesempatan bersaing.
Renan Ranelli

@RenanRanelli IDE adalah cara yang sama, kecuali kita harus melakukan integrasi secara manual alih-alih seseorang sudah melakukannya dan menyebutnya "IDE".
Tu Do

PADA 2019 hanya ada satu solusi yang harus Anda pertimbangkan menurut saya. Dan itu adalah rtags dengan penyelesaian perusahaan. Lupakan etag atau CEDET yang gembung dan tidak stabil. rtags menggunakan info waktu kompilasi untuk memberikan struktur LANGSUNG dari apa yang digunakan proyek Anda. global dkk mengerikan - dimuliakan "greps" yang melakukan banyak tebakan dan sering kali membawa Anda ke tempat yang salah. github.com/Andersbakken/rtags
RichieHH

Jawaban:


14

Anda dapat melompat ke definisi / referensi seluruh proyek sebesar pohon sumber kernel Linux (lebih dari 36k) dalam sekejap. Lihat panduan C / C ++ saya untuk detailnya. Untuk C / C ++, saya sarankan menggunakan GNU Global yang mendukung C, C ++, Yacc, Java, PHP4 dan assembly.

Kuncinya adalah, jika Anda ingin memiliki fitur IDE suatu bahasa, Anda harus menginstal plugin bahasa itu. Berikut adalah beberapa paket untuk bahasa dinamis yang saya ketahui:

  • Pengembangan web langsung: mode tusuk sate .
  • Javascript: Tern . Tetapi sebelum itu, ingatlah untuk menginstal js2-mode . Adapun apa yang js2-modedilakukan, lihat deskripsi ; tetapi pada dasarnya, js2-modeadalah parser Javascript lengkap yang menghasilkan AST untuk melakukan fitur IDE yang tepat. Jika Anda menginstal skewer-modedaripada yang Anda miliki js2-modesecara default, karena skewer-modetergantung padanya.
  • Python: elpy , lihat fitur IDE
  • Ruby: jubah menyediakan fitur-fitur ini:
  • Lompat ke definisi metode
  • Lompat ke super atau konstruktor yang disebut pada titik
  • Lompat ke modul atau kelas (asalkan memiliki setidaknya satu metode yang ditentukan)
  • Dokumentasi metode tampilan
  • Menampilkan informasi tentang metode yang dipanggil pada titik menggunakan ElDoc
  • Metode dan penyelesaian nama konstan

Anda juga dapat menggunakan ctagsuntuk mendukung banyak bahasa seperti skrip shell atau Tcl ...


Ada saran untuk javascript?
user2522280

@BarryG Ada Tern dan j2-modesaya edit dalam jawaban saya.
Tu Do

2
Saya ingin menunjukkan bahwa kami anacondamungkin solusi yang lebih spesifik untuk melompat definisi di Python.
PythonNut

@TuDo Anda telah memasukkan daftar fitur Robe di bawah ESS.
Dmitry

Untuk C ++, ada juga rtags dan ycmd . Saya menggunakan ycmd, yang juga berfungsi dengan misalnya Python, C #, Go dan bahasa lainnya. Saya menggunakan dumb-jump dan counsel-rg sebagai back-back atau untuk menunjukkan penggunaan atau komentar / dokumen yang menyebutkan simbol.
unhammer

18

Saya mengalami masalah yang sama dengan emacs, jadi saya membuat Dumb Jump . Saya mencoba banyak solusi yang disebutkan dalam jawaban yang diterima, tetapi saya selalu mengalami satu atau lebih masalah berikut:

  • Solusi hanya berfungsi untuk satu bahasa pemrograman
  • Solusi diperlukan file indeks (TAG) atau proses persisten

Saya sangat menginginkan solusi yang "baru saja bekerja" dan tidak memerlukan penyesuaian atau pengaturan. Yaitu, saya ingin mengkloning repo acak di Github dan menavigasi di sekitarnya seperti proyek saya yang lain.

Saat ini Dumb Jump memiliki dukungan dasar untuk:

  • JavaScript
  • Emacs Lisp
  • Python
  • Pergilah
  • PHP
  • Rubi
  • Faust
  • R
  • Lua
  • Karat
  • ... dan banyak lagi

Ini tersedia melalui masalah MELPA dan GitHub dan PR lebih dari diterima.


4

Solusi utama untuk ini dalam emacs adalah menggunakan file TAGS, yang dibuat oleh program seperti etags atau gtags. Saya sendiri menggunakan (dan merekomendasikan) ctag riang, dan etag-select.el untuk membantu Anda mempersempit tujuan ketika simbol pencarian terletak di beberapa tujuan. Bahasa yang didukung cukup banyak, lihat manual masing-masing alat. Bahkan ada dukungan untuk menambahkan bahasa Anda sendiri, di mana Anda dapat memberikan ekspresi reguler yang menginstruksikan ctag bagaimana mengisolasi tag yang Anda minati.


1
Oh! Bagaimana saya bisa melupakan tagfiles? ctags -e -R *dari direktori root akan mengaturnya untuk Anda.
Sean Allred

apakah ini solusi yang dapat diterima ketika proyek Anda memiliki banyak dependensi (seperti proyek web dev javascript yang lebih baru)?
Rudolf Olah

Jumlah dependensi itu sendiri bukanlah suatu halangan. Anda dapat memiliki satu file tag besar yang menggabungkan banyak perpustakaan yang berbeda; Saya melakukan ini selama bertahun-tahun, doa perintah ctag sepele melakukan ini. Atau yang sekarang saya sarankan adalah memiliki file tag terpisah per ketergantungan; emacs cukup pintar untuk memuat banyak file tag. Untuk mempermudah ini, cari etags-table.el, yang membantu memuat grup file tag per proyek.
InHarmsWay
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.