6

Emacsでのキーストロークを検討しC-x C-sます。と入力すると、どの関数が呼び出されるかがわかりますが、このキーバインドが定義されている場所を見つけるにはどうすればよいですか?C-h c keystroke

(おそらく正しい答えは、キーマップにはこの種の情報が格納されていないため、決定できないということです。)

4

2 に答える 2

5

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

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

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

emacs でのキー バインディングのルックアップは、キー ストロークを設定/関連付ける方法が無数にあるため、かなり複雑です (グローバル、メジャー モード、マイナー モード、マイナー モードのオーバーライド、バッファーのローカル、テキスト プロパティなど)。簡単な概要については、このドキュメントをご覧ください。

このような関数を記述して、マイナー モードを調べて、キーバインドが設定されている場所を確認できますが、もちろん、私の最初のテストでは、キーバインドがそこで定義されていないことが示されました。しかし、おそらくコードは有益でしょう。

(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)))))

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

于 2009-05-04T13:14:22.783 に答える
1

Mxfind-functionを実行するだけです

Emacsドキュメントから:

(検索機能機能)

近点関数の定義を見つけます。

バッファ内のポイントに近い関数( `function-called-at-point'で選択)の定義を含むソースファイルを検索し、定義の前にポイントを配置します。バッファがすでに存在する場合は、移動する前にマークを設定します。

于 2009-05-04T11:20:35.817 に答える