Navigieren Sie zum Quellcode der integrierten Funktionen und Variablen

9

Im Laufe des Tages verwende ich ständig C-h foder C-h v( describe-functionund describe-variable), um die Dokumentation für Funktionen und Variablen nachzuschlagen. Wenn ich nicht alle benötigten Informationen erhalte, klicke ich meistens auf den Dateilink am Ende von:

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

und navigieren Sie zum Quellcode. Dies funktioniert für installierte Pakete, scheint jedoch für integrierte Pakete nicht zu funktionieren. Zum Beispiel describe-functionbekomme ich oben auf der Hilfeseite für den Befehl nur Folgendes:

describe-function is an interactive compiled Lisp function.

ohne Link zum Quellcode. Gibt es eine Möglichkeit, schnell zum Quellcode eines integrierten Pakets zu navigieren?

Ich weiß , ich Quellcode in zB finden, /usr/share/emacs/24.5/lispund komme mit einem beliebigen Anzahl von Möglichkeiten , um den Zugriff des Verzeichnisses schnell, aber ich bin gespannt , ob es eine schnelle und einfache Möglichkeit, navigieren Sie zu einer integrierten Funktion / Variablendefinition in der ist Quellcode. Vielen Dank!

elethan
quelle
5
M-x find-function;; M-x find-variable;; M-x find-face;; M-x find-library. Ich verwende immer eine vollständige Installation von Emacs, damit ich auf alles zugreifen kann. Kurz nachdem ich meine eigenen Emacs erstellt habe, kopiere ich den C-Quellcode und stelle seinen Speicherort so ein, dass ich auch C-Quellcode-Definitionen finden kann. Sehen Sie sich die Variable find-function-C-source-directoryan, um den Speicherort des C-Quellcodes nach dem Kopieren festzulegen.
Lawlist
1
Unter Verwendung des Hauptzweigs von Emacs erhalte ich Folgendes mit M-x describe-function: description-function ist eine interaktive, automatisch geladene kompilierte Lisp-Funktion in 'help-fns.el'. Und von dort aus kann ich auf klicken (oder die Eingabetaste drücken) help-fns.elund werde dann zum entsprechenden Abschnitt des Codes transportiert. Vielleicht haben Sie mehrere Emacs-Versionen, und in der Version, die Sie derzeit verwenden, ist nicht der gesamte Quellcode installiert?
Lawlist
Wenn Sie dieses Verhalten beim Starten von Emacs mit emacs -Q(keine Init-Datei) feststellen oder wenn Sie es mit einem Rezept wiederholen können, das mit beginnt emacs -Q(z. B. wenn Sie angeben , welche Bibliotheken Sie laden und wie Sie sie laden usw.), sollten Sie einen Fehler melden Bericht : M-x report-emacs-bug.
Drew
4
nb IIRC, die Emacs-Pakete für Debian (möglicherweise auch andere Betriebssysteme) trennen die .elDateien (als optional behandelt) von den .elcDateien (obligatorisch), sodass Sie ein oder mehrere zusätzliche Pakete installieren müssen, um sie zu erhalten. Wenn Sie Emacs von Ihrem OS-Paketmanager erhalten haben, erklärt dies dies möglicherweise.
Phils
1
Sie können ein grep (oder ein anderes Suchdienstprogramm) für den Namen der Binärdateien (mit ausführbaren Berechtigungen) - emacs oder emacsclient - ausführen und sehen, wo sie sich auf Ihrer Festplatte befinden. Ich speichere meine ganz separat in einem eigenen Ordner. Zum Beispiel habe ich die Version, die mit meinem Betriebssystem geliefert wurde - /usr/bin/emacsund /usr/bin/emacsclientich habe eine Version, die gut in einem OSX-Anwendungsordner /Applications/Emacs.appgepackt ist, der auf .app endet - dh (innerhalb dieser Emacs.app sind die Binärdateien und alle Quellcodedateien).
Lawlist

Antworten:

7

Der Grund, warum manchmal "interaktive kompilierte Lisp-Funktion" (oder ebenfalls für Variablen) ohne Dateinamen angezeigt wird, ist, dass die Funktion aus einer bytekompilierten Datei geladen wurde und die entsprechende Elisp-Quelldatei nicht vorhanden ist. Um Ihnen den Quellcode anzuzeigen, muss Emacs den Quellcode finden können.

Viele Distributionen liefern Lisp-Quelldateien in einem separaten Paket, da nicht jeder Benutzer sie möchte und sie sperrig sind. Installieren Sie beispielsweise Debian und Derivate emacs24-el. Wenn Sie Emacs aus dem Quellcode make installerstellen , kopieren Sie die Elisp-Quellen.

Wenn Sie den Quellcode von Grundelementen (Unterprogramme und Sonderformulare) anzeigen möchten, muss Emacs in der Lage sein, die C-Quellen zu finden. Diese sind normalerweise nur verfügbar, wenn Sie sie von der Quelle installiert haben.

Emacs sucht nach den Lisp-Quellen in den Verzeichnissen in load-path. Für eine aus foo.elc,der Datei geladene Funktion oder Variable kann foo.eloder sein foo.el.gz. Emacs sucht unter nach C-Quellen source-directoryund fordert Sie auf, ein anderes Verzeichnis einzugeben, wenn die Quelldatei nicht gefunden wird.

Gilles 'SO - hör auf böse zu sein'
quelle
Obwohl ich hätte schwören können, dass ich diese Version von Emacs aus dem Quellcode erstellt habe, M-x emacs-versionheißt es am Ende "modifiziert von Debian", was darauf hindeutet, dass ich eine Version aus dem Paketmanager meines Betriebssystems (Ubuntu) verwende, oder?
Elethan
@elethan Wenn dort "Modifiziert von Debian" steht, haben Sie das Ubuntu-Paket installiert oder zumindest erstellt. Möglicherweise haben Sie es aus dem Quellcode erstellt (möglicherweise, weil Sie eine neuere Version als die in Ihrer Ubuntu-Version wollten). Läufst du /usr/bin/emacsoder /usr/local/bin/emacs?
Gilles 'SO - hör auf böse zu sein'
1

Wenn Sie nach Möglichkeiten suchen, schnell zum Quellcode zu springen, gibt es auch Möglichkeiten, find-function-at-pointmit find-variable-at-pointdenen Sie zur Definition des Symbols unter dem Cursor springen können. Sie können sie beispielsweise an Ch Cf und Ch Cv binden.

Oder versuchen Sie es mit elisp-slime-nav , das M- verwendet. Um zur Definition eines Symbols zu springen und M- zurückzukehren, navigiert es zu Variablen, Funktionen, Bibliotheken und Gesichtern - https://github.com/purcell/elisp-slime-nav/

Brian Burns
quelle