Next: , Previous: , Up: Key Bindings   [Contents][Index]


48.3.6 キーのリバインド

いつでも使いたいキーバインドがある場合、初期化ファイルにLispコードを記述することにより、それらを指定できます。初期化ファイルの説明については、Init Fileを参照してください。

Lispを使用してキーバインディングを記述するには、いくつかの方法があります。一番簡単なのはkbd関数を使う方法で、これはキーシーケンスのテキスト表現 — このマニュアルでキーシーケンスを記述するのと同様な方法 — を、global-set-keyの引数として渡す形式に変換します。たとえば以下は、C-zshellコマンド(Interactive Shellを参照してください)にバインドする方法の例です:

(global-set-key (kbd "C-z") 'shell)

コマンド名shellの前のシングルクォートは、それを変数ではなくシンボル定数としてマークします。クォートを省略した場合、Emacsはshellを変数として評価しようとします。これはおそらくエラーを引き起こし、もちろんあなたはそれを望まないはずです。

以下に、ファンクションキーやマウスイベントなどを含めた、追加の例を示します:

(global-set-key (kbd "C-c y") 'clipboard-yank)
(global-set-key (kbd "C-M-q") 'query-replace)
(global-set-key (kbd "<f5>") 'flyspell-mode)
(global-set-key (kbd "C-<f5>") 'linum-mode)
(global-set-key (kbd "C-<right>") 'forward-sentence)
(global-set-key (kbd "<mouse-2>") 'mouse-save-then-kill)

kbdを使うかわりに、キーシーケンスの指定にLisp文字列やベクターを使用することができます。文字列を使用するのは単純ですが、これはASCII文字とメタ修飾されたASCII文字だけで機能します。たとえば以下は、C-x M-lmake-symbolic-link(Misc File Opsを参照してください)にバインドする方法の例です:

(global-set-key "\C-x\M-l" 'make-symbolic-link)

文字列内にTABRETESCDELを記述するには、Emacs Lispのエスケープシーケンス‘\t’、‘\r’、‘\e’、‘\d’を使用します。以下は、C-x TABindent-rigidly(Indentationを参照してください)にバインドする例です:

(global-set-key "\C-x\t" 'indent-rigidly)

キーシーケンスがファンクションキーやマウスボタンイベント、またはC-=H-aのような非ASCII文字を含む場合、キーシーケンスを指定するのにベクターを使用することができます。ベクター内の各要素は入力イベントを意味します。要素はスペースで区切られ、一対の角カッコ(square brackets)で囲まれます。ベクターの要素が文字の場合は、それをLisp文字定数、つまり‘?’の後ろにその文字を、文字列内で表記されるような方法で記述します。ファンクションキーはシンボルで表され(Function Keysを参照してください)、他の区切り文字や句読点なしで、単にシンボル名を記述します。以下に例をいくつか示します:

(global-set-key [?\C-=] 'make-symbolic-link)
(global-set-key [?\M-\C-=] 'make-symbolic-link)
(global-set-key [?\H-a] 'make-symbolic-link)
(global-set-key [f7] 'make-symbolic-link)
(global-set-key [C-mouse-1] 'make-symbolic-link)

単純な場合でもベクターを使用できます:

(global-set-key [?\C-z ?\M-l] 'make-symbolic-link)

ASCII文字にたいするキーバインディングは、言語とコーディングシステムに問題を起こすかもしれません。 Init Non-ASCIIを参照してください。

Local Keymapsで説明したように、メジャーモードとマイナーモードはローカルキーマップを定義できます。これらのキーマップは、セッションで最初にそのモードが使用されるときに構築されます。これらのキーマップを変更したい場合は、モードフック(mode hook)を使用しなければなりません(Hooksを参照してください)。

たとえばTexinfoモードは、フックtexinfo-mode-hookを実行します。以下はTexinfoモードで、C-c nC-c pにローカルバインディングを追加するために、どのようにフックを使用できるかの例です:

(add-hook 'texinfo-mode-hook
          (lambda ()
            (define-key texinfo-mode-map "\C-cp"
                        'backward-paragraph)
            (define-key texinfo-mode-map "\C-cn"
                        'forward-paragraph)))