是否可以获取emacs-lisp文件中定义的函数列表?我发现了这种相关的答案:How do I get a list of Emacs lisp non-interactive functions?,但它涉及所有定义的原子的映射,而不仅仅是文件中的内容。
答案 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
表单。
答案 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
返回字符串中当前缓冲区的内容,-map
和s-match-string-all
取自dash
和s
第三方库(他们的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并尝试提出对您有用的任何内容。