密钥绑定在emacs中被覆盖

时间:2013-04-08 19:15:21

标签: emacs elisp

我有自己的用户定义的键绑定,如下所述: 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 )))

首先,我使用C-p来执行我的酷,默认功能。 加载组织模式后,我使用C-p执行“org-cool-function”, 当我加载Sunrise-Commander时,C-p执行“sunrise-cool-function”。

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

希望我很清楚:)

3 个答案:

答案 0 :(得分:5)

您看到的行为是代码所期望的。它如下:

  • 您启动了emacs并some-cool-function被分配
  • 然后,只要您打开一个新的组织文件(而不仅仅是切换缓冲区),org-cool-function就会被分配
  • 每当您启动sunrise-commander sunrise-cool-function时,

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

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

(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))

答案 1 :(得分:3)

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

所以有几个选择:

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

  2. 创建其他次要模式以优先于现有的次要模式,并在相应的主要模式下启用它们。 minor-mode-map-alist中的每个次要模式的位置在查找键绑定时确定优先级,因此您需要在定义当前模式后定义这些附加模式(意味着它们将在前面的列表中出现) ),当然,如果updating that list dynamically

  3. ,请按顺序保留
  4. 保留所有内容,但将这些键绑定到自定义函数,这些函数会检查主要模式并采取相应措施。如果采用这种方法,您可能需要也可能不需要传递前缀参数。

答案 2 :(得分: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)

目前非常适合我的需求。