次: , 前: Minibuffer Maps, 上: Key Bindings


28.4.5 キーバインディングの対話的な変更

Emacsのキーを再定義するには、キーマップの対応する項目を 変更すればよいのです。 グローバルキーマップを変更すると、その変更は (同じキーに対して独自のローカルな定義をしているメジャーモードを除く) すべてのメジャーモードに影響します。 あるいは、カレントバッファのローカルマップを変更すると、 同じメジャーモードを使っているすべてバッファに影響が及びます。

M-x global-set-key <RET> key cmd <RET>
cmdを実行するようにkeyをグローバルに定義する。
M-x local-set-key <RET> key cmd <RET>
cmdを実行するようにkeyを(現在のメジャーモードで) ローカルに定義する。
M-x global-unset-key <RET> key
keyをグローバルマップで未定義にする。
M-x local-unset-key <RET> key
keyを(現在のメジャーモードで)ローカルに未定義にする。

たとえば、Emacsを休止してログインシェルでコマンドを実行するかわりに、 Emacsバッファ内のサブシェルでコマンドを実行したいとします。 通常、(Xウィンドウシステムを使っていない場合)C-zは 関数suspend-emacsにバインドされていますが、 つぎのようにこのキーをshellにバインドすれば、 このキーでEmacs内の対話的サブシェルを起動するように変更できます。

     M-x global-set-key <RET> C-z shell <RET>

global-set-keyはキー列に続けてコマンド名を読み取ります。 使いたいキーを打鍵すると、どのキーをバインドしたいのかを 確認するつぎのようなメッセージが表示されます。

     Set key C-z to command:

同じ手順で、ファンクションキーやマウスイベントを再定義できます。 バインドすべきキーを指定するときに、 キーのかわりにファンクションキーを押したりマウスボタンをクリックしてください。

複数イベントから成るキーも単一イベントのキーと同様にして再定義できます。 Emacsは再定義すべきキー列が完成するまで(つまりプレフィックスキーではない キーが出てくるまで)イベントを読み続けます。 たとえば、keyとしてC-fを打てばそれで終りですから、 ミニバッファはただちにcmdを読む状態になります。 一方、C-xを打つとさらにその先のキーを読みます。 そこで4を打つと、さらにその先のキーが読まれる、というようになります。 たとえば、

     M-x global-set-key <RET> C-x 4 $ spell-other-window <RET>

では、C-x 4 $を(実在しない)コマンドspell-other-windowに バインドします。

C-cに続けて英字という2文字のキー列は、 ユーザーのカスタマイズ用に予約されています。 Lispプログラムはこれらのキー列を定義しないことになっていますから、 これらのキー列のバインディングはどのメジャーモードでも使え、 いかなる機能とも干渉しないはずです。

global-unset-keyでキーのグローバルな定義を取り除けます。 そのキーは未定義になります。 未定義のキーを打つと、Emacsはベルを鳴らします。 同様に、local-unset-keyは現在のメジャーモードでキーを 未定義にしますから、グローバルな定義(あるいはグローバルでの未定義状態)が 現在のメジャーモードでふたたび有効になります。

キーを再定義(または未定義に)して、あとでもとに戻したいと思った場合、 キーを未定義にしてももとには戻りません。 キーの標準定義を設定し直す必要があります。 キーの標準定義を調べるには、基本(fundamental)モードのバッファに いってC-h cを使います。 本書のキーの説明にもコマンド名を掲載してあります。

まちがって、あるコマンドを実行することを防ぎたければ、 キーを未定義にするのでなく、コマンドを使用禁止にするのがよいでしょう。 必要になったときに使用禁止コマンドを起動するのは造作もありません。