Arahkan ke kode sumber fungsi dan variabel bawaan

9

Sepanjang hari saya terus-menerus menggunakan C-h fatau C-h v( describe-functiondan describe-variable) mencari dokumentasi untuk fungsi dan variabel. Lebih sering daripada tidak, jika saya tidak mendapatkan semua informasi yang saya butuhkan, saya akan mengklik tautan file di akhir:

some-random-command is an interactive compiled Lisp function in `some-mode.el'.

dan arahkan ke kode sumber. Ini berfungsi untuk paket yang diinstal, tetapi sepertinya tidak berfungsi untuk yang sudah ada. Sebagai contoh, di bagian atas halaman bantuan untuk perintah yang describe-functionsaya dapatkan adalah:

describe-function is an interactive compiled Lisp function.

tanpa tautan ke kode sumber. Apakah ada cara untuk dengan cepat menavigasi ke kode sumber paket bawaan?

Saya tahu saya dapat menemukan kode sumber dalam mis. /usr/share/emacs/24.5/lisp,, Dan menemukan sejumlah cara untuk mengakses direktori itu dengan cepat, tetapi saya ingin tahu apakah ada cara cepat dan mudah untuk menavigasi ke fungsi / definisi variabel bawaan di Kode sumber. Terima kasih!

Elethan
sumber
5
M-x find-function; M-x find-variable; M-x find-face; M-x find-library. Saya selalu menggunakan instalasi penuh Emacs sehingga saya memiliki akses ke semuanya, dan setelah membangun Emacs saya sendiri, saya menyalin kode sumber-C dan mengatur lokasinya sehingga saya dapat menemukan definisi kode Sumber-C juga. Lihat variabel find-function-C-source-directoryuntuk mengatur lokasi kode sumber-C setelah Anda menyalinnya.
hukum
1
Menggunakan cabang master Emacs, saya mendapatkan yang berikut dengan M-x describe-function: menggambarkan-fungsi adalah fungsi Lisp kompilasi autoloaded interaktif di 'help-fns.el'. Dan dari sana saya dapat mengklik (atau menekan enter) help-fns.eldan kemudian dipindahkan ke bagian kode yang berlaku. Mungkin Anda memiliki beberapa versi Emacs, dan yang Anda gunakan saat ini tidak menginstal semua kode sumber?
hukum
Jika Anda mendapatkan perilaku itu ketika Anda mulai menggunakan Emacs emacs -Q(tidak ada file init), atau jika Anda dapat mengolahnya dengan resep yang dimulai dengan emacs -Q(misalnya mengatakan perpustakaan apa yang Anda muat dan bagaimana Anda memuatnya dll), maka silakan pertimbangkan untuk mengajukan bug melaporkan: M-x report-emacs-bug.
Drew
4
nb IIRC, paket Emacs untuk Debian (mungkin juga OS lain) memisahkan .elfile (diperlakukan sebagai opsional) dari .elcfile (wajib), sehingga Anda perlu menginstal satu atau lebih paket tambahan untuk mendapatkannya. Jika Anda memperoleh Emacs dari manajer paket OS Anda, mungkin ini menjelaskannya.
phils
1
Anda dapat melakukan grep (atau utilitas pencarian lainnya) untuk nama binari (dengan izin yang dapat dieksekusi) - emacs atau emacsclient - dan lihat di mana mereka berada di hard drive Anda. Saya menyimpan milik saya sepenuhnya secara terpisah di folder khusus mereka sendiri. Sebagai contoh, saya memiliki versi yang dikirimkan dengan sistem operasi saya - /usr/bin/emacsdan /usr/bin/emacsclient, dan saya memiliki versi yang dikemas dengan baik di folder aplikasi OSX yang berakhiran .app - yaitu, /Applications/Emacs.app(di dalam Emacs.app, adalah binari dan semua file kode sumber).
hukum

Jawaban:

7

Alasan Anda kadang-kadang melihat "fungsi interaktif Lisp yang dikompilasi" (atau juga untuk variabel) tanpa nama file adalah bahwa fungsi tersebut diambil dari file byte-yang dikompilasi dan file sumber Elisp yang sesuai tidak ada. Untuk menunjukkan kepada Anda kode sumber, Emacs harus dapat menemukan kode sumber.

Banyak distribusi mengirimkan file sumber Lisp dalam paket terpisah, karena tidak setiap pengguna menginginkannya dan mereka berukuran besar. Misalnya, pada Debian dan turunannya, instal emacs24-el. Jika Anda membuat Emacs dari sumber, make installsalin sumber Elisp.

Jika Anda ingin melihat kode sumber primitif (subrutin dan formulir khusus), Emacs harus dapat menemukan sumber C. Biasanya tidak tersedia kecuali Anda menginstal dari sumber.

Emacs mencari sumber Lisp di direktori di load-path. Untuk fungsi atau variabel yang diambil dari foo.elc,file dapat foo.elatau foo.el.gz. Emacs mencari sumber C di bawah source-directory, dan meminta Anda untuk direktori yang berbeda jika tidak menemukan file sumber.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Walaupun saya berani bersumpah bahwa saya membangun versi Emacs ini dari sumber, ketika saya menyebutnya M-x emacs-versionmengatakan "dimodifikasi oleh Debian" pada akhirnya, yang akan menunjukkan bahwa saya menggunakan versi dari manajer paket OS saya (Ubuntu), kan?
elethan
@elethan Jika dikatakan "dimodifikasi oleh Debian" maka Anda menginstal atau setidaknya membangun paket Ubuntu. Anda mungkin membuatnya dari sumber (mungkin karena Anda menginginkan versi yang lebih baru daripada yang ada di rilis Ubuntu Anda). Apakah Anda berlari /usr/bin/emacsatau tidak /usr/local/bin/emacs?
Gilles 'SANGAT berhenti menjadi jahat'
1

Jika Anda mencari cara untuk melompat dengan cepat ke kode sumber, ada juga find-function-at-pointdan find-variable-at-pointyang akan melompat ke definisi simbol di bawah kursor - Anda dapat mengikatnya ke Ch Cf dan Ch Cv, misalnya.

Atau Anda bisa mencoba elisp-slime-nav , yang menggunakan M-. untuk melompat ke definisi simbol, dan M-, untuk kembali - itu menavigasi ke variabel, fungsi, perpustakaan, dan wajah - https://github.com/purcell/elisp-slime-nav/

Brian Burns
sumber