2013-04-08 64 views
1

我有我自己的用户自定义键绑定改写如下所述: Globally override key binding in Emacs主要绑定在Emacs

每当我打开一个新的主要模式,说org-模式,我有我的一些绑定的覆盖,以适应我在这种特定模式下的需求。 但是当我加载另一个主要模式时,它们有其自己的重写,即使我不在具有该主模式的缓冲区中,它们仍保持放置状态。

例如

(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来执行我的冷静,默认情况下,功能。 加载Org-Mode之后,我用C-p执行“org-cool-function”, ,当我加载Sunrise-Commander时,C-p执行“sunrise-cool-function”。

但是当我回到组织模式文件时, C-p仍然试图执行“日出冷却功能”而不是“org-cool-function”。

希望我清楚:)

回答

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) 

这非常适合我的需要的时刻。

5

您所看到的行为是什么,从代码的预期。它去如下:

  • 您启动Emacs和some-cool-function被分配
  • 那么每当你打开一个新的组织文件(而不仅仅是开关缓冲区的话)org-cool-function被分配
  • 无论何时启动sunrise-commandersunrise-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)) 
+0

这很好,但是解决方法是什么?; – CrimsonKing 2013-04-08 19:21:06

+0

那么,从一开始就不会打败自定义次要模式的目的吗?要覆盖我不希望或想要的令人讨厌的主要模式键绑定? – CrimsonKing 2013-04-08 19:27:06

+0

但是您希望不同模式下的相同密钥具有不同的行为。因此你需要不同的键盘映射。所以你可以做'自定义键模式映射',然后'自定义组合键模式映射'进一步推进将需要工作。我刚加入的'eval-after-load'应该足以满足您的需求。 – 2013-04-08 19:29:23

3

次要模式映射取代了取代全局映射的主要模式映射。

那么几个选项:

  1. 不要在您的自定义未成年人模式地图在所有包含这些绑定。使您的首选绑定成为普通的全局绑定,并让主要模式按需要覆盖它。

  2. 创建其他次要模式,使其优先于现有的次要模式,并在相应的主要模式下启用它们。 minor-mode-map-alist中的每个次要模式的位置在查找键绑定时确定优先顺序,因此您需要在定义之后定义这些额外模式(这意味着它们将在alist中更早出现),并且当然要让它们保持在订单如果updating that list dynamically

  3. 保留它的一切方式,但将这些键绑定到检查主模式并相应采取行动的自定义函数。如果采取这种方法,您可能需要也可能不需要关注前缀参数的传递。