Existe-t-il un moyen d'imprimer la définition d'une fonction existante dans Emacs?

10

Je veux voir la définition d'une fonction existante dans Emacs. Est-ce possible?

J'ai essayé C-h d function-name RET, mais il ne renvoie que la chaîne de documentation de la fonction, pas la fonction elle-même.

Je pense à quelque chose de similaire à la typecommande de bash , qui renverra toute la définition d'une fonction.

(Contexte embarrassant: j'ai accidentellement écrasé une fonction qui fonctionnait dans mon .emacsfichier avec une version qui ne fonctionnait pas. La fonction d'origine est toujours en mémoire! Et cela fonctionne! Mais je ne peux pas pour la vie de me rappeler comment je l'ai fait.)

Micah R Ledbetter
la source
1
Si vous avez gardé .emacsouvert dans un tampon, essayez d'annuler comme un fou.
Gilles 'SO- arrête d'être méchant'

Réponses:

10

Si vous tapez C-h f function-name RET, vous obtiendrez la documentation de la fonction, avec un lien vers la source de la fonction si disponible.

Je ne pense pas qu'il existe une fonction Lisp facile à appeler pour récupérer l'emplacement de la source d'une fonction; la recherche est assez entrelacée avec le reste du système d'aide. find-lisp-object-file-nameest la fonction principale qui tente de déterminer où se trouve la source d'une fonction.

À moins qu'il function-namene s'agisse d' une primitive (définie dans la source C d'Emacs), vous pouvez voir son code avec (symbol-function 'function-name), ou plus généralement (nom de fonction de fonction indirecte). Cependant, si la fonction a été compilée en octets, tout ce que vous verrez est son bytecode.

Gilles 'SO- arrête d'être méchant'
la source
1
Je vous remercie! (symbol-function 'function-name)c'est exactement ce que je cherchais! En outre, il semble que si vous avez vraiment besoin des fonctions source vers C, vous pouvez les obtenir en utilisant les informations de la réponse d'Oleg.
Micah R Ledbetter
Merci! De plus, si la fonction est chargée automatiquement, vous devez l'appeler une fois avant de pouvoir obtenir le code source.
Gerhard Burger
3

M-x find-function renvoie la définition de la fonction près du point.

De la documentation:

Recherche le fichier source contenant la définition de la fonction près du point (sélectionné par `fonction appelée au point ') dans un tampon et place le point avant la définition. Définissez la marque avant le déplacement, si le tampon existait déjà.

Si vous souhaitez inclure également des fonctions implémentées en C, vous devez ajouter ce qui suit à votre fichier .emacs:

(setq find-function-C-source-directory (concat (getenv "emacs_home") "/path/to/source-dir"))
Oleg Pavliv
la source
Hmm. C'est bon à savoir, mais je pense que cela ne fonctionne que pour les fonctions intégrées, ce qui n'est pas ce que je cherchais.
Micah R Ledbetter
1
Il fonctionne également pour les fonctions définies par l'utilisateur
Oleg Pavliv