如何获取emacs-lisp文件中定义的函数列表

时间:2014-10-12 21:49:25

标签: elisp

是否可以获取emacs-lisp文件中定义的函数列表?我发现了这种相关的答案:How do I get a list of Emacs lisp non-interactive functions?,但它涉及所有定义的原子的映射,而不仅仅是文件中的内容。

4 个答案:

答案 0 :(得分:3)

如果已加载相关文件,则可以修改所链接问题中的代码,以过滤掉其他文件中定义的符号:

(let ((funclist ()))
  (mapatoms
   (lambda (x)
     (when (and (fboundp x)                     ; does x name a function?
                (let ((f (symbol-file x)))
                  (and f (string= (file-name-base f) "my-file.el"))))
       (push x funclist))))
  funclist)

如果尚未加载该文件,则必须使用scan-sexps进行扫描并找到defun表单。

但是,您可能更愿意使用etagsimenu而不是自己扫描文件。

答案 1 :(得分:2)

也许更快捷的方法是在load-history中查找文件,然后会为您提供其中定义的变量和函数列表。

答案 2 :(得分:0)

不确定您是否要求采用非互动方式。

使用M-x occur ENT (defun.* ENT,您可以获得一个缓冲区,其中包含(current-buffer)中所有函数定义的更多或更少。

答案 3 :(得分:-1)

快速和肮脏的方式:通过正则表达式提取所有的defuns。它可以立即在5000行缓冲区上运行。

(-map 'cadr (s-match-strings-all "defun \\(.*?\\) " (buffer-string)))

返回当前打开缓冲区中通过defun定义的函数名列表。 buffer-string返回字符串中当前缓冲区的内容,-maps-match-string-all取自dashs第三方库(他们的GitHub页面解释了如何安装它们),cadr返回列表中的2 nd 元素。

-map类似于Emacs内置mapcar,它将一个函数应用于列表的每个元素并返回一个新列表,s-match-string-all返回字符串中所有可能的正则表达式匹配,正则表达式中的括号表示group(从EmacsWiki中了解更多如何形成Emacs regular expressions)。

如果你在eval-expression Alt +:)中运行它,它会把它扔进echo area,但这不是你需要的。以下是适用于自定义缓冲区或文件的变体。 with-current-buffer允许临时切换缓冲区,而某些代码在其中执行操作,f-read是另一个第三方库f的文件读取函数。

(defun list-defined-functions (buffer)
  (with-current-buffer buffer
    (-map 'cadr (s-match-strings-all "defun \\(.*?\\) "
                                     (buffer-string)))))

(defun list-defined-functions-in-file (file)
  (-map 'cadr (s-match-strings-all "defun \\(.*?\\) "
                                   (f-read file))))

阅读Emacs Lisp manual并尝试提出对您有用的任何内容。