3

key-binding現在アクティブなキーマップのキーを調べます。ミニバッファのようなキーマップやisearch-mode-map、定義されたキーの限られたセット以外のキーをユーザーが押すとすぐに制限的で非アクティブになるキーマップの場合、key-bindingそれらのキーマップを非アクティブ化せずに呼び出すことはできません。

方法:

  1. ソース コードの分析を伴わない方法で、特定のコマンドを呼び出した後に有効になるキーマップを決定します (たとえば、isearch-mode-mapによってオーバーライド ローカル マップとして設定されます)。isearch-forward-regexp変数の状態を追跡/記録するために使用できるフックはありますか?

  2. これらのキーマップのキーをプローブします。たとえば、何にRETバインドされていisearch-mode-mapますか?

私の最も近い解決策は、この関数をバインドすることでした:

(defun probe_keybinding  ()
  (interactive)
  (message (prin1-to-string (key-binding (read-key-sequence-vector "Enter key to probe"))))
)

'S-f9' のような珍しいキーに変更し、関心のあるキーマップがアクティブなときに呼び出します (たとえば、ミニバッファーの afind-fileや aの途中eval-expression)。これは常に機能するとは限りません。たとえば、isearch-forward-regexp認識されないキーが入力されるとすぐに終了します。

4

2 に答える 2

4
  1. 特定のコマンドに応答してどのキーマップが使用されるかを判断する簡単な方法はありません。どの関数も(use-local-map ...)好きなときに呼び出すことができるので、確実にする唯一の方法はソース コードを読むことです。

    そうは言っても、Emacs コードは、多くの場合に答えを見つけることを可能にする規則に従っています。にキーマップがある場合foo-mode、通常、キーマップには という名前が付けられfoo-mode-mapます。-mapを実行すると、名前が で終わる変数のリストを表示できますM-x apropos RET -map$ RET

  2. 関数 を使用して、キーマップ内のキーを検索できますlookup-key。Emacs Lisp マニュアルの「キー検索の関数」を参照してください。したがって、RETin にバインドされているものを見つけるには、次のようisearch-mode-mapに評価します。

    (lookup-key isearch-mode-map (kbd "RET"))
      ===> isearch-exit
    
于 2013-10-05T18:38:39.900 に答える
2

答えのもう 1 つの要素は、個々のキーマップを調べることです。残念ながら、C-h v isearch-mode-mapそのまま (または他のキーマップ変数) を実行すると、あまり読みにくい Lisp 式が表示されます。

describe-keymap代わりに、 from libraryを使用できますhelp-fns+.el。これは にバインドされてC-h M-kおり、キーマップにバインドされたすべての (メニュー以外の) キーを人間が読める方法で表示します。詳細はこちら

于 2013-10-05T19:21:28.393 に答える