Bagaimana cara menggunakan Emacs untuk mencari fungsi dengan Python?

22

Apa cara termudah untuk mengkonfigurasi Emacs agar dapat mencari di mana suatu fungsi didefinisikan? Saya ingin menyorotnya di Emacs dan tekan tombol kombo untuk mencari di mana sumber fungsi tersebut.

Bisakah Anda juga mencari tahu di mana fungsi tertentu sedang digunakan?

Ini mudah dilakukan di PyCharm, tetapi bisakah juga dengan mudah dilakukan di Emacs?

Low Kian Seong
sumber

Jawaban:

14

Apakah Anda mencoba Elpy ? Itu mengikat elpy-goto-definitionkunci M-..
Jika Anda memiliki Emacs baru-baru ini, saya pikir Anda juga dapat melompat kembali dengan xref-pop-marker-stack( M-,). Elpy memiliki beberapa fitur bagus lainnya.

Untuk menginstalnya, ikuti instruksi di tautan.

bmag
sumber
12

Saya menggunakan mode Jedi untuk Python dan saya sangat senang dengannya. Tidak hanya melakukan pencarian fungsi secara akurat, tetapi juga menyelesaikan fungsi dengan definisi yang benar bahkan dalam situasi yang rumit (seperti warisan). Hadir dengan lengkapi otomatis untuk boot. http://tkf.github.io/emacs-jedi/latest/

Achintya Sharma
sumber
8

Fitur PyCharm yang Anda sebutkan adalah salah satu favorit saya, dan salah satu hal pertama yang saya cari dalam mencoba mengganti PyCharm sepenuhnya dengan Emacs (yang saya senang mengatakan saya bisa melakukannya).

Seperti disebutkan dalam jawaban lain, elpypaket memiliki fitur ini (selain banyak fitur IDE berguna lainnya ). Namun, jika Anda menggunakan elpy-goto-definitionuntuk mencari simbol pada titik, Anda akan menemukan cepat atau lambat bahwa dalam beberapa kasus di mana PyCharm akan berhasil menemukan apa yang Anda cari, elpytidak akan. Seperti yang dikatakan para dokter:

backend tidak selalu dapat mengidentifikasi simbol apa yang ada di titik Terutama setelah beberapa tipuan, mereka pada dasarnya tidak punya harapan untuk menebak dengan benar, jadi mereka tidak

Dalam hal ini, memohon elpy-goto-definitiontidak akan melakukan apa pun dan menampilkan sedikit pesan kesalahan di area gema. Ketika ini terjadi, tentu saja Anda masih ingin menemukan apa yang Anda cari, dan elpytidak membuat Anda menggantung. Dalam situasi seperti ini saya selalu menggunakan C-c C-s( elpy-rgrep-symbol) rgrepuntuk simbol pada titik dalam proyek apa pun saya berada. Setidaknya bagi saya, hal yang saya cari kurang lebih selalu muncul dalam rgrephasil. Sebenarnya, saya pikir ini mirip dengan apa yang dilakukan PyCharm juga: jika Anda mencoba mencari definisi sesuatu dan PyCharm tidak yakin di mana itu didefinisikan, Anda akan dapat memilih dari daftar. Saya sebenarnya lebih suka elpyimplementasi, karena daripada daftar sementara yang hilang ketika Anda pergi ke opsi pertama,elpy-rgrep-symbol akan membiarkan daftar kemungkinan terbuka di buffer lain sehingga Anda dapat melompat-lompat di antara mereka jika perlu.

Karena alur kerja saya hampir selalu untuk panggilan pertama elpy-goto-definitiondan jika gagal, panggilan elpy-rgrep-symbol, saya memutuskan untuk meretas bersama fungsi sederhana yang hanya memanggil elpy-rgrep-symbolsecara otomatis jika elpy-goto-definitiongagal. Fungsi itu di bawah:

(defun goto-def-or-rgrep ()
  "Go to definition of thing at point or do an rgrep in project if that fails"
  (interactive)
  (condition-case nil (elpy-goto-definition)
    (error (elpy-rgrep-symbol (thing-at-point 'symbol)))))

Lalu saya ikat ini ke M-.(pengikatan default untuk elpy-goto-definition).

(define-key elpy-mode-map (kbd "M-.") 'goto-def-or-rgrep)

Dengan cara ini saya dapat menggunakan salah satu fitur PyCharm favorit saya di editor favorit saya. Saya tahu ini semacam pertanyaan lama dan Anda mungkin sudah memecahkan masalah ini atau pindah, tetapi saya harap Anda atau orang lain menganggap ini berguna!

Elethan
sumber
4

python-mode.el menyediakan perintah py-find-definition- lihat di menu Help.

Andreas Röhler
sumber
6
Perhatikan bahwa python-mode.el harus diinstal. Ini bukan yang python-modedimiliki Emacs secara default. ( stackoverflow.com/questions/11363089/… )
Brian Z
2

M- bekerja dalam anaconda-mode (yang saya beralih setelah mengalami masalah dengan elpy).

Perhatikan bahwa Anda memerlukan lingkungan python yang tepat, dalam kasus saya, saya melakukan hal berikut: - mkvirtualenv someenv - python setup.py developuntuk semua modul yang dikembangkan atau digunakan (atau lebih memilih untuk menjangkau sumber daripada versi yang diinstal) - M-x venv-workon someenvuntuk mengaktifkan jalur di emacs.

Kemudian saya konfigurasikan anaconda-modeuntuk aktif setiap kali saya mengedit python dan voila, M-.berfungsi

Mekk
sumber
1

Pertanyaan bagus, itu tidak tersedia di luar kotak dan merupakan fitur praktis dari IDE yang penuh sesak nafas. Saya melakukannya dengan cscope, dengan antarmuka helm yang bagus:  http://wikemacs.org/wiki/Python#cscope Dapat menjawab pertanyaan seperti "di mana simbol ini didefinisikan? Di mana ia digunakan?".

ps: dalam mode kejahatan kita bisa pergi ke definisi simbol dalam file yang sama dengan gd.

Ehvince
sumber
Saya percaya gdpada kejahatan hanya menemukan kemunculan pertama simbol dalam file (terlepas dari doktring: "Pergi ke definisi atau kemunculan pertama simbol di bawah titik.")
Gordon Gustafson
0

M-.yang pasti elpy-goto-definitionakan melakukan trik. Gunakan M-*akan memungkinkan Anda melompat kembali ke lokasi sebelumnya di buffer. Ini memungkinkan Anda untuk dengan cepat memeriksa sesuatu dan kembali ke lokasi sebelumnya.

Saya juga C-c C-osering menggunakan ( elpy-occur-definitions). Ini akan membuka jendela dengan semua kelas dan fungsi adalah buffer saat ini. Dari buffer itu, menekan Enterakan mendaratkan Anda pada definisi dalam kode sumber.

pengguna989762
sumber
Sebenarnya, AFAICT, M-.terikat xref-find-definitionsdan elpy-goto-definitiontidak pada tombol apa pun secara default (meskipun pada menu). Menemukan definisi dalam paket situs sepertinya tidak berfungsi sama sekali.
Robert P. Goldman
0

Jedi adalah pustaka analisis autocompletion / static yang mengagumkan untuk Python. Saya sering menggunakannya ketika saya menggunakan vim.

Sama seperti mesin pelengkapan otomatis golang (yaitu gocode) bekerja baik untuk vim dan emacs, mesin Jedi yang sama berfungsi baik untuk vim dan emacs .

phye
sumber