Elisp/Emacs中交互式函数列表获取

4
我有许多带有前缀的交互式功能,例如“zb/create-temp-buffer”,前缀为*zb/。每次我想运行一个命令时,都需要在交互模式下输入M-x和该前缀,这让我感到有些疲倦。
为了自动化这个过程,我想要检索出所有交互式功能的列表,并通过ido-completing-read显示它们(顺便说一句,可能有其他替代且现代化的方法可以创建具有预定义项目和自动完成的输入?)。但我没有找到如何检索这样的列表。您能否给我提示如何实现这一点?
只需列出所有可用的交互式功能即可;筛选不是问题。
谢谢。
3个回答

3
您可以使用此功能进行选择。
(defun eab/select-zb/ ()
  (interactive)
  (call-interactively
   (intern
    (ido-completing-read "M-x zb/"
             (mapcar 'symbol-name (apropos-internal "^zb/"))))))

太好了!apropos-internal 是我寻找的关键词。 - zweibaranov

2
也许可以尝试一下 Smex

Smex 是 Emacs 的一个 M-x 增强插件。它在 Ido 的基础上构建,为您最近和最频繁使用的命令提供了方便的界面。同时也支持所有其他命令。


感谢您告知Smex,但需要一些时间来理解;另一方面,也有内置工具可以完成此任务。 - zweibaranov

1

你说 "也许有其他替代的、现代的方法来创建预定义项目和自动完成输入吗?"

  1. 使用Icicles并绑定icicle-must-match-regexp
    (defun zb/ ()
      (interactive)
      (let ((icicle-must-match-regexp  "^zb/"))
        (call-interactively (intern (completing-read "zb/ 命令: " obarray 'commandp t)))))
  1. 您也可以使用Vanilla Emacs并且不需要使用Ido:
    (defun zb/ ()
      (interactive)
      (call-interactively
        (intern (completing-read
                 "zb/ 命令: "
                 obarray
                 (lambda (cmd)
                   (and (commandp cmd)  (string-match-p "^zb/" (symbol-name cmd))))
                 t))))

或者像@artscan建议的那样:使用apropos-internal来匹配正则表达式。换句话说,要么让completing-read进行匹配,要么先使用apropos-internal进行匹配。您也可以将commandp谓词传递给apropos-internal


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