Apakah ada cara untuk mencetak definisi fungsi yang ada di Emacs?

10

Saya ingin melihat definisi fungsi yang ada di Emacs. Apakah ini mungkin?

Saya sudah mencoba C-h d function-name RET, tetapi hanya mengembalikan string dokumentasi untuk fungsi, bukan fungsi sebenarnya.

Saya sedang memikirkan sesuatu yang mirip dengan typeperintah bash , yang akan mengembalikan seluruh definisi fungsi.

(Cerita memalukan yang memalukan: Saya tidak sengaja menulis tentang fungsi yang bekerja di .emacsfile saya dengan versi yang tidak berfungsi. Fungsi aslinya masih ada di memori! Dan itu berhasil! Tetapi saya tidak bisa seumur hidup mengingat bagaimana saya melakukannya.)

Micah R Ledbetter
sumber
1
Jika Anda terus .emacsmembuka di buffer, coba undur seperti orang gila.
Gilles 'SO- stop being evil'

Jawaban:

10

Jika Anda mengetik C-h f function-name RET, Anda akan mendapatkan dokumentasi fungsi, dengan tautan ke sumber fungsi jika tersedia.

Saya tidak berpikir ada fungsi Lisp mudah yang dapat Anda panggil untuk mengambil lokasi sumber fungsi; pencarian cukup terkait dengan sisa sistem bantuan. find-lisp-object-file-nameadalah fungsi utama yang mencoba mencari tahu di mana sumber fungsi tersebut.

Kecuali jika function-nameprimitif (didefinisikan dalam sumber C Emacs), Anda dapat melihat kodenya dengan (symbol-function 'function-name), atau lebih umum (fungsi-nama fungsi tidak langsung). Namun, jika fungsi itu byte-dikompilasi, semua Anda akan melihat bytecode-nya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Terima kasih! (symbol-function 'function-name)persis apa yang saya cari! Juga, sepertinya jika Anda benar-benar membutuhkan sumber ke fungsi C Anda bisa mendapatkannya menggunakan informasi dari jawaban Oleg.
Micah R Ledbetter
Terima kasih! Juga, jika fungsi ini dimuat secara otomatis, Anda harus memanggilnya sekali sebelum Anda bisa mendapatkan kode sumber.
Gerhard Burger
3

M-x find-function mengembalikan definisi fungsi di dekat titik.

Dari dokumentasi:

Menemukan file sumber yang berisi definisi fungsi dekat titik (dipilih oleh `fungsi-disebut-pada-titik ') dalam buffer dan menempatkan titik sebelum definisi. Tetapkan tanda sebelum bergerak, jika buffer sudah ada.

Jika Anda ingin menyertakan juga fungsi yang diimplementasikan dalam C, Anda harus menambahkan yang berikut ke file .emacs Anda:

(setq find-function-C-source-directory (concat (getenv "emacs_home") "/path/to/source-dir"))
Oleg Pavliv
sumber
Hmm. Ini bagus untuk diketahui, tetapi saya pikir ini hanya berfungsi untuk fungsi bawaan, yang bukan yang saya cari.
Micah R Ledbetter
1
Ini berfungsi untuk fungsi yang ditentukan pengguna juga
Oleg Pavliv