2013-01-23 10 views
6

私は、現在のメジャーモードのキーマップで与えられたコマンドを永久にバインドするelisp関数を書いています。例えば、Emacs現在のローカルキーマップの名前?

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

コマンドとキーシーケンスは、ユーザーからインタラクティブに収集されます。しかし、現在のメジャーモードに対応するKEYMAPの名前(例えば、「python-mode-map」)の作成に問題があります。

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

多くのメジャーモードのキーマップは、 'major-mode-name'-mode-map 'という規則に従って命名されていますが、必ずしもそうではありません(例えば、python-shell-map)。だから、私はこの規約に頼らないコードを使用したいと思っています。 (私は現在のメジャーモードの名前にアクセスする方法もわかりません)。動作するよう(define-key (current-local-map) key command)

が、それは、初期化ファイルにコードとして機能しないように

(define-key ...)は、initファイルに追加されます。

+0

他のコードを生成するコードを書いているのはなぜですか?あなたが解決しようとしているより深刻な問題は何ですか?おそらく他の人が単純に「必要とする」ライブラリを書くことができますか?あなたは、現在のモードに基づいて正しいことをする 'magically-describe-symbol'のような種類の関数を実行する単一のモードを書くことができますか? –

+0

あなたがプログラムでこれらを追加できるのであれば、より一般的でよりエレガントな方法でそれを解決できるかもしれません。それ以外のコードスニペットモードマップ... –

+1

@TreyJacksonそれらの「断片の束」は、自分の '.emacs'に属するコードの一部である可能性があります。他のコードを生成するコードは、Lispでは欺かれることはありません。 – user4815162342

答えて

9

現在のローカルキーマップの名前、より正確には、値がバインドされているシンボルを見つける直接的な方法はありません。キーマップはシンボルにバインドする必要がないためです。しかし、モードキーマップは一般的にグローバルシンボルにバインドされており、キーマップオブジェクトに対して値が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 
+0

ありがとう。私はこれを最後の手段として試してみることを考えましたが、別の方法があることを望んでいました(また、どのシンボルが一致するかわからない)。コードは一度だけ実行されるので、パフォーマンスは問題ではないので、これは私の解決策です。 – erjoalgo

1

たぶん、あなたは試みることができる:

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

編集:これは正しい文字列をもたらすであろうが、それはまだ、シンボルに変換する必要があります。

+0

ありがとうございます。私が言及したように、私はこの大会に頼りたくはありませんが、これは良い推測です!私はほとんどの主要なモードがこのコンベンションに従うと思います。 – erjoalgo

+1

elispハッカーの2年後にこれに戻ってくると、文字列をシンボルとして使用するために '(intern(concat ...))'となるでしょう – erjoalgo

2

関数local-set-keyは、現在のローカルキーマップのキーを結合する目的のために存在します。

+1

ありがとうございます。私はそれを知っていた。しかし、私が言及したように、私の目的は、初期化ファイルに追加されるコードを生成することです。したがって、初期化時に、 'local-set-key'はキーを目的のキーマップにバインドしません。 – erjoalgo

関連する問題