1. ホーム
  2. emacs

[解決済み] Emacsのキーバインドをグローバルにオーバーライドする

2022-11-27 18:36:17

質問

キー バインディングを設定して、そのキーに対する他のすべてのバインディングをグローバルにオーバーライドし、優先させるにはどうしたらよいでしょうか。 すべてのメジャー/マイナー モード マップをオーバーライドし、私のバインディングが常に有効であることを確認したいです。

これはもちろんうまくいきません。

(global-set-key "\C-i" 'some-function)

で動作します。 text-mode では動作しますが lisp-mode , C-i へのリバウンドは lisp-indent-line .

このバインディングをオーバーライドして lisp-mode と他のすべてのモードで個別にこのバインディングを上書きすることもできますが、もっと簡単な方法があるはずです。 新しいファイル タイプのために新しいモードをインストールするたびに、すべてのキー バインディングが新しいモードによって上書きされていないことを確認するために、戻って確認する必要があります。

私は、他のエディターからすでに学び、染み付いたバインディングをエミュレートしたいので、これを実行したいのです。

どのように解決するのですか?

私は、すべての "override" キーバインディングにマイナー モードを使用しています。

(defvar my-keys-minor-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map (kbd "C-i") 'some-function)
    map)
  "my-keys-minor-mode keymap.")

(define-minor-mode my-keys-minor-mode
  "A minor mode so that my key settings override annoying major modes."
  :init-value t
  :lighter " my-keys")

(my-keys-minor-mode 1)

これは、他の誰かがキーボードを操作している場合や、デフォルトのキーバインディングが何をするのか確認する必要がある場合に、私が行ったすべての変更を一挙にオフにできる (マイナーモードを無効にするだけ) という追加の利点があります。

ミニバッファでこれをオフにする必要があるかもしれないことに注意してください。

(defun my-minibuffer-setup-hook ()
  (my-keys-minor-mode 0))

(add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)