2010-04-18 44 views
1

我有一个小模式,也带有全局模式。该模式有一些键绑定,我希望用户有可能性指定哪些绑定应该适用于每种模式。模式特定的键绑定

(my-minor-mode-bindings-for-mode 'some-mode '(key1 key2 ...)) 
(my-minor-mode-bindings-for-mode 'some-other-mode '(key3 key4 ...)) 

所以我需要某种模式/缓冲局部键映射的。因为用户可以更改主要模式,所以缓冲区本地是 位有问题。

我已经尝试了一些解决方案,它们都不起作用。

  1. 始终绑定所有可能的键,当用户键入键时,检查键是否应在该模式下处于活动状态。如果为true,则执行操作,否则回退。
  2. 与前面的情况一样,只有没有键被绑定。相反,我使用pre命令钩子并检查按下的按键是否应该执行任何操作。
  3. 对于每个缓冲区更新(无论如何),运行一个函数,该函数首先清除键映射,然后使用该特定模式的绑定更新它。

我已经尝试了这些方法,并且发现了所有这些问题。你知道解决这个问题的好方法吗?

谢谢!

回答

0

您可以添加的键绑定是一个钩子我猜:

(add-hook 'some-mode-hook 
(lambda() 
(define-key some-mode-map (kbd "C-c w") 'something) 
... 
) 
) 

匿名函数当然也可以更复杂,你可以做任何你检查愿意做的事。当然,如果您需要交互地更改绑定,则可以简单地使用一些交互功能...

+0

我想这是一个选项。但我宁愿以其他方式解决它,以便用户更容易地指定模式特定设置。 – rejeep 2010-04-19 14:25:16

0

使some-mode-map变量缓冲区为本地,并且启用some-mode时,它将检查以查看哪组键绑定安装。因为some-mode-map是本地缓冲区,所以键绑定应该是本地缓冲区(并且不影响其他缓冲区)。

+0

我其实已经尝试过,但没有奏效。不知道为什么。我会再试一次......我想我应该使用(make-variable-buffer-local'some-mode-map)来使它在本地缓冲? – rejeep 2010-04-22 10:08:42

+0

使模式映射缓冲区本地不起作用。它似乎在工作,因为绑定是正确的。如果我检查模式映射变量,那么正确的绑定就在那里。但是,如果我在这些绑定之一上执行* C-h c *,它不会绑定到它应该是的,而是绑定到Emacs默认绑定。 – rejeep 2010-04-25 13:39:11