bind-map は、悪の状態に関連付けられたものを含むさまざまな「リーダーキー」にわたってキーマップを使用できるようにするために使用できるマクロbind-map
提供する Emacs パッケージです。これは本質的に、vim または Emacs evil-leader パッケージで使用されるリーダー キーの概念を一般化したもので、任意の数の「リーダー キー」を許可します。これはおそらく例で説明するのが一番わかりやすいでしょう。
(bind-map my-base-leader-map
:keys ( " M-m " )
:evil-keys ( " SPC " )
:evil-states (normal motion visual))
(bind-map my-elisp-map
:keys ( " M-m m " " M-RET " )
:evil-keys ( " SPC m " " , " )
:major-modes ( emacs-lisp-mode
lisp-interaction-mode))
これにより、 my-base-leader-map
(まだ定義されていない場合はマップが自動的に作成されます) が接頭辞 (またはリーダー) Mm
およびSPC
で利用可能になります。後者は悪の通常、モーション、または視覚状態にのみバインドされます。 2 番目の宣言は、指定されたメジャー モードの 1 つがアクティブなときに、指定されたキーの下でmy-elisp-map
使用できるようにします。 2 番目のケースでは、これがbind-map-default-evil-states
で指定されているデフォルトであるため、使用される悪の状態も通常のモーションとビジュアルになります。ロードされるマイナー モード、またはメジャー モードとマイナー モードの混合を条件としてバインディングを作成することができます。モードのシンボルが使用されるため、この宣言の前にモードのパッケージがロードされていることを確認する必要はありません。その他のオプションについては、 bind-map
の docstring を参照してください。
このパッケージは、evil 関連キーワードの 1 つが指定されている場合にのみ、evil を使用します。たとえば、この宣言では、evil パッケージは使用されていません。
(bind-map my-elisp-map
:keys ( " M-m m " " M-RET " )
:major-modes ( emacs-lisp-mode
lisp-interaction-mode))
このパッケージの背後にある考え方は、組み込みモード マップとは別の一連のキーマップで個人的なバインディングを整理したいということです。たとえば、組み込みのdefine-key
を使用してmy-elisp-map
にキーを追加するだけで、上記のような宣言により、これらのバインディングが正しい場所で利用可能であることが保証されます。
意図したとおりに機能する組み込みのdefine-key
使用することもできます。 bind-key
(use-package の一部) は別のオプションです。別のインターフェイスが必要な場合は、 bind-map
マクロで:bindings
キーワードを使用するか、提供されている 2 つの関数bind-map-set-keys
およびbind-map-set-key-defaults
使用できます。どちらも単にdefine-key
使用します。 define-key
内部的には使用されますが、多くの構文を使用せずに複数のバインディングを許可します。
(bind-map my-base-leader-map
:keys ( " M-m " )
:evil-keys ( " SPC " )
:evil-states (normal motion visual)
:bindings ( " c " 'compile
" C " 'check ))
(bind-map-set-keys my-base-leader-map
" c " 'compile
" C " 'check
; ; ...
)
; ; is the same as
; ; (define-key my-base-leader-map (kbd "c") 'compile)
; ; (define-key my-base-leader-map (kbd "C") 'check)
; ; ...
(bind-map-set-key-defaults my-base-leader-map
" c " 'compile
; ; ...
)
; ; is the same as
; ; (unless (lookup-key my-base-leader-map (kbd "c"))
; ; (define-key my-base-leader-map (kbd "c") 'compile))
; ; ...
2 番目の関数は、そのキーの既存のバインディングが存在しない場合にのみバインディングを追加します。これはおそらく、デフォルトのバインディングを提供したいが、そのバインディングでユーザーが作成したバインディングを上書きしたくない共有構成の場合にのみ役立ちます。どちらの関数のキーも、バインドする前にkbd
に渡される文字列であることに注意してください。
複数のbind-map
宣言を使用すると、 :evil-keys
や:evil-states
などのプロパティを繰り返すことになる場合があります。次の例に示すように、 bind-map-for-mode-inherit
を使用して、親マップからこれらのプロパティを自動的に取得できます。詳細については、docstring を参照してください。
(bind-map my-leader-map
:keys ( " M-m " )
:evil-keys ( " SPC " )
:evil-states (normal motion visual))
(bind-map-for-mode-inherit my-markdown-map my-leader-map
:major-modes ( markdown-mode ))