Gibt es eine Möglichkeit, die Definition einer vorhandenen Funktion in Emacs zu drucken?

10

Ich möchte die Definition einer vorhandenen Funktion in Emacs sehen. Ist das möglich?

Ich habe es versucht C-h d function-name RET, aber es wird nur die Dokumentationszeichenfolge für die Funktion zurückgegeben, nicht die eigentliche Funktion.

Ich denke an etwas Ähnliches wie den typeBefehl von bash , der die gesamte Definition einer Funktion zurückgibt.

(Peinliche Hintergrundgeschichte: Ich habe versehentlich eine funktionierende Funktion in meiner .emacsDatei mit einer nicht funktionierenden Version überschrieben. Die ursprüngliche Funktion ist noch im Speicher! Und sie funktioniert! Aber ich kann mich für mein ganzes Leben nicht daran erinnern, wie ich es gemacht habe.)

Micah R Ledbetter
quelle
1
Wenn Sie .emacsin einem Puffer geöffnet haben, versuchen Sie es wie verrückt rückgängig zu machen.
Gilles 'SO - hör auf böse zu sein'

Antworten:

10

Wenn Sie eingeben C-h f function-name RET, erhalten Sie die Dokumentation der Funktion mit einem Link zur Funktionsquelle, falls verfügbar.

Ich glaube nicht, dass es eine einfache Lisp-Funktion gibt, die Sie aufrufen können, um den Speicherort der Quelle einer Funktion abzurufen. Die Suche ist ziemlich eng mit dem Rest des Hilfesystems verknüpft. find-lisp-object-file-nameist die Hauptfunktion, die versucht herauszufinden, wo sich die Quelle einer Funktion befindet.

Sofern function-namees sich nicht um ein Grundelement handelt (definiert in Emacs 'C-Quelle), können Sie dessen Code mit (symbol-function 'function-name)oder allgemeiner (Funktionsname der indirekten Funktion) anzeigen. Wenn die Funktion jedoch bytekompiliert wurde, sehen Sie nur ihren Bytecode.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Vielen Dank! (symbol-function 'function-name)ist genau das, wonach ich gesucht habe! Es sieht auch so aus, als ob Sie die Quelle für C-Funktionen wirklich benötigen, indem Sie Informationen aus Olegs Antwort verwenden.
Micah R Ledbetter
Vielen Dank! Wenn die Funktion automatisch geladen wird, müssen Sie sie einmal aufrufen, bevor Sie den Quellcode abrufen können.
Gerhard Burger
3

M-x find-function Gibt die Definition der Funktion in der Nähe des Punkts zurück.

Aus der Dokumentation:

Findet die Quelldatei mit der Definition der Funktion in der Nähe des Punkts (ausgewählt durch "Funktion wird am Punkt aufgerufen") in einem Puffer und platziert den Punkt vor der Definition. Setzen Sie vor dem Verschieben die Markierung, wenn der Puffer bereits vorhanden ist.

Wenn Sie auch in C implementierte Funktionen einbeziehen möchten, müssen Sie Ihrer .emacs-Datei Folgendes hinzufügen:

(setq find-function-C-source-directory (concat (getenv "emacs_home") "/path/to/source-dir"))
Oleg Pavliv
quelle
Hmm. Das ist gut zu wissen, aber ich denke, es funktioniert nur für integrierte Funktionen, was nicht das ist, wonach ich gesucht habe.
Micah R Ledbetter
1
Es funktioniert auch für benutzerdefinierte Funktionen
Oleg Pavliv