22.2.4 为命令指定适用模式

Emacs 中的很多命令是通用的,不与任何特定模式绑定。 例如,M-x kill-region 几乎可以在任何可编辑文本的模式中使用, 而显示信息的命令(如 M-x list-buffers)几乎可以在任何上下文使用。

但另一些命令则与特定模式紧密绑定,在该上下文之外没有意义。 例如,在 Dired 缓冲区之外使用 M-x dired-diff 只会报错。

因此 Emacs 提供了一种机制,用于指定命令 “属于(belongs)” 哪个(哪些)模式:

(defun dired-diff (...)
  ...
  (interactive "p" dired-mode)
  ...)

这会将该命令标记为仅适用于 dired-mode(或从 dired-mode 派生的任何模式)。 可以在 interactive 形式中指定任意数量的模式。 This will mark the command as applicable to dired-mode only (or any modes that are derived from dired-mode). Any number of modes can be added to the interactive form.

指定模式会影响 M-S-xexecute-extended-command-for-buffer,see 交互式调用)中的命令补全。 根据 read-extended-command-predicate 的值,它也可能影响 M-x 中的补全。

例如,当将 command-completion-default-include-p 谓词作为 read-extended-command-predicate 的值时, M-x 不会列出被标记为特定模式专用的命令(当然,除非你正在使用该模式的缓冲区中)。 这对主模式和次要模式都生效。 (相比之下,M-S-x 总是从不适用的命令中排除补全候选。)

默认情况下,read-extended-command-predicatenilM-x 的补全会列出所有与用户输入匹配的命令, 无论这些命令是否被标记为适用于当前缓冲区的模式。

将命令标记为适用于某个模式,还会让 C-h m 列出这些命令(如果它们未绑定到任何按键)。

如果使用这种扩展的 interactive 形式不方便 (因为代码需要在不支持扩展 interactive 形式的旧版 Emacs 中运行), 可以使用下面等价的声明(see declare 形式)代替:

(declare (modes dired-mode))

哪些命令需要标记模式在一定程度上取决于个人习惯, 但 明显只能在该模式内使用 的命令应当被标记。 这包括在其他地方调用会报错的命令, 也包括在意外模式下调用会产生破坏性效果的命令。 (这通常包括为特殊(即非编辑)模式编写的大多数命令。)

有些命令在其他模式下调用可能无害且能 “正常运行(work)”, 但如果在其他地方使用实际上没有意义,仍然应该标记模式。 例如,许多特殊模式都有绑定到 q 的退出缓冲区命令, 它们可能只输出类似 “从此模式再见(Goodbye from this mode)” 的信息,然后调用 kill-buffer。 该命令在任何模式下都能 “运行(work)”, 但几乎没有人会想在该特殊模式之外使用它。

许多模式都有一组以不同方式启动该模式的命令(例如 eww-open-in-new-buffereww-open-file)。 这类命令 绝不应该 被标记为模式专用, 因为用户几乎可以在任何上下文执行它们。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike