我有自己的用户定义的键绑定,如下所述: 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”。
希望我很清楚:)
答案 0 :(得分:5)
您看到的行为是代码所期望的。它如下:
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)
次要模式地图取代取代全球地图的主要模式地图。
所以有几个选择:
根本不要在自定义辅助模式映射中包含这些绑定。使您的首选绑定成为一个普通的全局绑定,并让主要模式根据需要覆盖它。
创建其他次要模式以优先于现有的次要模式,并在相应的主要模式下启用它们。 minor-mode-map-alist
中的每个次要模式的位置在查找键绑定时确定优先级,因此您需要在定义当前模式后定义这些附加模式(意味着它们将在前面的列表中出现) ),当然,如果updating that list dynamically。
保留所有内容,但将这些键绑定到自定义函数,这些函数会检查主要模式并采取相应措施。如果采用这种方法,您可能需要也可能不需要传递前缀参数。
答案 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)
目前非常适合我的需求。