emacs - 为特定模式定义前缀键映射中的键

标签 emacs elisp key-bindings

我的所有键绑定(bind)都处于单独的次要模式中 - 首先,确保我认为强制的键绑定(bind)不会被某些主要模式覆盖;其次,能够在一个命令中禁用所有这些功能,以防我也需要。

到目前为止,我一直在扩展前缀键,如下所示:

(define-key my-minor-mode-map (kbd "M-g f") 'my-goto-file-func)

但后来我意识到有前缀键映射这样的东西,对于M-g键来说它是goto-map。所以我宁愿扩展这个键映射而不是硬编码前缀键,所以它会像:

(define-key goto-map (kbd "f") 'my-goto-file-func)

但在这种情况下,我的次要模式与它无关,因此我失去了使用它的所有优势。

一种方法是确定哪个键绑定(bind)到该特定前缀键映射,然后在绑定(bind)中使用该键。但它有一个缺点 - 如果我在加载次要模式后重新映射前缀键,则不会为我的次要模式重新映射前缀键。

那么有没有更好的方法来做到这一点?

最佳答案

按照您的方式扩展 key 非常好,因为它可以将复杂性降至最低。因此,虽然当然可以在次要模式下修改键盘映射,但这并不一定更好。

为了在次要模式下使用修改后的键盘映射而不覆盖原始键盘映射,只需将原始键盘映射设置为您的父级,例如

(defvar my-goto-map
  (let ((map (make-sparse-keymap)))
    (set-keymap-parent map goto-map)
    map))

然后您可以在次要模式中使用修改后的版本:

(define-key my-goto-map "f" 'find-file)
(define-key my-mode-map (kbd "M-g") my-goto-map)

但是原始的 goto-map 仍然存在并且正在运行,修改它将会反射(reflect)在您的 my-goto-map 中:

(define-key goto-map "i" 'info)

请参阅 elisp 手册中的“继承和键盘映射”。

关于emacs - 为特定模式定义前缀键映射中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25524710/

相关文章:

emacs - elisp 中的属性列表

emacs - 为什么Emacs中的 “goto-line”仅用于交互式使用?

list - 把列表变成符号

linux - fatal error (11)在emacs中尝试进入gdb模式时出现段错误,这是怎么回事?

emacs - 组织模式电子表格程序化远程引用

emacs - 为什么键绑定(bind) M-S-t 失败而 C-S-t 有效?

java - 用于多个箭头键按下的 KeyBinding

emacs - 列出某个 emacs 模式的所有键绑定(bind)

java - 作为 KeyEvent 替代方案的键绑定(bind)仍然不起作用

emacs - ~/.emacs.d/auto-save-list/的目的