Czy istnieje sposób wydrukowania definicji istniejącej funkcji w Emacsie?

10

Chcę zobaczyć definicję istniejącej funkcji w Emacsie. czy to możliwe?

Próbowałem C-h d function-name RET, ale zwraca tylko dokumentację funkcji, a nie samą funkcję.

Myślę o czymś podobnym do typepolecenia bash , które zwróci całą definicję funkcji.

(Żenująca historia: przypadkowo napisałem nad działającą funkcją w moim .emacspliku niedziałającą wersją. Oryginalna funkcja jest nadal w pamięci! I działa! Ale nie mogę sobie przypomnieć, jak to zrobiłem przez całe życie .)

Micah R. Ledbetter
źródło
1
Jeśli masz .emacsotwarty w buforze, spróbuj cofnąć jak szalony.
Gilles 'SO - przestań być zły'

Odpowiedzi:

10

Jeśli wpiszesz C-h f function-name RET, otrzymasz dokumentację funkcji wraz z linkiem do źródła funkcji, jeśli jest dostępna.

Nie sądzę, aby istniała łatwa funkcja Lisp, którą można wywołać w celu odzyskania lokalizacji źródła funkcji; wyszukiwanie jest ściśle powiązane z resztą systemu pomocy. find-lisp-object-file-nameto główna funkcja, która próbuje dowiedzieć się, gdzie jest źródło funkcji.

O ile nie function-namejest prymitywne (zdefiniowane w źródle C Emacsa), możesz zobaczyć jego kod za pomocą (symbol-function 'function-name), lub bardziej ogólnie (nazwa-funkcji funkcji pośredniej). Jeśli jednak funkcja została skompilowana bajtowo, zobaczysz tylko jej kod bajtowy.

Gilles „SO- przestań być zły”
źródło
1
Dziękuję Ci! (symbol-function 'function-name)jest dokładnie tym, czego szukałem! Wygląda również na to, że jeśli naprawdę potrzebujesz źródła do funkcji C, możesz je uzyskać, korzystając z informacji z odpowiedzi Olega.
Micah R Ledbetter
Dzięki! Ponadto, jeśli funkcja jest ładowana automatycznie, musisz wywołać ją raz, zanim będziesz mógł pobrać kod źródłowy.
Gerhard Burger
3

M-x find-function zwraca definicję funkcji w pobliżu punktu.

Z dokumentacji:

Znajduje plik buforowy zawierający definicję funkcji w pobliżu punktu (wybraną przez `function-named-at-point ') w buforze i umieszcza punkt przed definicją. Ustaw znak przed przeniesieniem, jeśli bufor już istniał.

Jeśli chcesz uwzględnić także funkcje zaimplementowane w języku C, musisz dodać do pliku .emacs:

(setq find-function-C-source-directory (concat (getenv "emacs_home") "/path/to/source-dir"))
Oleg Pawliw
źródło
Hmm Warto o tym wiedzieć, ale myślę, że działa tylko w przypadku wbudowanych funkcji, a nie tego szukałem.
Micah R Ledbetter
1
Działa również w przypadku funkcji zdefiniowanych przez użytkownika
Oleg Pavliv,