関数と変数からドキュメント文字列を取得する方法は?


11

一致するファイル内の任意のsexpsからdocstringを取得する関数を記述しようとしています(def.*)

定義されている変数だけでなく、関数/マクロも取得できるようにしたいと思います。変数の場合はdocstringが必要ですが、関数の場合は引数リストも必要です。


1
明確にするために:あなたはElispソースファイル(私の解釈)を持っていますか、それとも現在のEmacs環境にたくさんの変数と関数がありますか(コンスタンティンの解釈)?そして、最初の解釈の場合、(def…)トップレベルの仕様だけでなく、本当にすべてのセックスが必要ですか?または、ファイルがロードされた場合に定義される関数と変数の中間的な解釈?または(when nil (defun …)))のようなトップレベルのフォームを含むよりリラックスした定義 ?
Gilles「SO-悪をやめる」14年

最初は最初のものが欲しかったのですが、コンスタンティンの解釈に基づいて、必要な機能を実現する機能的な実装を得ることができました。目標は、elispソースをDocstringsに基づくドキュメント(Orgで記述)に変換することです。
Jonathan Leech-Pepin 2014年

2番目の解釈では、組み込みdescribe-function関数とフレンドが、必要なこと(docstringと引数リスト)のかなりの部分を実行します。
T. Verron 2014年

回答:


10

目的が、環境にすでに存在する関数と変数に関する情報を取得することである場合:

  • 関数とマクロのdocstringについては、documentation関数を参照してください。

  • 変数docstringの場合はdocumentation-property、;を使用します。例えば:

    (documentation-property
     'user-init-file 'variable-documentation)
    
  • 関数アリティと引数リストについては、このEmacs.SEの質問、回答、および質問へのコメントを参照してください。

(私C-h k C-h fdescribe-function(変数docstringsと同じですが、を勉強していdescribe-variableます)のソースコードを押して流し読みすることでこれを見つけました。)

Emacs Lispソースコードファイルを分析するには、トップレベルのdef.*フォームに関する情報を取得することを目的とすると、次のようなことができます。

(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)))))

これは、容易に拡張することができdefvardefconstなど、

トップレベルのフォーム内に表示されることを処理defunするは、おそらく再帰を使用して、これらのフォームに降下する必要があります。


2
この情報を自分で見つける方法を読者に伝えるための+1。それはあなたが教えた2つの中でより重要なレッスンです。
ドリュー

@Drew奇妙な状況にあるようです。このサイトの目的は陳腐化することです...これはチャットで興味深い議論をするでしょう:)
Sean Allred 2014年

4
@SeanAllred人々に学ぶことを教えることは質問を止めるのではなく、それは彼らをより良くするだけです。
Malabarba 2014年

3
マラバルバへの+1。このサイトの目的は、(私見)はするべきであるEmacs自身がすることはできませんどのように答える答えたり、応答しないだけでなく、または簡単。類推:サイトの英語と使用法の場合、質問を閉じる理由は、「一般的に利用可能な参照を使用して回答できる 質問はトピック外*」であるということです。(StackOverflowも同様です。)Emacs自体が回答できる質問はトピックから外れていると言って、それほど極端である必要はありませんが、同じ考えが適用されます最初にユーザーに回答を見つけてもらいます。私たちの場合、それはEmacsに尋ねることを意味します。
2014年

@Drew Fair points :)
Sean Allred
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.