Next: , Previous: , Up: キーバインディングのカスタマイズ   [Contents][Index]


49.3.6 initファイル内でのキーのリバインド

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

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

(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>") 'display-line-numbers-mode)
(global-set-key (kbd "C-<right>") 'forward-sentence)
(global-set-key (kbd "<mouse-2>") 'mouse-save-then-kill)

キーシーケンスの指定に、kbdではなくLisp文字列やベクターを使うこともできます。文字列を使うほうが単純ですが、ASCII文字とMeta修飾されたASCII文字にたいしてのみ機能します。たとえば以下の方法ではmake-symbolic-link (ファイルのコピー、命名、リネーム。を参照)にC-x M-lをバインドしています:

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

同様にコマンドではなくキーシーケンスにたいしてLisp文字列やベクターをバインドすることもできます。ベクターが必要になるのは意図する結果に非ASCII文字が含まれる場合だけであり、そのようなベクターの作成にもkbdを使うことができます。たとえば文字列‘hello’にC-c hをバインドするには:

(global-set-key (kbd "C-c h") "hello")

しかし文字列‘olá’にバインドするには:

(global-set-key (kbd "C-c h") (kbd "olá"))

TABRETESCDELを含んだキーシーケンスをバインドするためには、その文字列にそれぞれ‘\t’、‘\r’、‘\e’、‘\d’というEmacs Lispのエスケープシーケンスが含まれている必要があります。以下はindent-rigidly (インデントを参照)にC-x TABをバインドする例です:

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

ファンクションキーやマウスボタンイベント、あるいはC-=H-aのような非ASCII文字をキーシーケンスに含めるには、キーシーケンスの指定にベクターを用いることができます。ベクターの要素はそれぞれ1つの入力イベントを意味しており、それらの要素は空白で区切られて角カッコのペアーで括られています。ベクターの要素が文字であればLispの文字定数(文字列内に表示される際の文字の前に‘?’を前置したフォーマット)として記述してください。ファンクションキーはシンボルとして表現されます(ファンクションキーのリバインドを参照)。単にそのシンボルの名前を記述します。他の区切り文字や句読点文字をつける必要はありません。以下に例を示します。

(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-x ?\M-l] 'make-symbolic-link)

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

ローカルキーマップで説明したように、メジャーモードとマイナーモードはローカルキーマップを定義できます。これらのキーマップは、セッションで最初にそのモードがロードされるときに構築されます。特定のキーマップで変更を行うために関数define-keyを使用できます。この関数にバインディングとしてnilを渡せばキーバインディングの削除(unset)もできます。

モードのキーマップはモードがロードされるまで構築されないので、キーマップを変更するコードをモードフック(mode hook)に配置することにより実行を遅延しなければなりません(フックを参照)。たとえばTexinfoモードは、フックtexinfo-mode-hookを実行します。以下はTexinfoモードでC-c nC-c pにローカルバインディングを追加、C-c C-x xのローカルバインディングを削除するために、どのようにフックを使用できるかの例です:

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