TIL: 用 read-extended-command-predicate 精简 M-x 候选列表

💡 原文中文,约1300字,阅读约需4分钟。
📝

内容提要

Emacs 28 引入了 `read-extended-command-predicate` 变量,用于过滤 M-x 命令列表,隐藏不适用于当前模式的命令。通过设置,可以只显示当前模式相关的命令,提升使用效率。命令的模式归属通过 `interactive` 形式声明,未声明的命令则视为通用命令。

🎯

关键要点

  • Emacs 28 引入了 `read-extended-command-predicate` 变量,用于过滤 M-x 命令列表,隐藏不适用于当前模式的命令。

  • 通过设置 `read-extended-command-predicate`,可以只显示当前模式相关的命令,提升使用效率。

  • 命令的模式归属通过 `interactive` 形式声明,未声明的命令视为通用命令,不会被过滤。

  • Emacs 提供了三个过滤谓词,分别是:command-completion-default-include-p、command-completion-using-modes-and-keymaps-p 和 command-completion-using-modes-p,过滤程度从宽松到严格。

  • 在 `interactive` 形式中添加 mode 参数可以声明命令的模式归属,适用于多个模式时依次列出。

  • 被过滤的命令仍然可以通过输入完整命令名执行,内置命令大多已声明模式归属,第三方包的覆盖程度不一。

延伸问答

Emacs 28 中的 read-extended-command-predicate 是什么?

read-extended-command-predicate 是一个变量,用于过滤 M-x 命令列表,隐藏不适用于当前模式的命令。

如何使用 read-extended-command-predicate 提升 Emacs 的使用效率?

通过设置 read-extended-command-predicate,可以只显示当前模式相关的命令,从而提升使用效率。

Emacs 提供了哪些过滤谓词?

Emacs 提供了三个过滤谓词:command-completion-default-include-p、command-completion-using-modes-and-keymaps-p 和 command-completion-using-modes-p,过滤程度从宽松到严格。

如何在命令中声明模式归属?

在命令的 interactive 形式中添加 mode 参数,例如 (interactive nil foo-mode),可以声明该命令只在特定模式下有效。

被过滤的命令是否可以执行?

被过滤的命令仍然可以通过输入完整命令名执行,虽然它们不在补全列表中显示。

使用 Vertico 时如何配置 read-extended-command-predicate?

如果使用 Vertico,其示例配置中已包含该行,只需取消注释即可启用 read-extended-command-predicate。

➡️

继续阅读