Wie rufe ich Dokumentzeichenfolgen aus Funktionen und Variablen ab?

11

Ich versuche, eine Funktion zu schreiben, die die Dokumentzeichenfolgen von allen Sexps in einer übereinstimmenden Datei abruft (def.*).

Ich möchte sowohl Funktionen / Makros als auch definierte Variablen abrufen können. Für Variablen möchte ich die Dokumentzeichenfolge, für alle Funktionen möchte ich auch die Argumentlisten.

Jonathan Leech-Pepin
quelle
1
Zur Verdeutlichung: Haben Sie eine Elisp-Quelldatei (meine Interpretation) oder haben Sie eine Reihe von Variablen und Funktionen in der aktuellen Emacs-Umgebung (Constantines Interpretation)? Und wenn die erste Interpretation, wollen Sie wirklich alle (def…)Sexps, nicht nur Top-Level-Spezifikationen? Oder die Zwischeninterpretation der Funktionen und Variablen, die beim Laden der Datei definiert würden? Oder eine entspanntere Definition, die Formulare der obersten Ebene wie (when nil (defun …))) enthält?
Gilles 'SO - hör auf böse zu sein'
Ich hatte ursprünglich die erste gewollt, aber basierend auf Constantines Interpretation konnte ich eine funktionale Implementierung erhalten, die mir das brachte, was ich brauchte. Ziel ist es, elisp source in eine Dokumentation (geschrieben in Org) basierend auf Docstrings umzuwandeln.
Jonathan Leech-Pepin
Bei der zweiten Interpretation machen die describe-functionIntegrierten und Freunde einen guten Teil dessen, was Sie wollen (Dokumentzeichenfolge und Argumentliste).
T. Verron

Antworten:

10

Wenn das Ziel darin besteht, Informationen über Funktionen und Variablen zu erhalten, die sich bereits in der Umgebung befinden :

  • Dokumente zu Funktionen und Makros finden Sie in der documentationFunktion.

  • Verwenden Sie für variable Dokumentzeichenfolgen documentation-property; zum Beispiel:

    (documentation-property
     'user-init-file 'variable-documentation)
    
  • Informationen zur Funktionsarität und zur Argumentliste finden Sie in dieser Emacs.SE-Frage , der Antwort und den Kommentaren zur Frage.

(Ich fand dies durch Drücken C-h k C-h fund Überfliegen des Quellcodes von describe-function(dasselbe für variable Dokumentzeichenfolgen, aber Lernen describe-variable).)

Um eine Emacs Lisp-Quellcodedatei zu analysieren, unter der Annahme, dass das Ziel darin besteht, Informationen über def.*Formulare der obersten Ebene zu erhalten , können Sie Folgendes tun.

(defun get-defun-info (buffer)
  "Get information about all `defun' top-level sexps in a buffer
BUFFER. Returns a list with elements of the form (symbol args docstring)."
  (with-current-buffer buffer
    (save-excursion
      (save-restriction
        (widen)
        (goto-char (point-min))
        (let (result)
          ;; keep going while reading succeeds
          (while (condition-case nil
                     (progn
                       (read (current-buffer))
                       (forward-sexp -1)
                       t)
                   (error nil))
            (let ((form (read (current-buffer))))
              (cond
               ((not (listp form))      ; if it's not a list, skip it
                nil)
               ((eq (nth 0 form) 'defun) ; if it's a defun, collect info
                (let ((sym (nth 1 form))
                      (args (nth 2 form))
                      (doc (when (stringp (nth 3 form)) (nth 3 form))))
                  (push (list sym args doc) result))))))
          result)))))

Dies kann leicht erweitert werden defvar, defconstusw.

Um das defunErscheinen in Formularen der obersten Ebene zu handhaben , müsste man in diese Formulare absteigen , möglicherweise unter Verwendung von Rekursion.

Konstantin
quelle
2
+1, um den Lesern zu sagen, wie sie diese Informationen selbst finden können. Das ist die wichtigere Lektion der beiden, die Sie unterrichtet haben.
Drew
@Drew Es scheint, dass wir uns in einer seltsamen Situation befinden: Das Ziel dieser Seite ist es, sich selbst obsolet zu machen ... Dies würde eine interessante Diskussion im Chat machen :)
Sean Allred
4
@ SeanAllred Das Unterrichten von Menschen zum Lernen stoppt die Fragen nicht, es macht sie nur besser.
Malabarba
3
+1 nach Malabarba. Der Zweck dieser Site sollte (IMHO) sein, zu beantworten, was Emacs selbst nicht beantworten kann oder nicht gut oder einfach antwortet . Analogie: Für die englische Sprache und Verwendung der Website besteht ein Grund für das Schließen von Fragen darin, dass " Fragen, die mit allgemein verfügbaren Referenzen beantwortet werden können, nicht zum Thema gehören *". (StackOverflow ist ähnlich.) Wir müssen nicht so extrem sein und sagen, dass Fragen, die Emacs selbst beantworten kann, nicht zum Thema gehören , aber die gleiche Idee sollte gelten: Lassen Sie Benutzer versuchen, zuerst die Antwort zu finden . In unserem Fall bedeutet das , Emacs zu fragen .
Drew
@ Draw Fair Punkte :)
Sean Allred