2013-10-11 28 views
2

我想定義適用於任何程序模式的自定義模式。我需要爲所有這些模式定義鍵綁定。我選擇使用define-minor-mode:keymap以最小的努力來聲明密鑰綁定。如何正確定義小模式的鍵盤映射

我想綁定comment-or-uncomment-region"C-;" kbd宏給了我[67108923]這個鍵序列的幻數。

我寫的樣本不工作

(define-minor-mode 
    my-mode 
    nil nil 
:keymap '(
    ([67108923] . comment-or-uncomment-region) 
) 
) 

我已經註冊的模式,切換它,但按С-;產生密鑰序列是沒有定義

,我以後通知已經在臨時緩衝區中寫入並評估了以預期方式執行的簡單的global-set-key

(global-set-key [67108923] 'comment-or-uncomment-region) 

現在按C-;會產生預期的comment-or-oncomment-region行爲。

我試圖通過C-h f搜索功能信息來調試問題。它產生奇怪輸出,comment-or-oncomment-region勢必兩次不同按鍵序列:

It is bound to C - ;, C-; 

首先一個出現並且與較小的模式來回切換消失,從global-set-key調用其他出現。

如果我爲兩個地圖使用了相同的密鑰定義,情況如何?我錯過了什麼細節?

回答

3
  1. 只需創建一個鍵盤映射正常使用make-sparse-keymap,並將其命名爲my-mode-map ---你就大功告成了。不需要:keymap參數爲define-minor-mode

  2. 或者使用您創建的鍵盤映射使用make-sparse-keymap作爲:keymap的值,如果您願意的話。 (但不需要,因爲它被命名爲次要模式期望:my-mode-map。)

  3. 但是,爲什麼不只是使用全局綁定,通過global-set-key?爲什麼你甚至需要這是一個小模式綁定?

+0

make-sparse-keymap完美工作,但我仍然不明白基於http://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Minor的原始方法有什麼問題-yodes.html – ayvango

+0

ayvango:您的代碼在Emacs 24.3中可用。我懷疑你的問題是你最初錯了,之後定義了my-mode-map。任何後續評估都不會破壞現有地圖;你需要首先解除綁定my-mode-map。 – phils

3

請勿使用幻數。 IOW使用[?\C-\;],所以它可以被人類理解。 我同意德魯:

(defvar my-mode-map 
    (let ((map (make-sparse-keymap))) 
    (define-key map [?\C-\;] 'comment-or-uncomment-region) 
    map)) 

(define-minor-mode my-mode 
    "blabla" 
    nil nil nil 
    <add code, if any>) 

哦,還有一兩件事:你爲什麼寧願C-;超過標準M-;結合?