如何从函数和变量中检索文档字符串?


11

我正在尝试编写一个函数,该函数将从匹配文件中的任何sexps中检索文档字符串(def.*)

我想既能够检索任何函数/宏,也可以检索定义的任何变量。对于变量,我需要文档字符串,而对于任何函数,我还需要参数列表。


1
需要说明的是:您是否有Elisp源文件(我的解释),或者在当前Emacs环境中有很多变量和函数(康斯坦丁的解释)?如果是第一种解释,您真的要所有(def…)性行为,而不仅仅是顶级规范吗?还是对文件加载后将要定义的功能和变量的中间解释?还是更宽松的定义,其中包括诸如的顶级形式 (when nil (defun …))
吉尔(Gilles)'所以

我最初想要第一个,但是基于君士坦丁的解释,我能够获得一个功能实现,使我得到所需的东西。目标是将elisp源代码转换为基于Docstrings的文档(以Org编写)。
乔纳森·里奇·佩平2014年

通过第二种解释,内置对象describe-function和朋友可以完成您想要的大部分工作(文档字符串和参数列表)。
T. Verron 2014年

Answers:


10

如果目标是获取有关环境中已经存在的函数和变量的信息:

  • 有关函数和宏的文档字符串,请参见documentation函数。

  • 对于可变文档字符串,请使用documentation-property; 例如:

    (documentation-property
     'user-init-file 'variable-documentation)
    
  • 有关函数Arity和参数列表的信息,请参阅此Emacs.SE问题,答案和对该问题的注释。

(我是通过按C-h k C-h f一下并略过的源代码describe-function(与可变docstring相同,但正在研究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用于告诉读者如何自己查找此信息。那是您所教的两个中最重要的一课。
Drew

@Drew看来我们处在一种奇怪的情况:这个网站的目标是使自己过时…这将在聊天中进行有趣的讨论:)
Sean Allred

4
@SeanAllred教人们学习不会停止问题,只会使他们变得更好。
马拉巴巴

3
+1前往马拉巴巴。该站点(IMHO)的目的应该是回答Emacs本身无法回答或不能很好轻松地回答的内容。类推:对于站点英语语言和用法,关闭问题的原因是“ 可以使用 常用参考文献回答的问题是题外话*”。(StackOverflow上是相似的。)我们不必极端,说问题,这本身的Emacs可以回答是题外话,但同样的想法应适用:让用户尽量先找到答案。在我们的案例中,这意味着通过询问Emacs
Drew

@Drew Fair points :)
肖恩·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.