Có cách nào để in định nghĩa của hàm hiện có trong Emacs không?


10

Tôi muốn xem định nghĩa của một chức năng hiện có trong Emacs. Điều này có thể không?

Tôi đã thử C-h d function-name RET, nhưng nó chỉ trả về chuỗi tài liệu cho hàm chứ không phải chính hàm thực.

Tôi đang nghĩ một cái gì đó tương tự như typelệnh của bash , sẽ trả về toàn bộ định nghĩa của hàm.

(Cốt truyện Lúng túng: Tôi vô tình đã viết hơn một chức năng làm việc tại tôi .emacstập tin với một phiên bản không làm việc Chức năng ban đầu vẫn còn trong bộ nhớ Và nó hoạt động Nhưng tôi không thể cho.! Cuộc sống của tôi nhớ làm thế nào tôi đã làm nó.)


1
Nếu bạn đã tiếp tục .emacsmở trong một bộ đệm, hãy thử hoàn tác như điên.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


10

Nếu bạn nhập C-h f function-name RET, bạn sẽ nhận được tài liệu của hàm, với một liên kết đến nguồn hàm nếu có.

Tôi không nghĩ rằng có một chức năng Lisp dễ dàng mà bạn có thể gọi để lấy vị trí của nguồn của chức năng; việc tra cứu khá đan xen với phần còn lại của hệ thống trợ giúp. find-lisp-object-file-namelà chức năng chính cố gắng tìm ra nguồn gốc của chức năng.

Trừ khi function-namelà một nguyên thủy (được xác định trong nguồn C của Emacs), bạn có thể thấy mã của nó với (symbol-function 'function-name), hoặc nói chung hơn (tên hàm chức năng gián tiếp). Tuy nhiên, nếu hàm được biên dịch byte, tất cả những gì bạn sẽ thấy là mã byte của nó.


1
Cảm ơn bạn! (symbol-function 'function-name)chính xác là những gì tôi đang tìm kiếm! Ngoài ra, có vẻ như nếu bạn thực sự cần nguồn đến các hàm C, bạn có thể lấy nó bằng thông tin từ câu trả lời của Oleg.
Micah R Ledbetter

Cảm ơn! Ngoài ra, nếu chức năng được tự động tải, bạn cần gọi nó một lần trước khi bạn có thể lấy mã nguồn.
Gerhard Burger

3

M-x find-function trả về định nghĩa của hàm gần điểm.

Từ tài liệu:

Tìm tệp nguồn chứa định nghĩa của hàm gần điểm (được chọn bởi `function-call-at-point ') trong bộ đệm và đặt điểm trước định nghĩa. Đặt dấu trước khi di chuyển, nếu bộ đệm đã tồn tại.

Nếu bạn muốn bao gồm cả các hàm được triển khai trong C, bạn phải thêm các mục sau vào tệp .emacs của mình:

(setq find-function-C-source-directory (concat (getenv "emacs_home") "/path/to/source-dir"))

Hừm. Điều này là tốt để biết, nhưng tôi nghĩ rằng nó chỉ hoạt động cho các chức năng tích hợp, đó không phải là những gì tôi đang tìm kiếm.
Micah R Ledbetter

1
Nó cũng hoạt động cho các chức năng do người dùng xác định
Oleg Pavliv
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.