Przejdź do kodu źródłowego wbudowanych funkcji i zmiennych

9

Przez cały dzień ciągle używam C-h flub C-h v( describe-functioni describe-variable) szukam dokumentacji funkcji i zmiennych. Częściej niż nie, jeśli nie otrzymam wszystkich potrzebnych informacji, kliknę link do pliku na końcu:

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

i przejdź do kodu źródłowego. Działa to w przypadku zainstalowanych pakietów, ale nie działa w przypadku wbudowanych. Na przykład u góry strony pomocy dotyczącej polecenia describe-functiondostaję tylko:

describe-function is an interactive compiled Lisp function.

bez linku do kodu źródłowego. Czy jest jakiś sposób na szybkie przejście do kodu źródłowego wbudowanego pakietu?

Wiem, że mogę znaleźć kod źródłowy np. /usr/share/emacs/24.5/lispI wymyślić wiele sposobów szybkiego dostępu do tego katalogu, ale jestem ciekawy, czy istnieje szybki i łatwy sposób na przejście do wbudowanej definicji funkcji / zmiennej w kod źródłowy. Dziękuję Ci!

Elethan
źródło
5
M-x find-function; M-x find-variable; M-x find-face; M-x find-library. Zawsze używam pełnej instalacji Emacsa, aby mieć dostęp do wszystkiego, i zaraz po zbudowaniu własnego Emacsa kopiuję kod źródłowy C i ustawiam jego lokalizację, aby móc również znaleźć definicje kodu C-Source. Zobacz zmienną, find-function-C-source-directoryaby ustawić lokalizację kodu źródłowego C po skopiowaniu.
prawnik
1
Korzystając z głównej gałęzi Emacsa, otrzymuję następujące informacje M-x describe-function: opis-funkcja jest interaktywną, automatycznie ładowaną, skompilowaną funkcją Lisp w 'help-fns.el'. Stamtąd mogę kliknąć (lub nacisnąć klawisz Enter), help-fns.ela następnie przenieść się do odpowiedniej sekcji kodu. Być może masz wiele wersji Emacsa, a ta, której używasz w tej chwili, nie ma zainstalowanego całego kodu źródłowego?
prawnik
Jeśli takie zachowanie wystąpi po uruchomieniu Emacsa przy użyciu emacs -Q(bez pliku inicjującego) lub jeśli możesz go ponownie wypisać według przepisu rozpoczynającego się od emacs -Q(np. Mówiąc, jakie biblioteki ładujesz i jak je ładujesz itp.), Rozważ zgłoszenie błędu sprawozdanie: M-x report-emacs-bug.
Drew
4
nb IIRC, pakiety Emacsa dla Debiana (być może także inne systemy operacyjne) oddzielają .elpliki (traktowane jako opcjonalne) od .elcplików (obowiązkowe), tak że aby je zdobyć, musisz zainstalować jeden lub więcej dodatkowych pakietów. Jeśli uzyskałeś Emacsa z menedżera pakietów systemu operacyjnego, być może to wyjaśnia.
phils
1
Możesz zrobić grep (lub inne narzędzie wyszukiwania) dla nazwy plików binarnych (z uprawnieniami do wykonywania) - emacs lub emacsclient - i zobaczyć, gdzie znajdują się na dysku twardym. Przechowuję moje całkowicie osobno w osobnym dedykowanym folderze. Na przykład mam wersję dostarczoną z moim systemem operacyjnym - /usr/bin/emacsi /usr/bin/emacsclientmam wersję ładnie spakowaną w folderze aplikacji OSX kończącym się na .app - tj. /Applications/Emacs.app(Wewnątrz Emacs.app znajdują się pliki binarne i wszystkie pliki kodu źródłowego).
prawnik

Odpowiedzi:

7

Powodem, dla którego czasami widzisz „interaktywną skompilowaną funkcję Lisp” (lub podobnie w przypadku zmiennych) bez nazwy pliku, jest to, że funkcja została załadowana z pliku skompilowanego bajtowo i odpowiedni plik źródłowy Elisp nie jest obecny. Aby pokazać ci kod źródłowy, Emacs musi być w stanie znaleźć kod źródłowy.

Wiele dystrybucji dostarcza pliki źródłowe Lisp w osobnym pakiecie, ponieważ nie każdy chce ich i są nieporęczne. Na przykład na Debianie i derywatach zainstaluj emacs24-el. Jeśli budujesz Emacsa ze źródła, make installskopiuj źródła Elisp.

Jeśli chcesz zobaczyć kod źródłowy prymitywów (podprogramy i formularze specjalne), Emacs musi być w stanie znaleźć źródła C. Nie są one normalnie dostępne, chyba że zostały zainstalowane ze źródła.

Emacs szuka źródeł Lisp w katalogach w load-path. Dla funkcji lub zmiennej ładowanej z foo.elc,pliku może być foo.ellub foo.el.gz. Emacs szuka pod C źródeł poniżej source-directoryi pyta o inny katalog, jeśli nie znajdzie pliku źródłowego.

Gilles „SO- przestań być zły”
źródło
Chociaż mógłbym przysiąc, że zbudowałem tę wersję Emacsa ze źródła, kiedy to nazywam, na M-x emacs-versionkońcu mówi „zmodyfikowane przez Debiana”, co wskazywałoby, że używam wersji z menedżera pakietów mojego systemu operacyjnego (Ubuntu), prawda?
elethan
@elethan Jeśli napisane jest „zmodyfikowane przez Debiana”, oznacza to, że zainstalowałeś lub przynajmniej zbudowałeś pakiet Ubuntu. Być może zbudowałeś go ze źródła (być może dlatego, że chciałeś mieć nowszą wersję niż ta w wersji Ubuntu). Biegasz /usr/bin/emacsczy /usr/local/bin/emacs?
Gilles „SO- przestań być zły”
1

Jeśli szukasz sposobów, aby szybko przejść do kodu źródłowego, istnieją również find-function-at-pointi find-variable-at-pointktóra będzie skakać do definicji symbolu pod kursorem - można powiązać je Ch Ch CF oraz CV, na przykład.

Lub możesz spróbować elisp-slime-nav , który używa M-. aby przejść do definicji symbolu, a M-, aby powrócić - nawiguje do zmiennych, funkcji, bibliotek i twarzy - https://github.com/purcell/elisp-slime-nav/

Brian Burns
źródło