Điều hướng đến mã nguồn của các hàm và biến tích hợp


9

Trong suốt cả ngày, tôi liên tục sử dụng C-h fhoặc C-h v( describe-functiondescribe-variable) để tìm tài liệu cho các hàm và biến. Thường xuyên hơn không, nếu tôi không nhận được tất cả thông tin tôi cần, tôi sẽ nhấp vào liên kết tệp ở cuối:

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

và điều hướng đến mã nguồn. Điều này hoạt động cho các gói đã cài đặt, nhưng dường như không hoạt động cho các gói tích hợp. Ví dụ: ở đầu trang trợ giúp cho lệnh describe-functiontất cả những gì tôi nhận được là:

describe-function is an interactive compiled Lisp function.

không có liên kết đến mã nguồn. Có cách nào để nhanh chóng điều hướng đến mã nguồn của gói tích hợp không?

Tôi biết rằng tôi có thể tìm mã nguồn trong ví dụ, /usr/share/emacs/24.5/lispvà đưa ra bất kỳ số cách nào để truy cập thư mục đó một cách nhanh chóng, nhưng tôi tò mò liệu có cách nào nhanh chóng và dễ dàng để điều hướng đến một định nghĩa hàm / biến tích hợp trong mã nguồn. Cảm ơn bạn!


5
M-x find-function; M-x find-variable; M-x find-face; M-x find-library. Tôi luôn sử dụng bản cài đặt đầy đủ của Emacs để tôi có quyền truy cập vào mọi thứ và ngay sau khi xây dựng Emacs của riêng mình, tôi sao chép mã nguồn C và đặt vị trí của nó để tôi cũng có thể tìm thấy định nghĩa mã nguồn C. Xem biến find-function-C-source-directoryđể đặt vị trí của mã nguồn C sau khi bạn sao chép nó.
luật

1
Sử dụng nhánh chính của Emacs, tôi nhận được như sau với M-x describe-function: description-function là một hàm Lisp được biên dịch tự động tương tác trong 'help-fns.el'. Và từ đó tôi có thể nhấp vào (hoặc nhấn enter) help-fns.elvà sau đó được chuyển đến phần áp dụng của mã. Có lẽ bạn có nhiều phiên bản Emacs và phiên bản bạn đang sử dụng hiện tại chưa cài đặt tất cả mã nguồn?
luật

Nếu bạn có hành vi đó khi bạn khởi động Emacs bằng cách sử dụng emacs -Q(không có tệp init) hoặc nếu bạn có thể repro nó với một công thức bắt đầu bằng emacs -Q(ví dụ: nói thư viện nào bạn tải và cách bạn tải chúng, v.v.), thì hãy xem xét việc gửi lỗi báo cáo : M-x report-emacs-bug.
vẽ

4
nb IIRC, các gói Emacs cho Debian (cũng có thể là các HĐH khác) tách các .eltệp (được coi là tùy chọn) khỏi các .elctệp (bắt buộc), do đó bạn cần cài đặt một hoặc nhiều gói bổ sung để có được chúng. Nếu bạn đã nhận được Emacs từ trình quản lý gói hệ điều hành của mình, có lẽ điều này giải thích điều đó.
phils

1
Bạn có thể thực hiện một grep (hoặc tiện ích tìm kiếm khác) cho tên của các tệp nhị phân (có quyền thực thi) - emacs hoặc emacsclient - và xem chúng ở đâu trên ổ cứng của bạn. Tôi lưu trữ của tôi hoàn toàn riêng biệt trong thư mục riêng của họ. Ví dụ: tôi có phiên bản đi kèm với hệ điều hành của mình - /usr/bin/emacs/usr/bin/emacsclient, và tôi có một phiên bản được đóng gói độc đáo trong thư mục ứng dụng OSX kết thúc bằng .app - tức là /Applications/Emacs.app(bên trong Emacs.app, là các nhị phân và tất cả tập tin mã nguồn).
luật

Câu trả lời:


7

Lý do đôi khi bạn thấy hàm Lisp được biên dịch tương tác, có thể không có tên tệp là vì hàm này được tải từ tệp được biên dịch byte và không có tệp nguồn Elisp tương ứng. Để hiển thị cho bạn mã nguồn, Emacs phải có thể tìm mã nguồn.

Nhiều bản phân phối gửi các tệp nguồn Lisp trong một gói riêng biệt, bởi vì không phải người dùng nào cũng muốn chúng và chúng cồng kềnh. Ví dụ: trên Debian và các dẫn xuất, hãy cài đặt emacs24-el. Nếu bạn xây dựng Emacs từ nguồn, hãy make installsao chép các nguồn Elisp.

Nếu bạn muốn xem mã nguồn của nguyên thủy (chương trình con và các hình thức đặc biệt), Emacs cần có thể tìm thấy các nguồn C. Những thứ đó thường không có sẵn trừ khi bạn cài đặt từ nguồn.

Emacs tìm kiếm các nguồn Lisp trong các thư mục trong load-path. Đối với một chức năng hoặc biến được tải từ foo.elc,tệp có thể foo.elhoặc foo.el.gz. Emacs tìm kiếm các nguồn C bên dưới source-directoryvà nhắc bạn về một thư mục khác nếu nó không tìm thấy tệp nguồn.


Mặc dù tôi có thể đã thề rằng tôi đã xây dựng phiên bản Emacs này từ nguồn, khi tôi gọi M-x emacs-versionnó là "được sửa đổi bởi Debian", điều đó cho thấy rằng tôi đang sử dụng một phiên bản từ trình quản lý gói của hệ điều hành (Ubuntu), phải không?
elethan

@elethan Nếu nó nói rằng được sửa đổi bởi Debian Debian thì bạn đã cài đặt hoặc ít nhất là đã xây dựng gói Ubuntu. Bạn có thể đã xây dựng nó từ nguồn (có thể vì bạn muốn có phiên bản mới hơn phiên bản trong bản phát hành Ubuntu của bạn). Bạn đang chạy /usr/bin/emacshay /usr/local/bin/emacs?
Gilles 'SO- ngừng trở nên xấu xa'

1

Nếu bạn đang tìm cách để nhanh chóng chuyển sang mã nguồn, thì cũng có find-function-at-pointfind-variable-at-pointsẽ chuyển sang định nghĩa của biểu tượng dưới con trỏ - chẳng hạn, bạn có thể liên kết chúng với Ch Cf và Ch Cv.

Hoặc bạn có thể thử elisp-slime-nav , sử dụng M-. để chuyển đến định nghĩa của ký hiệu và M-, để trả về - nó điều hướng đến các biến, hàm, thư viện và khuôn mặt - https://github.com/purcell/elisp-slime-nav/

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.