如何获取Emacs Lisp非交互式函数列表?

14
我该如何获取Emacs Lisp中可以使用的全部非交互式函数列表,包括concat, car, cdr等(最好还有它们的文档)?查找交互函数在帮助系统中很容易,但我想要一个完整的非交互式函数列表。谢谢。
(flet ((first-line (text)
                   (if text
                       (substring text 0 (string-match "\n" text))
                     "")))
  (let ((funclist (list)))
    (mapatoms 
     (lambda (x)
       (and (fboundp x)                     ; does x name a function?
            (not (commandp (symbol-function x))) ; is it non-interactive?
            (subrp (symbol-function x))          ; is it built-in?
            (add-to-list 'funclist 
                         (concat (symbol-name x) " - " (first-line (documentation x))
                                 "\n")))))
    (dolist (item (sort funclist 'string<))
      (insert item))))

感谢您的提问和回答。在学习Emacs Lisp时非常有用。 - aartist
6个回答

16

这是基本思路 - 可以查看Emacs Lisp手册了解任何不清楚的概念。

(flet ((first-line (text)
         (if text
             (substring text 0 (string-match "\n" text))
           "")))
  (mapatoms 
   (lambda (x)
     (and (fboundp x)                          ; does x name a function?
          (not (commandp (symbol-function x))) ; is it non-interactive?
          (subrp (symbol-function x))          ; is it built-in?
          (insert (symbol-name x) " - " (first-line (documentation x)) "\n")))))

1
哇,太棒了。我从那段简短的代码中学到了大约十个新东西。谢谢。 - Singletoned

5
尝试使用apropos而不是apropos-command。这将为您提供所有函数,而不仅仅是交互式函数。C-h a默认绑定到后者,但如果您经常进行elisp编程,我建议将其绑定到前者。

1
你可以检查 obarray 的内容,但那包含了所有的符号,而不仅仅是“所有函数”。
或者,以下代码可能有用(将引入 CL 兼容性包的一部分):
``` (reduce (lambda (so-far next) (if (fboundp next) (cons next so-far) so-far)) obarray :initial-value nil) ```

0

尝试使用空输入运行apropos命令。


那个列表包含了所有内容,从那个角度来看,C-h f 会更好。 - Singletoned
抱歉,它没有列出所有内容。事实证明,它根本不包括非交互式命令。 - Singletoned
看看 apropos.el 并编写你自己的。 - starblue

0

算了吧。原来C-h f(描述函数)确实包括非交互式函数,但我仍然希望找到一种只查看/搜索非交互式函数的方法(尤其是内置函数)。


-1

我已经做了很多,但似乎找不到函数列表。有一个页面列出了所有内容,但没有一个专门列出函数的。我希望Emacs内置了一些东西。 - Singletoned

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接