Accédez au code source des fonctions et variables intégrées

9

Tout au long de la journée, j'utilise constamment C-h fou C-h v( describe-functionet describe-variable) pour rechercher de la documentation sur les fonctions et les variables. Plus souvent qu'autrement, si je n'obtiens pas toutes les informations dont j'ai besoin, je clique sur le lien du fichier à la fin de:

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

et accédez au code source. Cela fonctionne pour les packages installés, mais ne semble pas fonctionner pour les packages intégrés. Par exemple, en haut de la page d'aide de la commande, describe-functiontout ce que j'obtiens est:

describe-function is an interactive compiled Lisp function.

sans lien vers le code source. Existe-t-il un moyen de naviguer rapidement vers le code source d'un package intégré?

Je sais que je peux trouver le code source dans, par exemple, /usr/share/emacs/24.5/lispet trouver un certain nombre de façons d'accéder rapidement à ce répertoire, mais je suis curieux de savoir s'il existe un moyen rapide et facile de naviguer vers une définition de fonction / variable intégrée dans le code source. Je vous remercie!

elethan
la source
5
M-x find-function; M-x find-variable; M-x find-face; M-x find-library. J'utilise toujours une installation complète d'Emacs pour avoir accès à tout, et juste après avoir construit mes propres Emacs, je copie sur le code C-source et définit son emplacement afin de pouvoir également trouver des définitions de code C-Source. Voir la variable find-function-C-source-directorypour définir l'emplacement du code source C après l'avoir copié.
Lawlist
1
En utilisant la branche principale d'Emacs, j'obtiens ce qui suit avec M-x describe-function: decrire-fonction est une fonction Lisp compilée autochargée interactive dans 'help-fns.el'. Et à partir de là, je peux cliquer sur (ou appuyer sur Entrée) help-fns.elet je suis ensuite transporté vers la section applicable du code. Peut-être que vous avez plusieurs versions d'Emacs, et que celle que vous utilisez actuellement n'a pas tout le code source installé?
Lawlist
Si vous obtenez ce comportement lorsque vous démarrez Emacs en utilisant emacs -Q(pas de fichier init), ou si vous pouvez le reprocher avec une recette qui commence par emacs -Q(par exemple en disant quelles bibliothèques vous chargez et comment vous les chargez etc.), alors pensez à déposer un bogue rapport: M-x report-emacs-bug.
Drew
4
nb IIRC, les paquets Emacs pour Debian (peut-être d'autres systèmes d'exploitation également) séparent les .elfichiers (traités comme facultatifs) des .elcfichiers (obligatoires), de sorte que vous devez installer un ou plusieurs paquets supplémentaires pour les obtenir. Si vous avez obtenu Emacs auprès de votre gestionnaire de packages de système d'exploitation, cela explique peut-être cela.
phils
1
Vous pouvez faire un grep (ou un autre utilitaire de recherche) pour le nom des binaires (avec des autorisations exécutables) - emacs ou emacsclient - et voir où ils se trouvent sur votre disque dur. Je stocke le mien entièrement séparément dans leur propre dossier dédié. Par exemple, j'ai la version livrée avec mon système d'exploitation - /usr/bin/emacset /usr/bin/emacsclient, et j'ai une version bien emballée dans un dossier d'application OSX se terminant par .app - c'est-à-dire /Applications/Emacs.app(à l'intérieur d'Emacs.app, se trouvent les binaires et tous les fichiers de code source).
lawlist

Réponses:

7

La raison pour laquelle vous voyez parfois «fonction Lisp compilée interactive» (ou de même pour les variables) sans nom de fichier est que la fonction a été chargée à partir d'un fichier compilé en octets et que le fichier source Elisp correspondant n'est pas présent. Afin de vous montrer le code source, Emacs doit être capable de trouver le code source.

De nombreuses distributions expédient les fichiers source Lisp dans un package séparé, car tous les utilisateurs n'en veulent pas et ils sont volumineux. Par exemple, sur Debian et dérivés, installez emacs24-el. Si vous construisez Emacs à partir de la source, make installcopiez les sources Elisp.

Si vous voulez voir le code source des primitives (sous-programmes et formulaires spéciaux), Emacs doit être capable de trouver les sources C. Ceux-ci ne sont normalement pas disponibles sauf si vous avez installé à partir de la source.

Emacs recherche les sources Lisp dans les répertoires de load-path. Pour une fonction ou une variable chargée à partir foo.elc,du fichier, vous pouvez être foo.elou foo.el.gz. Emacs recherche les sources C sous source-directoryet vous invite à choisir un répertoire différent s'il ne trouve pas le fichier source.

Gilles 'SO- arrête d'être méchant'
la source
Bien que j'aurais juré avoir construit cette version d'Emacs à partir des sources, quand je l'appelle, M-x emacs-versionil dit "modifié par Debian" à la fin, ce qui indiquerait que j'utilise une version du gestionnaire de paquets de mon système d'exploitation (Ubuntu), non?
elethan
@elethan S'il dit «modifié par Debian», alors vous avez installé ou au moins construit le paquet Ubuntu. Vous l'avez peut-être construit à partir des sources (peut-être parce que vous vouliez une version plus récente que celle de votre version d'Ubuntu). Courez-vous /usr/bin/emacsou /usr/local/bin/emacs?
Gilles 'SO- arrête d'être méchant'
1

Si vous cherchez des moyens de passer rapidement au code source, il y en a aussi find-function-at-pointet find-variable-at-pointqui sautera à la définition du symbole sous le curseur - vous pouvez les lier à Ch Cf et Ch Cv, par exemple.

Ou vous pouvez essayer elisp-slime-nav , qui utilise M-. pour passer à la définition d'un symbole, et M-, pour revenir - il navigue vers les variables, les fonctions, les bibliothèques et les faces - https://github.com/purcell/elisp-slime-nav/

Brian Burns
la source