このコードがキーマップのすべてのキーバインディングを無効にできないのはなぜですか?


7

一言で言えば、私が好きな小さなライブラリがありますが、デフォルトのキーバインドは好きではありません。たとえば、これはグローバルマイナーモードであり、関数をC-c C-sにバインドしますが、それorg-scheduleは私のorgおよびorg-agendaバッファーに影を落とします。

小さなライブラリを保持したいのですが、小さなライブラリのキーマップにあるすべてのバインディングを削除します。

これを行うための初期の試みで、私は次のことを試しました(little-library-mode-mapバインディングが存在する場所を確認した後)。

(with-eval-after-load "little-library-mode"
  (setq little-library-mode-map (make-sparse-keymap)))

コードは「成功」しますが(C-h v little-library-mode-map RETそれ(keymap)が今だということを示しています)、すべての小さなライブラリのキーバインディングはまだ「機能」C-c C-sしています(orgおよびorg-agendaバッファを含む、小さなライブラリ関数はまだ機能しています)。

私は問題を解決する別の方法を見つけましたが、このアプローチが失敗する理由を本当に知りたいです。Emacsのキーバインドは、私にはまだ黒魔術のように見えます。


のように、マイナーモードが使用するデータ構造を破壊的に変更する必要があります(setcdr little-library-mode-map nil)
wasamasa 2016

回答:


3

このストーリーには3つの重要な点があります。

  • マイナーモードのキーマップ
  • その名前
  • 作成する疎なキーマップ

基本的にあなたがしたことは名前をオリジナルではなく疎なキーマップに向けることですが、それは遅すぎます:マイナーモードはオリジナルを使用します。


ああ、わかった。そのようにそれを置くとき、それは完全に理にかなっています。Emacs /マイナーモードがオリジナルのキーマップをどのように見つけるか知っていますか?それはどのデータ構造に見えますか?
purple_arrows 2016

3
@purple_arrows元のキーマップはにありminor-mode-map-alistます。
npostavs

2

ある時点little-library-modeで、変数に格納されているキーマップをアクティブ化すると、次の場所にlittle-library-mode-map追加されminor-mode-map-alistます。

(push (cons 'little-library-mode little-library-mode-map) minor-mode-map-alist)

Emacsはこのリストを使用して、マイナーモードのバインディングを検索します。little-library-mode-map後で変数を新しい値にバインドするとき、これはキーマップminor-mode-map-alistポイントに影響を与えません。@wasamasaのコメントにあるように、このキーマップのすべてのバインディングを取り除く1つの方法は、キーマップを直接変更することです。

 (setcdr little-library-mode-map nil)

別の方法は、ライブラリをロードする前にキーマップをリセットすることです:

(setq little-library-mode-map (make-sparse-keymap))
(with-eval-after-load "little-library-mode" 
    ...more-setup-code)

マイナーモードが適切に動作している場合は、バインディングもインスタンス化されなくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.