同じバッファで2つのメジャーモードマップを使用する


11

あるメジャーモードのキーマップを別のメジャーモードのフォールバックキーマップとして機能させることが非常に便利ないくつかの状況に遭遇しました。例えば:

  • 私はいくつかの組織ドキュメントに多くのLaTeXを記述しているのでlatex-mode、編集中にコマンドを簡単に利用できると便利 org-modeです。
  • 私はMarkdownをサポートするIRCルームに頻繁にmarkdown-modeアクセスするので、にキーバインドを追加しておくのも良いでしょうerc-mode

どちらの場合も、この追加のキーマップはフォールバックとして機能する必要があります(これが、マイナーモードを使用できない理由です)。ラテックスコマンドでorg-modeキーを上書きしたくありません。私が欲しいのは:
キーがで定義されており、latex-mode-mapかつで定義されていない org-mode-map場合は、latex-mode-mapバインディングを使用します。

Q:キーマップをメジャーモードのフォールバックキーマップとして設定するにはどうすればよいですか?
または
Q:何もオーバーライドせずに、1つのメジャーモードマップから別のメジャーモードマップにキーをコピーするにはどうすればよいですか?


ただ明確にします。これらのキーを1つずつ定義できることはわかっていますが、自動化されたソリューションがあれば、はるかに便利です。


6
キーマップマージを使用します。を参照してくださいmake-composed-keymap
ドリュー、

回答:


12

これは予想よりも簡単であることがわかりました。ここのコメントと質問で示唆されているように:

(with-eval-after-load 'erc
  (require 'markdown-mode)
  (require 'cl-lib)
  (setq erc-mode-map
        (make-composed-keymap (cl-copy-list erc-mode-map)
                              markdown-mode-map)))

これにより、のコピーであるerc-mode-mapがからも継承するキーマップが作成されmarkdown-mode-mapます。したがって、すべてのmarkdownキーは、キーと衝突するたびにシャドウイングされercます。

フォールバックキーマップのいくつかのキーがメインのkemapよりも優れているようにたい場合は、メインのキーマップで無効にしてください。

(define-key erc-mode-map "\C-c\C-a" nil)

2
define-keyの戻り値にを使用するmake-composed-keymapと、元のキーマップに予期しない副作用が生じる可能性があることに気付きましたappended。この手動のマップにも同じことが当てはまると思います。を使用したい場合は、キーマップが合成キーdefine-keyマップである新しいキーマップを作成するのが最も安全なようです。
Jon O.

@JonO。実際、これがここで起こらないことを知って驚いた。私が行う(define-key erc-mode-map "\C-c\C-s" nil)場合、対応するmarkdown-modeキーはercバッファーで利用できます。
Malabarba 2014

マラバルバ:コードを変更すると、最後のコメントは適用されなくなると思います。make-composed-keymapドキュメントは、「MAPSに結合nilのいずれかの親に結合対応より優先されますが、それはMAPSの他のキーマップで対応するバインディングを上書きしません。」と言います markdown-mode-mapあなたの例の親と同じように、私はそのnilバインディングがマークダウンバインディングを抑制することを期待しますか?
phils '12

2
私の解釈はそれがある(make-composed-keymap (list erc-mode-map markdown-mode-map)) でしょうが、あなたが説明したのだ効果がありますか?
phils 2014

1
cl-copy-list本当にあなたが望むことをしません。キーマップをコピーする場合は、を使用する必要がありますcopy-keymap
Stefan

3

@Malabarbaが述べたようにmake-composed-keymap、そのために使用できます。ただし、新しいキーマップを両方のキーマップから継承したい場合、新しいキーマップを変更しても他の2つのキーマップには影響しないため、次の2つの手順で行う必要があります。

(make-composed-keymap
 nil (make-composed-keymap (list erc-mode-map markdown-mode-map)))

これは、define-keyが最初の引数として渡されたマップを変更できるmake-composed-keymapが、2番目として渡されたマップは変更できない場合があるためです。私は、あなたがしなければならないと思いますM-x report-emacs-bugし、要求make-composed-keymap受諾リストあなただけ行うことができますので、2番目の引数としてキーマップのを

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