2010-04-18 43 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