2013-04-08 61 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. 保留它的一切方式,但將這些鍵綁定到檢查主模式並相應採取行動的自定義函數。如果採取這種方法,您可能需要也可能不需要關注前綴參數的傳遞。