2012-12-20 41 views
9

在emacs中,如何顯示當前緩衝區的陰影/重寫鍵綁定? 運行時不會顯示describe-bindingsC-h b)。如何顯示重寫/隱藏的密鑰綁定?

換句話說:如何查看緩衝區中活動的模式是否存在衝突的鍵綁定?

+0

我想一個解決方法是使用一個較小的模式像在http://stackoverflow.com/a/683575/789593,並在關閉次要模式時查看特定鍵是否有另一個命令。更糟糕的做法可能是使用'emacs -q'啓動Emacs,以查看配置中的密鑰是否在沒有配置的情況下具有另一個綁定。 –

+0

不幸的是,這並沒有解決次要模式衝突的問題:你必須單獨測試每一對可能的次要模式。 – Norswap

回答

7

只需撥打describe-mode章米

大多數模式文檔字符串中會顯示他們的鍵盤映射,以及用於在這裏列出它們的方法還會告訴您綁定是否被遮蔽。

它不會告訴你它是由陰影,但當然這是微不足道的檢查與C-HçC-Hķ

例如爲:

key    binding 
---    ------- 
[...] 
C-M-q   indent-sexp 
    (that binding is currently shadowed by another mode) 

通過其處理當documentation功能被稱爲模式文檔字符串的函數生成substitute-command-keys該文本。

例如:

(substitute-command-keys "\\{lisp-interaction-mode-map}") 

以下函數也可以是有用:

(key-binding KEY &optional ACCEPT-DEFAULT NO-REMAP POSITION) ;; dominant binding 
(global-key-binding KEYS &optional ACCEPT-DEFAULT) 
(local-key-binding KEYS &optional ACCEPT-DEFAULT) 
(minor-mode-key-binding KEY &optional ACCEPT-DEFAULT) ;; discover keymap(s) 
0

爲它赫克我這樣做:

(define-key c++-mode-map "\C-c\C-s" 'kaw-sort-projects) 

,然後做C-H B(見綁定)。並得到了這個輸出:

Major Mode Bindings: 
key    binding 
---    ------- 

C-c C-q  c-indent-defun 
C-c C-s  kaw-sort-projects 
C-c C-u  c-up-conditional 
C-c C-w  subword-mode 

所以它似乎顯示出來。

這是你的意思嗎?

創造了這個功能,讓你以前的值當你定義一個關鍵

(defun define-key-warn (map key fxn) 
    "Bind a key and give info message if already bound" 
    (setq old-fxn (lookup-key map key)) 
    (if old-fxn 
     (message "INFO: key %s was defined as %s" key old-fxn)) 

    (define-key map key fxn) 
) 
+1

我想看到的是被C-C C-s遮蔽的綁定。因此,例如,如果在調用'define-key'之前,'C-c C-s'被綁定到'my-command',那麼我希望看到'C-c C-s my-command(shadowed)'出現在某處。 – Norswap

+0

啊。所以我們需要一種方法來轉儲/訪問模式的默認綁定。必須考慮那一刻。 – kdubs

+0

看起來像一旦你綁定了密鑰,它就完全抹去了前一個密鑰的任何提示。解除鍵綁定,將其留空。看起來我不會有任何幫助。 – kdubs