2009-05-04 11 views
6

Emacsのキーストロークを考慮します。 C-x C-sC-h c キーストロークと入力することでどの機能が呼び出されるのか把握できますが、このキーバインドの定義場所を確認するにはどうすればよいですか? どのファイルにキーバインドが定義されていましたか?

は(たぶん正しい答えは、キーマップは、この種の情報を格納しないので、それは、決定することができないということです。)

答えて

5

キーバインドが関数に関連付けられている場所に関する情報は、Emacsでは保持されません。実際、その答えは通常未定義です。

多くの場合、キーバインディングは、マイナーモードの副作用として、またはモードフックによって設定されます。マイナーモードのキーバインドは、多くの場合、comint-mode-mapのような変数に格納されます。このキーマップは、モード変数comint-modeを設定すると有効になります。しかし、そのモードマップはグローバル変数であり、誰でもどこにでもキーバインディングを追加できます。だから、あなたが望むことは、本質的に、誰が特定の値を持つ変数を設定するのかを追跡することです。同様に、モードフック(local-set-keyを使用)によってローカルに設定されているキーバインディングについても同様です。さらに、キーバインディングをfile variablesまで設定することもできます。これは、Emacsのキーバインディングが一過性であると言うだけです。

最高のことは、キーに関連付けられた機能を見つけて、そのファイル(またはモードが複数のファイルに分割されている場合は関連するファイル)を調べることです。

キーストローク(グローバル、メジャーモード、マイナーモード、マイナーモードのオーバーライド、バッファのローカル、テキストプロパティなど)を設定/関連付ける方法が非常に多いため、emacsのキーバインドルックアップがかなり関わっています。概要については、this documentationをご覧ください。

このような関数を書いて、マイナーモードを調べてキーバインディングがどこに設定されているかを確認できますが、私の最初のテストではキーバインドが定義されていないことがわかりました。しかし、おそらくコードは参考になるでしょう。

(defun guess-where-keybinding-is-defined (key) 
    "try to guess where a key binding might be defined" 
    (interactive (list (read-key-sequence "Describe key: "))) 
    (let ((bindings (minor-mode-key-binding key)) 
     found) 
    (while (and bindings (not found)) 
     (if (setq found (caar bindings)) 
      (find-function (cdar bindings))) 
     (setq bindings (cdr bindings))))) 

(この質問以外の)解決しようとしている問題はありますか?

+0

詳細なお返事ありがとうございます。私は昨日、コアモードで定義された特定のキーバインドか、外部パッケージであるかを調べようとしていたときに、昨日心配していました。 –

1

だけで行うのMx見つける機能

Emacsのドキュメントから:

(ファンクションファンクション)

ファンクション に近い点を見つけます。

点 周辺機能の 定義を含むソースファイルを検索し(によって選択 `関数でポイントと呼ばれる ') バッファおよび場所が 定義の前にポイント。 バッファがすでに存在する場合は、移動前にマークを設定します。

+0

これは私が探しているものではありません。 *関数*がキーバインド*ではなく定義された場所を教えてくれます。 –

+0

私はあなたがそれを見つけることができるとは思わない。 –

関連する問題