TIL: 用 read-extended-command-predicate 精简 M-x 候选列表
内容提要
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。