1

我有自己的用户定义键绑定,如下所述: Globally override key binding in Emacs

每当我加载一个新的主要模式时,比如 OrgMode,我都会重写一些绑定以满足我在该特定模式下的需要。但是当我加载另一个具有自己覆盖的主要模式时,即使我不再处于该主要模式的缓冲区中,它们也会保持不变。

例如

(define-key custom-keys-mode-map (kbd "C-p") 'some-cool-function)
(add-hook 'org-mode-hook
    (lambda ()
    (define-key custom-keys-mode-map (kbd "C-p") 'org-cool-function )))
(add-hook 'sunrise-mode-hook
    (lambda ()
    (define-key custom-keys-mode-map (kbd "C-p") 'sunrise-cool-function )))

起初我使用 Cp 来执行我很酷的默认功能。加载 Org-Mode 后,我使用 Cp 执行“org-cool-function”,当我加载 Sunrise-Commander 时,Cp 执行“sunrise-cool-function”。

但是当我回到 Org-Mode 文件时,Cp 仍然尝试执行“sunrise-cool-function”而不是“org-cool-function”。

希望我很清楚:)

4

3 回答 3

6

您看到的行为是代码所期望的。它是这样的:

  • 你启动 emacssome-cool-function并被分配
  • 然后每当您打开一个新的org 文件(而不仅仅是将缓冲区切换到它)org-cool-function都会被分配
  • 每当您启动时sunrise-commander sunrise-cool-function都会被分配

您的问题来自尝试从本地事件设置全局属性。

您应该使用org-mode-map而不是custom-keys-mode-map放置您的C-p键绑定。这将为每个具有 org 内容的缓冲区一劳永逸地设置它:

(define-key custom-keys-mode-map (kbd "C-p") 'some-cool-function)
(eval-after-load "org"
  '(define-key org-mode-map (kbd "C-p") 'org-cool-function))
于 2013-04-08T19:20:28.390 回答
3

次要模式地图取代了取代全局地图的主要模式地图。

所以有几个选择:

  1. 根本不要在您的自定义次要模式映射中包含这些绑定。使您的首选绑定成为普通的全局绑定,并让主要模式根据需要覆盖它。

  2. 创建其他次要模式以优先于现有的次要模式,并在相应的主要模式中启用它们。minor-mode-map-alist在查找键绑定时,每个次要模式的位置决定了优先级,因此您需要在定义当前模式之后定义这些附加模式(这意味着它们将出现在 alist 中的较早位置),当然,如果更新,请保持它们的顺序该列表动态

  3. 保持一切原样,但将这些键绑定到检查主要模式并采取相应措施的自定义功能。如果您采用这种方法,您可能需要也可能不需要注意传递前缀参数。

于 2013-04-08T21:13:39.910 回答
0

我已经阅读了更多线程,这让我相信还有另一种方法,我目前正在使用:。

目前我正在使用这个:

;;; Disable Custom keys for specific major modes.
(define-global-minor-mode my-custom-keys-mode custom-keys-mode
  (lambda ()
    (when (not (memq major-mode (list 'sr-mode)))
      (custom-keys-mode))))
(my-custom-keys-mode 1)

这非常适合我目前的需求。

于 2013-04-13T20:43:51.870 回答