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 参数可以声明命令的模式归属,适用于多个模式时依次列出。
-
被过滤的命令仍然可以通过输入完整命令名执行,内置命令大多已声明模式归属,第三方包的覆盖程度不一。
延伸解读
过滤命令的实用性
使用 `read-extended-command-predicate` 可以显著提升 Emacs 用户的工作效率。通过过滤不相关的命令,用户在使用 M-x 时能够更快找到所需命令,减少干扰,尤其是在处理特定模式时。
命令模式归属的重要性
命令的模式归属通过 `interactive` 形式声明,未声明的命令被视为通用命令。了解如何正确声明命令的模式归属,可以帮助开发者更好地管理命令的可见性,确保用户在不同模式下获得最佳体验。
过滤谓词的选择
Emacs 提供了三种过滤谓词,用户可以根据需要选择合适的过滤程度。建议初学者从最宽松的 `command-completion-default-include-p` 开始,逐步尝试更严格的选项,以找到最适合自己工作流的设置。
延伸问答
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。