Emacs 有某种可用的 "package-search" 函数吗?

Is there some kind of "package-search" function available for Emacs?

在 Emacs 中,M-x 键绑定允许您搜索和执行可用的命令。我正在寻找一个类似的 function/functionality,它可以让您从 Emacs 存储库中搜索和安装可用的包。

目前我能做的最好的是M-x package-list-packages其次是C-s,但这有一些缺点:

  1. 它要求您导航到可用包的列表,而我想要在 Emacs 中的大多数地方都可以使用的东西。
  2. 它只能让您循环浏览包列表,而我想要显示缩小结果列表的东西。
  3. 它不支持模糊匹配(像 Helm)。

我正在寻找的功能是否存在?或者是否有为 Emacs 提供此功能的软件包?如果是这样,我在哪里可以找到它?

听起来 M-x package-install 应该做你想做的事。如果你安装了 helm,你将有一个类似 helm 的界面来搜索和安装包。即使没有 helm,它也可以从任何缓冲区调用,它支持缩小,如果你 安装了 helm,它支持模糊匹配。

我仍然倾向于使用 M-x package-list-packages 除非我确切地知道我在寻找什么,因为与 package-install 不同的是它允许您查看包的详细信息和描述。我将 C-s 绑定到 helm-occur,因此我也可以使用类似 helm 的界面搜索此缓冲区。此外,在 *Packages* 缓冲区中,您可以使用 f (package-menu-filter),它允许您根据逗号分隔的关键字列表缩小包列表。但是,我可以理解您想避免 post 中概述的 package-list-packages 方面。

安装 ido-ubiquitous 包并启用 (ido-ubiquitous-mode 1)(setq ido-enable-flex-matching t) 以启用弹性匹配(不确定是否有必要,但我已设置)。它基本上使所有补全都使用 ido,包括 package-install。您可以使用 C-SPC 缩小范围,或使用 <tab> 弹出完成缓冲区。

我一般用list-packages。我使用 flex-isearchisearch 环绕或没有匹配后自动开始弹性匹配。

  1. M-x package-install
  2. ENTER
  3. 开始输入您要安装的包(例如:xah-find)并使用自动完成选项 select 您选择的包。

致谢:@elethan

根据发现的屏幕截图 hereM-x list-matching-lines 这样的东西可以满足您的需要(通过包搜索字符串。)我试过了。屏幕截图中显示了键入内容的顺序。我没有安装任何特殊的东西来获得这个功能。

这将对包名称和摘要执行搜索:

(defun apropos-package--filter (string)
  (let (packages)
    (dolist (package-assoc package-archive-contents)
      (let ((package (cadr package-assoc)))
        (when (or (string-match-p (regexp-quote string) (package-desc-summary package))
                  (string-match-p (regexp-quote string) (prin1-to-string (package-desc-name package))))
          (push package packages))))
    packages))

(defun apropos-package (string)
  (interactive "sSearch for package: ")
  ;; Initialize the package system if necessary.
  (unless package--initialized
    (package-initialize t))
  (let ((packages (apropos-package--filter string)))
    (if (null packages)
    (message "No packages")
      (package-show-package-list (mapcar 'package-desc-name packages)))))

M-x apropos-package

调用命令