¿Hay alguna forma de imprimir la definición de una función existente en Emacs?

10

Quiero ver la definición de una función existente en Emacs. es posible?

Lo intenté C-h d function-name RET, pero solo devuelve la cadena de documentación para la función, no la función en sí misma.

Estoy pensando en algo similar al typecomando de bash , que devolverá la definición completa de una función.

(Historia de fondo vergonzosa: accidentalmente escribí sobre una función que funcionaba en mi .emacsarchivo con una versión que no funcionaba. ¡La función original todavía está en la memoria! ¡Y funciona! Pero por mi vida no puedo recordar cómo lo hice).

Micah R Ledbetter
fuente
1
Si ha mantenido .emacsabierto en un búfer, intente deshacerlo como loco.
Gilles 'SO- deja de ser malvado'

Respuestas:

10

Si escribe C-h f function-name RET, obtendrá la documentación de la función, con un enlace a la fuente de la función si está disponible.

No creo que haya una función Lisp fácil a la que pueda llamar para recuperar la ubicación de la fuente de una función; la búsqueda está bastante entrelazada con el resto del sistema de ayuda. find-lisp-object-file-namees la función principal que intenta averiguar dónde está la fuente de una función.

A menos que function-namesea ​​una primitiva (definida en la fuente C de Emacs), puede ver su código con (symbol-function 'function-name), o más generalmente (nombre-función-función-indirecta). Sin embargo, si la función fue compilada por bytes, todo lo que verá es su código de bytes.

Gilles 'SO- deja de ser malvado'
fuente
1
¡Gracias! (symbol-function 'function-name)es exactamente lo que estaba buscando! Además, parece que si realmente necesita la fuente para las funciones C, puede obtenerla utilizando la información de la respuesta de Oleg.
Micah R Ledbetter
¡Gracias! Además, si la función se carga automáticamente, debe llamarla una vez antes de poder obtener el código fuente.
Gerhard Burger
3

M-x find-function devuelve la definición de la función cerca del punto.

De la documentación:

Encuentra el archivo fuente que contiene la definición de la función cerca del punto (seleccionado por `function-called-at-point ') en un búfer y coloca el punto antes de la definición. Establezca la marca antes de moverse, si el búfer ya existía.

Si desea incluir también funciones implementadas en C, debe agregar lo siguiente a su archivo .emacs:

(setq find-function-C-source-directory (concat (getenv "emacs_home") "/path/to/source-dir"))
Oleg Pavliv
fuente
Hmm Es bueno saberlo, pero creo que solo funciona para funciones integradas, que no es lo que estaba buscando.
Micah R Ledbetter
1
También funciona para funciones definidas por el usuario
Oleg Pavliv