11

現在のメジャー モードのキーマップで、特定のキーを特定のコマンドに永続的にバインドする elisp 関数を作成しています。例えば、

    (define-key python-mode-map [C-f1] 'python-describe-symbol)

コマンドとキー シーケンスは、ユーザーから対話的に収集されます。しかし、現在のメジャー モードに対応する KEYMAP の名前 (「python-mode-map」など) を生成するのに問題があります。

関数 (current-local-map) を試しましたが、この関数は名前ではなく、キーマップ オブジェクト自体を返します。

多くのメジャー モード キーマップは、「メジャー モード名」-モード マップという規則に従って名前が付けられていることを理解していますが、これは常に当てはまるとは限りません (たとえば、python-shell-map)。私のコードはこの規則に依存していません。(現在のメジャーモードの名前にアクセスする方法さえわかりません)。

(define-key ...)init ファイルに追加されるため、

(define-key (current-local-map) key command)

動作しているように見えますが、初期化ファイルのコードとしては動作しません。

4

3 に答える 3

14

現在のローカル キーマップの名前 (より正確には、その値がバインドされているシンボル) を直接見つける方法はありません。これは、キーマップをシンボルにバインドする必要さえないためです。ただし、モードキーマップは通常、グローバルシンボルにバインドされており、すべてのシンボルを反復処理eqし、キーマップオブジェクトに対する値を持つシンボルで停止することで、それがどれであるかを見つけることができます。

これはすべてのシンボルを調べる必要がありますが (各シンボルに対して最低限の作業を行います)、特定の命名規則に依存しないという利点があります。

(defun keymap-symbol (keymap)
  "Return the symbol to which KEYMAP is bound, or nil if no such symbol exists."
  (catch 'gotit
    (mapatoms (lambda (sym)
                (and (boundp sym)
                     (eq (symbol-value sym) keymap)
                     (not (eq sym 'keymap))
                     (throw 'gotit sym))))))


;; in *scratch*:
(keymap-symbol (current-local-map))
==> lisp-interaction-mode-map
于 2013-01-23T21:50:06.130 に答える
5

この関数local-set-keyは、現在のローカル キーマップでキーをバインドする目的で存在します。

于 2013-01-23T22:02:27.463 に答える
2

多分あなたは試すことができます:

(define-key (concat (symbol-name major-mode) "-map") [C-f1] 'python-describe-symbol)

編集: これにより正しい STRING が生成されますが、それでもシンボルに変換する必要があります。

于 2013-01-23T21:46:53.070 に答える