Emacs:为整个次要模式移动键绑定

Emacs: move keybindings for an entire minor mode

我已经剃了这个 2 小时了,需要继续前进,但我会把它扔到互联网上看看是否有任何进展。

我正在将 midje-mode 加载到 clojure-mode - midje-mode 是次要模式。 keymap clobbers projectile-mode,坦率地说,它更有用,更常用(对我来说)。

midje-mode 定义了 C-c 下的所有内容,但没有后续和弦(为什么?这是一个该死的小调!)。所以我想将所有内容移动到 C-c C-m 或类似的东西。

我什么都试过了。什么都不粘。我已经连接到次要模式启动以取消映射和映射键盘映射中的所有条目。我对主要模式做了同样的挂钩(clojure-mode)。旧绑定不会一直离开,新绑定永远不会发生。

我尝试了以下操作:http://emacsredux.com/blog/2013/09/25/removing-key-bindings-from-minor-mode-keymaps/ 没有骰子。 (define-key 'map (kbd "<foo>") (kbd "<bar>")) 不起作用,坦率地说,如果它曾经起作用,它在 Emacs 的 GNU 文档中无处可寻,所以我不知道作者在说什么。

我将删除 midje-mode 并继续,但很高兴知道。

以下将执行您的要求:

;; Move the `midje-mode-map' prefix from "C-c" to "C-c ."
(with-eval-after-load "midje-mode"
  (let ((prefix-map (lookup-key midje-mode-map (kbd "C-c"))))
    (define-key midje-mode-map (kbd "C-c") nil)
    (define-key midje-mode-map (kbd "C-c .") prefix-map)))

话虽如此,我觉得已经提到的其他一些建议应该会产生影响,所以你说 none 中的任何人都做了任何事情这一事实让我觉得有些不对劲您正在尝试应用它们,或者存在您没有注意到的错误。

请注意,您不能midje-mode-map 的库加载之前对其进行所需的更改(否则键盘映射不存在);但是 midje-mode-hook 不能 运行 在加载该库之前(因此该方法肯定应该有效);并且 require 在进行更改之前访问库还可以确保它已加载(因此应该也能正常工作)。

在这些情况下,eval-after-load 方法通常更可取,但是,因为您只希望此代码 运行 一次,并且您不必提前加载库。