特定のモードのすべてのキーバインディングに接頭辞キーを追加するにはどうすればよいですか?


7

私はモードを使用していますが、そのキーバインディングには慣れていません。それらの一部はemacsグローバルのものと競合します。だから、すべての既存のキーバインディングに接頭辞キーバインディングを追加したいと思います。

たとえば、my-modeM-]my-mode-shotのキーバインディングを定義している場合次のような方法を探しています。

(define-prefix-for-mode 'my-mode (kbd "C-c m"))

次に、my-mode-shotのキーバインディングはになりC-c m M-]ます。

特定のモードで利用可能なすべてのキーバインディングに接頭辞キーバインディングを追加するにはどうすればよいですか?


1
モードの種類によって異なります。詳細を教えてください。
Stefan

@Stefan私は、モード固有の解決策ではなく、一般的な解決策を探しています。
象嘉道

すべてのモードで確実に機能するソリューションはおそらく不可能です。私が提供したコードを使用して、おそらくほとんどの主要モードで機能するソリューションを準備できます。
Stefan

回答:


4

モードのキーバインドを移動する 1つの方法は、次のようなものです。

(let ((origmap <foo>-mode-map)
      (newmap (make-sparse-keymap)))
  (define-key newmap <prefix> origmap)
  (setq <foo>-mode-map newmap))  

しかし、foo-modeが実行される前にこのコードを実行すると失敗します。また、モードに入った後に実行しても効果はありません。そのため、おそらく `(with-eval-after-load '-mode ...)内で行う必要があります。

また、それがマイナーモードの場合、上記のコードは(上記の内でlet)次のようなことを行う必要があるため、効果もありません。

(setcdr (assq '<foo>-mode minor-mode-map-alist) newmap)

2
  1. モードのキーマップのプレフィックスキーを定義します。
  2. そのキーマップから、気になる他のキーの定義を解除します。

そのモードがfoo-modekey C-x ofoo-itにバインドし、それが気に入らないとします。

(define-key foo-mode-map (kbd "C-x o") nil)

そして、あなたfoo-mode-mapがプレフィックスキーに欲しいと仮定します<f9>

(define-prefix-command 'foo-mode-map)
(define-key global-map (kbd "<f9>") 'foo-mode-map)

これfoo-itにより<f9> C-x o、からも使用できなくなります。これは、プレフィックスキーを介してアクセス可能なままキーバインディングを邪魔にならないように移動することが目的である場合、自己破壊的である可能性があります。
nispio 2016年

1

モードのキーマップを直接変更して、選択したプレフィックスの下のすべてのバインディングを移動できます。

(setcdr my-mode-map
  `(keymap (?\C-c keymap (?m keymap . ,(cdr my-mode-map)))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.