カスタマイズ
******

本章では、Emacsの動作を（あまり大幅でなく）カスタマイズする方法について説明します。もっと大幅な変更を行いたい場合には The Emacs Lisp Reference Manualを参照してください。

カスタマイズは、Emacsの1つのセッションの中だけで効果を持ちます。 Emacsを終了するとカスタマイズの効果は失われますし、同時にあるいはあとで別のEmacsを立ち上げた場合にも何の影響も及ぼしません。あるEmacsのセッションがセッションを超えて影響するためには、ファイルに書くしかありません。特に、カスタマイズを『恒久化』したい場合には、個人の.emacsファイルやその他の関連するファイルに適切な内容を書き込んでおき、セッションごとにカスタマイズが行われるようにします。 See Init File。

マイナモード（minor mode）
==================

マイナモードは、個別にオン／オフ可能な機能です。たとえば、マイナモードである自動詰め込み（auto-fill）モードをオンにすると、 SPCで自動的に（単語の切れ目で）行分けします。すべてのマイナモードは互いに独立ですし、どのメジャーモードとも独立です。ほとんどのマイナモードは、それがオンであることをモード行に表示します。たとえば、モード行にFillと表示されていれば、自動詰め込み（auto-fill）モードがオンであることを意味します。

マイナモード名のうしろに-modeを付け加えると、そのモードをオン／オフするコマンド関数の名前になります。したがって、自動詰め込み（auto-fill）モードをオン／オフするコマンドは M-x auto-fill-modeということになります。これらのコマンドは通常M-xを使って起動しますが、どれかのキーにバインドすることもできます。引数を指定しないと、これらのコマンドはモードがオフのときはオンに、オンのときはオフに切り替えます。これをトグルすると呼びます。これに対し、正の引数を指定するとつねにモードをオンにしますし、明示的に0の引数を指定するか、または負の引数を指定するとつねにモードをオフにします。

いくつかのマイナモードのオン／オフは、カレントバッファに対してのみ適用され、他のバッファには影響しません。つまり、あるバッファであるモードをオンにし、別のバッファではそのモードをオフにできるわけです。このような、バッファごとにオン／オフできるマイナモードとしては、略語（abbrev）モード、自動詰め込み（auto-fill）モード、自動保存（auto-save）モード、フォントロック（font-lock）モード、 ISOアクセント（iso-sccents）モード、アウトライン（outline）マイナモード、上書き（overwrite）モード、バイナリ上書き（binary-overwrite）モードがあります。

略語（abbrev）モードでは、略語を打ち込むと自動的に展開されるような略語を定義できます。たとえば、amdをabbrev modeと展開させます。詳しくは、see Abbrevs。

自動詰め込み（auto-fill）モードでは、いちいち改行で行分けしなくてもテキストを詰め込んで入力できます。行が長くなりすぎないようにEmacsが適宜改行を挿入します。 See Filling。

自動保存（auto-save）モードはバッファの内容を定期的に保存することで、システムクラッシュが起きたとき紛失してしまう作業の量を少なくします。 See Auto Save。

エンリッチ（enriched）モードは、整形済みテキストの編集を可能にします。 See Formatted Text。

フライスペル（flyspell）モードは、綴りに誤りのある単語を自動的に強調表示します。

フォントロック（font-lock）モードは、コメント、文字列、定義中の関数名などのプログラム中の決まった単位を自動的に強調表示します。これには、複数のフォントを表示できるウィンドウシステムが必要です。 See Faces。

水平スクロール（hscroll）モードは、ポイントが画面内に留まるように、自動的に水平スクロールを行います。 See Horizontal Scrolling。

ISOアクセント（iso-accents）モードは、`、'、 "、 ^、/、~とこれらに続くつぎの文字を結合して、 ISO Latin-1文字集合のアクセント付き文字を作り出します。 See Single-Byte European Support。

アウトラインマイナ（outline-minor）モードは、メジャーモードであるアウトライン（outline）モードと同じ機能を提供します。しかし、マイナモードなので任意のメジャーモードと一緒に使えます。 See Outline Mode。

上書き（overwrite）モードでは、入力された図形文字は既存の文字を右に押しやるかわりにその文字を置き換えます。たとえば、ポイントがFOOBARのBのまえにあるときに Gを打つとFOOGARとなります。通常のモードであればFOOGBARとなります。上書き（overwrite）モードでコマンドC-qを打つと、そのつぎの文字が何であっても（数字であっても）その文字を挿入します。つまり、上書き（overwrite）モードの中で文字を挿入するにはこの方法を使います。

バイナリ上書き（binary-overwrite）モードは上書き（overwrite）モードの変形で、バイナリファイル編集用です。このモードでは、改行やタブも他の文字と同じに扱われるので、他の文字をこれらの文字で上書きすることも、これらの文字を他の文字で上書きすることもできます。

以下で説明するマイナモードは、すべてのバッファに一斉に適用されます。ただし、これらは変数の値に応じてオン／オフされますから、その変数をバッファにローカルな変数にすれば、バッファごとに独立にオン／オフすることも可能です。 See Locals。

補完示唆（icomplete）モードは、ミニバッファで入力中に補完機能が働いているとき、どのような補完候補があるかを表示します。 See Completion Options。

行番号（line-number）モードは、ポイントのある行の行番号を絶えずモード行に表示します。 See Mode Line。

ミニバッファリサイズ（resize-minibuffer）モードは、打ち込んだテキスト量に応じて自動的にミニバッファを広げます。 See Minibuffer Edit。

スクロールバー（scroll-bar）モードは、各ウィンドウにスクロールバーを付けます（see Scroll Bars）。メニューバー（menu-bar）モードは、各フレームにメニューバーを付けます（see Menu Bars）。どちらのモードも、Xウィンドウシステムを使っているときはデフォルトでオンになっています。

暫定マーク（transient-mark）モードでは、バッファの内容を変更するとマークは『不活性』になるので、そのあとでリージョンを対象とするコマンドを使うとエラーになります。つまり、リージョンを対象とするコマンドを使うまえに、改めてマークを設定するか、不活性になったマークを『再度活性』にします。暫定マーク（transient-mark）モードの利点は、（今のところXウィンドウシステムを使っているときのみ） Emacsがリージョンを強調表示することです。 See Setting Mark。

ほとんどのマイナモードには、コマンド名と同じ名前の変数があり、その変数でモードを直接制御しています。つまり、その変数の値がnil以外ならモードはオンであり、各マイナモードコマンドは変数の値を設定する動作をします。たとえば、コマンドoutline-minor-modeは、変数outline-minor-modeの値を設定する動作を行います。つまり、この変数が、直接、上書き（overwrite）モードをオン／オフしているのです。あるマイナモードがこのように動作するかどうかは、 C-h vを使ってその変数の説明文字列を参照してください。

これらのマイナモード変数は、Lispプログラムからモードをオン／オフするのに有用です。また、ファイルのローカル変数リストとして指定するのも便利です。ただし、ローカル変数リストで設定する場合には、よく考えてください。というのは、ほとんどのマイナモードはユーザーの好みの問題であり、同じファイルを編集する別のユーザーは好みが違うかもしれません。

変数
==

変数は値を持つLispシンボル（記号）です。そのシンボルの名前のことを、変数名とも呼びます。変数名はファイルに入れられるどのような文字でも含むことができますが、習慣的には、変数名は英単語をハイフンでつなげたものです。変数には、その変数がどのような値を持ち、どのように使われるかを記述した説明文字列を持たせることができます。

Lispではどの変数にどのような値でも格納できますが、 Emacsの中ではほとんどの変数はどのような値を持つかが決まっています。たとえば、ある変数はつねに文字列である、別の変数は数値であるといった具合です。また、「これこれの機能はこの変数がnil以外のときにオンになる」といういい方もします。その場合は、その変数にnilが格納されているときはその機能はオフですが、それ以外のどんな値が格納されているときでもその機能はオンになります。ですが、ある機能をオンにするために使う値として何か選ばなければなりませんから、tという値を使うのが習慣です。

Emacsは一般のLispプログラムと同様、内部で情報を保持するために数多くの変数を使いますが、ユーザーにとって特に興味深い変数というのは、もっぱらカスタマイズ向けに用意された変数だといえます。 Emacsは（通常は）そのような変数の値を変更しません。かわりに、ユーザーが値を設定すると、その値に応じてさまざまなEmacsコマンドのふるまいを変更したり制御したりできるのです。これらの変数のことをユーザーオプションといいます。ほとんどのユーザーオプションはこのマニュアルに記載してありますし、変数索引（see Variable Index）にも記載してあります。

ユーザーオプションであるような変数の例としてfill-columnがあります。この変数は、詰め込みコマンド（see Filling）が使う右端の桁位置を（左端から何文字右かを表す数値として）保持します。

変数の設定と参照
--------

C-h v VAR RET
     変数VARの値と説明文字列を表示する（describe-variable）。

M-x set-variable RET VAR RET VALUE RET
     変数VARの値をVALUEに変更する。

特定の変数の値を見るには、C-h v（describe-variables）を使います。このコマンドは、ミニバッファで補完機能付きで変数名を読み取ります。変数の値と説明文字列の双方を表示します。たとえば、

     C-h v fill-column RET

とすると、つぎのように表示されます。

     fill-column's value is 75

     Documentation:
     *Column beyond which automatic line-wrapping should happen.
     Automatically becomes buffer-local when set in any fashion.

説明文の先頭にある*は、この変数がユーザーオプションであることを示します。 C-h vは、ユーザーオプションに限らず任意の変数を扱えます。

ユーザーオプションを設定するいちばん簡単な方法はM-x set-variableを使うことです。このコマンドは、まずミニバッファで（補完機能付きで）変数名を読み取り、つぎにミニバッファで変数に設定するLisp式を読み取ります。たとえば、

     M-x set-variable RET fill-column RET 75 RET

とすると、fill-columnに75を設定します。

M-x set-variableはユーザーオプションに対してだけ使えます。これに対し、setqを使えばどの変数にでも値が設定できます。たとえば、setqを使ってfill-columnに設定するにはつぎのようにします。

     (setq fill-column 75)

このような式を実行するには、*scratch*バッファにいき、式を打ち込んでからC-jを打ちます。 See Lisp Interaction。

変数を設定することは、特記していない限り、他のカスタマイズ方法と同様に、現在のEmacsセッションだけに影響します。

簡便なカスタマイズ方法
-----------

変更したいユーザーオプション変数をみつけて値を変更する便利な方法は、 M-x customizeを使うことです。このコマンドはカスタマイズバッファを作成し、そのバッファ内では論理的な順序に並べたEmacsのユーザーオプションを眺めてまわることができますし、さらに値を編集して設定できます。また、カスタマイズバッファを使えば設定を恒久的なものとして保存もできます。（まだこの機能で扱えないユーザーオプションもあるが、それらも扱えるように現在作業中。）

カスタマイズグループ
..........

カスタマイズのために、ユーザーオプションをグループにまとめてみつけやすくしてあります。グループはさらに大きなグループにまとめられていて、いちばん大きな（すべてのグループを含む）グループは Emacsという名前です。

M-x customizeは、トップレベルのEmacsグループおよびその直下の（第2レベルの）グループを表示したカスタマイズバッファを作成します。その表示はつぎのようになります。

     /- Emacs group: ---------------------------------------------------\
           [State]: visible group members are all at standard settings.
        Customization of the One True Editor.
        See also [Manual].

     Editing group: [Go to Group]
     Basic text editing facilities.

     External group: [Go to Group]
     Interfacing to external utilities.

     MORE SECOND-LEVEL GROUPS

     \- Emacs group end ------------------------------------------------/

この表示の先頭部分は、このバッファがEmacsグループの内容を表示していることを記しています。残りのグループが表示されるのは、それらがEmacsグループに含まれているからです。ただし、それらは字下げや「-」なしで表示されていて、表示にはそれらのグループの内容が含まれてはいないことを示しています。各グループの表示には1行の説明文字列が付随しています。また、Emacsグループについては[State]行が付随しています。

カスタマイズバッファ内のテキストのほとんどは変更できませんが、一部分は編集可能フィールドになっていて、変更できます。また、アクティブフィールドという、その場所を起動するとなんらかの動作を行うような場所もあります。アクティブフィールドを起動するには、 Mouse-1でそこをクリックするか、またはそこにポイントを持っていってRETを打ちます。

たとえば、第2レベルグループ中の[Go to Group]と記された部分はアクティブフィールドです。 [Go to Group]のフィールドを起動すると、そのグループとそのグループの内容を表示する新しいカスタマイズバッファが作られ、そのグループと中身が表示されます。このフィールドは他のグループへのハイパーテキストリンクの一種です。

Emacsグループそのものはユーザーオプションを1つも含んでいませんが、他のグループにはあります。さまざまなグループを眺めてみると、興味を持ってカスタマイズしてみようと思うような機能に属するオプションやフェイスをみつけることができるでしょう。

カスタマイズグループ群の構造を概観するには、 M-x customize-browseを使います。このコマンドは、グループ名（とオプションやフェイス）とそれらの構造だけを表示する特別なカスタマイズバッファを作ります。

このバッファ中では、グループの中身を見るには[+]のところを起動します。グループの中身が見えるようになると、このボタンは[-]に変わります。これを起動すると中身を（もとどおり）隠します。

各グループ、オプション、フェイスにはそれぞれ[Group]、 [Option]、[Face]と記されたアクティブフィールドがあります。それらを起動すると、そのグループ／オプション／フェイスのみを表示した通常のカスタマイズバッファが作成されます。そのバッファで値を設定します。

オプションの変更
........

カスタマイズバッファでユーザーオプションがどのように見えるか、例をあげましょう。

     Kill Ring Max: [Hide] 30
        [State]: this option is unchanged from its standard setting.
     Maximum length of kill ring before oldest elements are thrown away.

[Hide]に続くテキスト、つまり、30がオプションの現在の値を示しています。 [Hide]ではなく[Show]と表示されていれば、値は隠されています。カスタマイズバッファでは、複数行にわたるような値は最初は隠されていて、 [Show]を起動すると表示されます。

オプション名に続く行はオプションのカスタマイズ状態を示しています。上の例では、まだ変更していないと表示されています。行頭の[State]のところがアクティブフィールドで、ここをMouse-1かRETで起動するとさまざまな操作を示すメニューが表示されます。これらの操作は変数をカスタマイズするうえでとても重要です。

[State]のつぎの行には、そのオプションの説明文字列の先頭部分が表示されます。 1行に収まらない場合には、行末に[More]と表示されます。これを起動すると説明文字列全体が表示されます。

Kill Ring Maxに新しい値を設定するには、ポイントを値の位置へ持っていって直接文字列を変更します。たとえば、M-dで現在の値を削除してから、設定する数値を打ち込めばよいのです。

文字列を変更し始めると、[State]行の表示が変わって、値が編集されていることを示すようになります。

     [State]: you have edited the value as text, but not set the option.

文字列を変更しただけでは、まだオプション変数の値は設定されません。値を設定するには、[State]のところを起動して、 Set for Current Sessionを選択します。

値を設定すると、オプションの状態表示も対応して変わります。

     [State]: you have set this option, but not saved it for future sessions.

正しくない値を設定してしまう心配はありません。というのは、オプションの設定時には、値の正しさを検査して、正しくない値は設定できないようになっています。

ディレクトリ名、ファイル名、コマンド名である値やフィールドを編集するとき、および、その他何であれ補完が定義されているものを編集するときは、 M-TAB（widget-complete）を打てば補完できます。

いくつかのオプションでは、正しい値としては決まった少数のものだけを使えます。そのようなオプションは、テキストとしては編集できません。かわりに[Value Menu]というアクティブフィールドが値のまえに現れます。『オンかオフ』だけの真偽値を持つオプションでは、アクティブフィールドは[Toggle]と表示されていて、そこを起動するたびに値を反転できます。 [Value Menu]も[Toggle]もバッファを変更するだけです。値が実際に設定されるのはSet for Current Sessionを起動したときです。

いくつかのオプションは、込み入った構造の値を持ちます。たとえば、load-pathは値としてディレクトリのリストを持ちます。これをカスタマイズバッファに表示すると、つぎのようになります。

     Load Path:
     [INS] [DEL] [Current dir?]: /usr/local/share/emacs/20.3/site-lisp
     [INS] [DEL] [Current dir?]: /usr/local/share/emacs/site-lisp
     [INS] [DEL] [Current dir?]: /usr/local/share/emacs/20.3/leim
     [INS] [DEL] [Current dir?]: /usr/local/share/emacs/20.3/lisp
     [INS] [DEL] [Current dir?]: /build/emacs/e20/lisp
     [INS] [DEL] [Current dir?]: /build/emacs/e20/lisp/gnus
     [INS]
        [State]: this item has been changed outside the customization buffer.
     List of directories to search for files to load....

リスト中の各ディレクトリがそれぞれ別の行に表示され、各行にはいくつかの編集可能／アクティブフィールドがあります。

どのディレクトリ名も直接編集できます。リストからディレクトリを削除するには、その行の[DEL]を起動します。リストに新しいディレクトリを追加するには、挿入したい箇所の[INS]を起動します。

[Current dir?]を起動すると、パスに特定のディレクトリを含めるのか、または、nilを含めるのかを切り替えられます。（探索パスにおけるnilは、『カレントディレクトリを探せ』という意味。）

2つの特別なコマンド、TABとS-TABは、カスタマイズバッファ内での移動に役立ちます。 TAB（widget-forward）はつぎのアクティブ／編集可能フィールドへ移動します。 S-TAB（widget-backward）は、 1つまえのアクティブ／編集可能フィールドへ移動します。

編集可能フィールドでRETを打つと、 TABと同様につぎのフィールドへ進みます。なぜそうなっているかというと、編集可能フィールドを編集し終えると最後にRETを打つ人が多いからです。編集可能フィールドに改行文字を入るには、 C-oかC-q C-jと打ちます。

オプションを設定すると、その値は現在のEmacsセッションだけに有効です。その値を保存すると、将来のセッションでも有効になります。保存を行うと、個人の~/.emacsファイルにコードが追加されて、つぎにEmacsを起動したときにオプション変数の値を設定するようになります。オプションを保存するには、[State]を起動して Save for Future Sessionsを選びます。

オプションを標準値に戻したければ、[State]を起動して Reset to Standard Settingsを選びます。実際にはつぎの3種類のリセット操作があります。

Reset
     なんらかの修正を行ったが、まだオプションを設定していなければ、この操作により、カスタマイズバッファ上のテキストをオプションの現在値と一致させられる。

Reset to Saved
     この操作では、オプションの値を最後に保存した値に戻し、カスタマイズバッファ上のテキストもその値に合わせる。

Reset to Standard Settings
     この操作では、オプションを標準値に設定し、カスタマイズバッファ上のテキストもその値に合わせる。さらに、以前にそのオプションについて保存した値もすべてもとに戻されるので、将来のEmacsセッションでもすべて標準値が使われるようになる。

グループの[State]はそのグループに属するもののどれかが編集された／設定された／保存されたことを示します。 Set for Current Session、Save for Future Sessions、および各種のResetをグループ全体に対して適用できます。これらの操作はグループおよびそのサブグループに属するすべてのオプションに対して適用されます。

カスタマイズバッファの先頭付近には、いくつかのアクティブフィールドを含んだつぎのような行があります。

      [Set for Current Session] [Save for Future Sessions]
      [Reset] [Reset to Saved] [Reset to Standard]   [Bury Buffer]

[Bury Buffer]を起動すると、カスタマイズバッファを消します。他のフィールドは、そのバッファに含まれている項目それぞれについてそれぞれ、設定、保存、リセットを（それらの操作が適用可能なら）実行します。

フェイスのカスタマイズ
...........

いくつかのカスタマイズグループは、ユーザーオプションに加えてフェイスも含みます。グループの内容を表示したとき、オプションとフェイスの両方がカスタマイズバッファに現れます。フェイスの見え方は、たとえばつぎのようになります。

     Custom Changed Face: (sample)
        [State]: this face is unchanged from its standard setting.
     Face used when the customize item has been changed.
     Attributes: [ ] Bold: [toggle] off
                 [X] Italic: [toggle] on
                 [ ] Underline: [toggle] off
                 [ ] Inverse-Video: [toggle] on
                 [ ] Foreground: black (sample)
                 [ ] Background: white (sample)
                 [ ] Stipple:

フェイスの各属性はそれぞれが1行を占めます。属性のまえの[X]というフィールドは、その属性がオンになっているかどうかを表示しています。 Xが表示されていればオンになっています。そのフィールドを起動することでオン／オフを反転できます。属性がオンになっている場合は、その属性の値をオプションと同様にして変更できす。

白黒ディスプレイでは、背景に設定可能な表示色はblack、 white、gray、gray1、gray3のいずれかです。 Emacsは表示色のかわりにドットパターンで灰色の階調を表します。

フェイスを設定／保存／リセットするのは、オプションと同様にしてできます（see Changing an Option）。

フェイスでは、ディスプレイの種別ごとに異なる見え方を指定できます。たとえば、あるフェイスをカラーディスプレイでは赤で表示し、白黒ディスプレイではかわりにボールド体で表示するようにできます。あるフェイスに複数の見え方を指定するには、 [State]メニューを表示させてShow Display Typesを選びます。

フェイスの属性を設定するもっと基本的な方法は、 M-x modify-faceを使うことです。このコマンドは、まずフェイスの名前を聞いてきて、続いて属性を1つずつ順に聞いてきます。表示色やパターンの属性では、その属性の現在の値がデフォルトになっています。これらを変更したくなければ、単に、RETを打てばよいのです。属性を空にしたければnoneと打ちます。

特定項目のカスタマイズ
...........

グループ構造を1段ずつ降りていって目指すオプションを探すかわりに、カスタマイズしたいオプション／フェイス／グループの名前を直接に指定することもできます。

M-x customize-option RET OPTION RET
     指定したオプションOPTIONだけを含むカスタマイズバッファを開く。

M-x customize-face RET FACE RET
     指定したフェイスFACEだけを含むカスタマイズバッファを開く。

M-x customize-group RET GROUP RET
     指定したグループGROUPだけを含むカスタマイズバッファを開く。

M-x customize-apropos RET REGEXP RET
     指定した正規表現REGEXPに一致するすべてのオプション／フェイス／グループを含むカスタマイズバッファを開く。

M-x customize-changed-options RET VERSION RET
     EmacsのバージョンVERSION以降に意味が変更されたすべてのオプション／フェイス／グループを含むカスタマイズバッファを開く。

M-x customize-saved
     カスタマイズバッファで保存したすべてのオプションとフェイスを含むカスタマイズバッファを開く。

M-x customize-customized
     カスタマイズしたが、まだ保存していないすべてのオプションとフェイスを含むカスタマイズバッファを開く。

名前のわかっているオプション変数をカスタマイズバッファで変更したい場合は、コマンドM-x customize-optionで直接名前を指定します。これにより、そのオプションだけを含むカスタマイズバッファが現れます。編集／設定／保存はこれまで説明したとおりに行いますが、設定の対象になるのは指定したオプションだけです。

同様にして、M-x customize-faceではフェイス名を指定して変更できます。

同様に、M-x customize-groupではグループ名を指定してカスタマイズバッファを開くことができます。そのカスタマイズバッファには、指定したグループに直接含まれているオプション、フェイス、他の（下位の）グループが現れます。ただし、サブグループの内容は最初は隠されています。それらを表示したい場合は、通常どおり[Show]を起動します。

M-x customize-aproposを使うと、カスタマイズするものをもっと細かく制御できます。このコマンドでは引数として正規表現を指定し、それに一致するすべてのオプション／フェイス／グループを含んだカスタマイズバッファが現れます。空の正規表現を指定すると、すべてのオプション／フェイス／グループを含むカスタマイズバッファができます（ただしすごく時間がかかる）。

Emacsの新版へ更新したときには、新しいオプション、意味やデフォルト値が変更されたオプションをカスタマイズしたいはずです。それには、M-x customize-changed-optionsを使い、ミニバッファで以前の版のEmacsのバージョン番号を指定します。すると、指定したバージョン以降に定義が変更されたすべてのオプション（とグループ）を含んだカスタマイズバッファを作ります。

オプションを変更したあとでまちがったと気づいたときは、変更したものを再検討するために2つのコマンドが使えます。保存してしまったオプションについてはcustomize-savedを、変更したけれどまだ保存していないオプションについては M-x customize-customizedを使います。

フック
---

フックとはある特定の状況で既存のプログラムから呼び出される関数／関数群を格納しておく変数をいいます。 Emacsには、カスタマイズ用のフックが数多くあります。

Emacs中のほとんどのフックはノーマルフックです。これらの変数は、引数なしで呼び出される関数のリストを保持します。ほとんどのフックがノーマルフックなのは、それらを統一的に扱えるからです。 Emacsでは、-hookで終わる名前の変数はすべてノーマルフックです。

ほとんどのメジャーモードは初期設定の最終段階でフックを実行します。モードが設定したローカル変数をフックで変更すればよいので、モードのふるまいをユーザーがカスタマイズすることが容易になります。しかし、フックはそれ以外の場面でも使われます。たとえば、suspend-hookは、Emacsが休止する直前に実行されます（see Exiting）。

ノーマルフックにフック関数を追加するお勧めのやり方は、 add-hookを呼ぶことです。フック関数としては任意のLisp関数を使えます。たとえば、テキスト（text）モードやテキスト（text）モードを基にしているモードにおいて、自動的に自動詰め込み（auto-fill）モードをオンにするにはつぎのようにします

     (add-hook 'text-mode-hook 'turn-on-auto-fill)

つぎの例は、Cコードの字下げをカスタマイズするのにフックを使う方法を示します。（誰でも字下げには独自の好みがある）。ここでは、フック関数は名前のないラムダ式です。

     (setq my-c-style
       '((c-comment-only-line-offset . 4)

         (c-cleanup-list . (scope-operator
     		       empty-defun-braces
     		       defun-close-semi))

         (c-offsets-alist . ((arglist-close . c-lineup-arglist)
     			(substatement-open . 0)))))

     (add-hook 'c-mode-common-hook
       (function (lambda ()
         (c-add-style "my-style" my-c-style t))))

どの順番で実行されても大丈夫なようにフック関数を設計するのが最良です。実行順序に依存するのは、『事故を呼び込む』ようなものです。しかし、順番は予測できます。もっとも最近に追加したフック関数ほど先に実行されます。

ローカル変数
------

M-x make-local-variable RET VAR RET
     変数VARがカレントバッファでローカルに値を持つようにする。

M-x kill-local-variable RET VAR RET
     変数VARがカレントバッファではグローバル値を使うようにする。

M-x make-variable-buffer-local RET VAR RET
     変数VARを、値を設定したときにその時点のカレントバッファでローカルに値を持つようにする。

ほとんどの変数はEmacsバッファに対してローカルにできます。つまり、その変数のバッファ中での値は他のバッファでの値とは独立になります。いくつかの変数はつねにすべてのバッファにおいてローカルです。それ以外の変数はすべて、グローバルな値、つまりその変数をローカルにしていないすべてのバッファにおいて共有される値を持ちます。

M-x make-local-variableは変数名を受け取り、その変数をカレントバッファにおいてローカルにします。それ以降、このバッファ内でその変数を変更しても他のバッファには影響しませんし、その変数のグローバルな値を変更してもこのバッファ内での値には影響しません。

M-x make-variable-buffer-localは、変数名を受け取り、値が設定されるとその変数が自動的にローカルになるようにします。もっと正確にいえば、このように特別な印を変数に付けておくと、通常の方法で変数に値を設定するときにはつねにまず make-local-variableが実行されるようになるのです。このような変数をバッファごとの変数と呼びます。

メジャーモード（see Major Modes）では、変数を設定するまえにつねにローカルにします。このため、あるバッファでメジャーモードを変更しても他のバッファには影響が及びません。マイナモード（see Minor Modes）も同様で、通常、マイナモードごとにオン／オフを制御する変数があり、その変数がnil以外のときにそのマイナモードはオンになります。ほとんどのマイナモードでは、その制御用変数はバッファごとの変数です。

Emacsには、つねにバッファごとの変数であるような変数が数多くあります。 abbrev-mode、auto-fill-function、case-fold-search、 comment-column、ctl-arrow、fill-column、 fill-prefix、indent-tabs-mode、left-margin、 mode-line-format、overwrite-mode、 selective-display-ellipses、selective-display、 tab-width、truncate-linesがそのような変数です。これ以外にもつねに各バッファでローカルな変数はありますが、それらは内部作業用の変数です。

いくつかの変数はディスプレイに対してローカルになっているため、バッファに対してローカルにはできません（see Multiple Displays）。これらの変数をバッファにローカルにしようとすると、エラーメッセージが表示されます。

M-x kill-local-variableは、変数名を受け取り、その変数をカレントバッファに対してローカルでなくします。それ以降そのバッファでは、その変数のグローバルな値が使われます。メジャーモードを設定すると、つねにローカルと印が付いた少数の特別な変数を除いて、そのバッファにローカルなすべての変数をローカルでなくします。

ある変数がカレントバッファでローカルか否かに係わらずその変数のグローバルな値を設定したければ、setq-defaultを使います。これはsetqのように使われますが、（たとえローカルな値があったとしても）つねにグローバルな値のほうを設定します。その変数がローカルな値を持っている場合、新たに設定したグローバルな値は別のバッファに切り替えるまでは参照できません。以下に例をあげます。

     (setq-default fill-column 75)

setq-defaultは、 make-variable-buffer-localで印を付けた変数のグローバルな値を設定する唯一の方法です。

Lispプログラム中では、変数のデフォルト値を参照するためには default-valueを使えます。この関数はシンボルを引数とし、その変数のデフォルト値を返します。引数は評価されるので、普通は引数をクォートします。たとえば、fill-columnのデフォルト値を取得するにはつぎのようにします。

     (default-value 'fill-column)

ファイルにローカルな変数
------------

Emacsでファイルを編集する際に、そのファイルに対応したローカル変数とその値を指定することができます。 Emacsはファイルを訪問すると、ローカル変数指定の有無を検査し、あれば指定された変数を自動的にバッファにローカルにして、その値をファイルで指定された値に設定します。

ローカル変数とその値を設定するには2つの方法があります。 1つはファイルの先頭行に書くことで、もう1つはローカル変数リストを書くことです。先頭行に書く場合は、たとえばつぎのようにします。

     -*- mode: MODENAME; VAR: VALUE; ... -*-

変数とその値を「:」で区切った対を「;」で区切って並べ、いくつでも指定できます。 mode: MODENAME;はメジャーモードを指定するもので、行の最初にある必要があります。 VALUEは評価されずに書かれているとおりのまま使われます。以下は、Lispモードで2つの変数に数値を設定する例です。

     ;; -*-mode: Lisp; fill-column: 75; comment-column: 50; -*-

この方法では、ファイルのコーディングシステムも指定できます。つまり、codingという名前の『変数』に値を指定すればよいのです。『値』は、Emacsが認識できるコーディングシステム名である必要があります。 See Coding Systems。

一方、ローカル変数リストはファイルの末尾（最後のページ）に置きます。（最後のページにはローカル変数リストだけを置くというのを勧めます。）ローカル変数リストはLocal Variables:という内容を含む行で始まり、 End:という内容を含む行で終ります。これらの行のあいだに、1つの変数につき1行ずつ、 VARIABLE: VALUEという形で変数の名前と値を指定します。 VALUEは評価されずにファイルに書かれたとおりにそのまま使われます。ファイルにローカル変数リストと-*-の行が両方含まれていた場合には、 Emacsはまず-*-の行をすべて処理してから、続いてローカル変数リストの内容をすべて処理します。

以下にローカル変数リストの例を示します：

     ;;; Local Variables: ***
     ;;; mode:lisp ***
     ;;; comment-column:0 ***
     ;;; comment-start: ";;; "  ***
     ;;; comment-end:"***" ***
     ;;; End: ***

上の例では、各行は;;;で始まり***で終っています。 Emacsはこれらの接頭辞と接尾辞をリストの最初の内容に基づいて認識します。つまり、特別な文字列Local Variables:の前後の文字列を、それぞれ、接頭辞、接尾辞とみなし、それ以降の行についてはこの接頭辞と接尾辞を無視します。

接頭辞と接尾辞を使う主な理由は、ローカル変数リストをコメントの中に入れることで、そのファイルを読み込む他のプログラムを困惑させないようにすることです。上の例では、コメントが;;;で始まり***で終るような言語を想定しています。変数comment-startとcomment-endのローカルな値で、このような変な構文に対処するようにEmacsをカスタマイズするのです。必要ないのであれば、接頭辞（と接尾辞）は使わないでください。

ローカル変数リストにおいては、2つの変数名が特別な意味を持ちます。変数modeに対する値は、実際にはメジャーモードを設定します。変数evalに対する値は、式として評価されますが、その結果は捨てられます。 modeとevalは本当の変数ではなく、他の状況でこれらの名前の変数に値を設定してもなんら特別な意味を持ちません。メジャーモードを設定するためにmodeを指定する場合は、ローカル変数リストの先頭に書く必要があります。

仮想的な『変数』modeは、メジャーモードだけでなくマイナモードを設定するのにも使えます。実は、この指定は2回以上使うことができて、最初はメジャーモードを設定し、それ以降は（それぞれ）マイナモードを設定します。しかし、マイナモードはユーザーの好みに応じて選ぶものですから、普通はファイルでマイナモードを指定するべきではないでしょう。

たとえば、ローカル変数リストで自動詰め込み（auto-fill）モードをオンにしたいと思うかもしれませんが、それはまちがいです。自動詰め込みにするかどうかは、個人の好みの問題であり、ファイルの中身によって決まるものではないからです。ある種別のファイルでいつも自動詰め込みにしたければ、個人の.emacsファイルで（状況に応じて）自動詰め込み（auto-fill）モードをオンにするようなメジャーモードのフックを設定してください（see Init File）。ローカル変数リストで他人に好みを押し付けてはいけません。

ローカル変数リストは、ファイルの末尾から3000文字以内にある必要があり、ファイルがページに分かれている場合には最後のページにある必要があります。これらが守られていないと、 Emacsはローカル変数リストがあることを認識しません。これらの規則の目的は、最後ではないページに偶然 Local Variables:があってもEmacsが誤認しないようにすることと、全体が1ページでローカル変数リストを持たない長いファイルを訪問するときでもファイル全体を探さなくてもすむようにするためです。

バッファのローカル変数やメジャーモードを、ローカル変数リストがあるときにはそれによる指定も含めて、ファイル名とファイルの内容に基づいたものにリセットしたければ、 normal-modeコマンドを使ってください。 See Choosing Modes。

変数enable-local-variablesは、ファイル中のローカル変数指定を処理するか否かを制御します。つまり、ローカル変数指定を無視するようにもできます。デフォルトはtで、ファイル中のローカル変数指定を処理します。値をnilにすると、ファイル中のローカル変数指定を無視します。これら以外の値の場合は、ファイル中にローカル変数指定があると、その内容を表示して処理するかどうか問い合わせます。

仮想的な『変数』evalといくつかの（実在する）変数に対する指定は、ある種の危険性をもたらします。他人のファイルを訪問したとき、そこに書かれているローカル変数指定によってあなたが使っているEmacsのふるまいがどのようにでも変更できるからです。このため、オプションenable-local-evalにより、変数eval、さらに、-hook、-hooks、-function、 -functionsという名前で終る変数、および、他のいくつかの変数に対するローカル変数指定を処理するかどうか制御できるようになっています。 enable-local-variablesと同じように指定できる値は3種類あって、 t、nil、これら以外です。デフォルトはmaybeで、これはtでもnilでもありませんから、 Emacsはこれらのローカル変数指定があるときは確認を求めてきます。

キーボードマクロ
========

キーボードマクロは、ユーザーが一連のキー操作に基づいて定義したコマンドです。たとえば、C-n C-dという打鍵を40回繰り返す必要があるとわかったら、 C-n C-dを実行するキーボードマクロを定義し、それを40回繰り返す指定をして呼び出すと迅速に作業できます。

C-x (
     キーボードマクロの定義を開始する（start-kbd-macro）。

C-x )
     キーボードマクロの定義を終了する（end-kbd-macro）。

C-x e
     もっとも最近のキーボードマクロを実行する（call-last-kbd-macro）。

C-u C-x (
     もっとも最近のキーボードマクロを再実行したうえで、その定義にキーを追加する。

C-x q
     キーボードマクロの実行中にこの場所に到達したら、実行の確認を求める（kbd-macro-query）。

M-x name-last-kbd-macro
     もっとも最近に定義したキーボードマクロに（現在のEmacsセッションだけで有効な）コマンド名を与える。

M-x insert-kbd-macro
     キーボードマクロの定義をLispコードとしてバッファに挿入する。

C-x C-k
     まえに定義したキーボードマクロを編集する（edit-kbd-macro）。

M-x apply-macro-to-region-lines
     リージョン内の各行に対して、最後に定義したキーボードマクロを実行する。

キーボードマクロは、それがLispではなくEmacsのコマンド言語で記述されているという点で、通常のEmacsコマンドとは違っています。このため、キーボードマクロは初心者でも簡単に作れ、間に合わせとして定義するのにも向いています。しかし、Emacsのコマンド言語は、プログラム言語として知的で汎用的な動作を記述できるほど強力ではありません。そういう場合には、Lispを使ってください。

キーボードマクロは、定義内容のコマンド列を実際に実行しながら定義できます。いいかえれば、キーボードマクロを定義しているときに、その定義の第1回目の実行が行われることになります。ですから、コマンドがどのように動作するかを目で見ながら確認でき、頭の中だけで動作を考えるよりも楽に定義できます。コマンド列の最後まできてキーボードマクロを定義し終ると、第1回目の実行も終ったことになります。そのあとは、マクロを呼び出すことで何回でもそのコマンド列全体を実行できます。

基本的な使い方
-------

キーボードマクロの定義を開始するには、C-x (コマンド（start-kbd-macro）を打ってください。それ以降打鍵するものは通常どおり実行されますが、それと同時にキーボードマクロの定義として取り込まれます。モード行にもそのことを表すDefという表示が現れます。定義の終りまできたら、C-x )（end-kbd-macro）を打ち込むとキーボードマクロの定義が完了します（C-x )はマクロの内容には含まれません！）。たとえば、

     C-x ( M-f foo C-x )

のように打鍵すると、 1単語分ポイントを前進させ文字列fooをバッファに挿入する、キーボードマクロを定義できます。

定義し終えたキーボードマクロは、コマンドC-x e（call-last-kbd-macro）で再実行できますし、数引数として反復回数を指定することで多数回実行することもできます。 C-x )にも引数として反復回数を指定でき、その場合は定義完了とともにただちに指定した回数だけキーボードマクロを実行しますが、定義しているとき（実行しているので）を1回目の実行として数えます。ですから、C-u 4 C-x )と打つと、キーボードマクロをただちに3回実行します。 C-x eやC-x )に反復回数0を指定すると、キーボードマクロを無限回、つまり、エラーが発生するか、 C-g（MS-DOSではC-BREAK）が打鍵されるまで、繰り返し実行します。

テキスト上の規則的にとびとびの位置に対して操作を行いたい場合には、キーボードマクロを定義するときに、つぎに適用したい位置までポイントを移動するコマンドを含めておきます。たとえば、各行について変更を行いたければ、ポイントを行頭に置いてからキーボードマクロを定義し始め、最後にポイントをつぎの行の行頭に置いたところで定義を終えます。キーボードマクロを繰り返し実行すると、次々と連続する行に対して操作を実行できます。

キーボードマクロの定義を完了してしまったあとでも、 C-u C-x (を打ち込めば、その定義の末尾に内容を追加できます。このコマンドは、C-x (に続いて現在のキーボードマクロの定義内容全体を打鍵したのと同じ効果を持ちます。その結果、定義されたとおりにマクロを再実行します。

キーボードマクロの中で、通常のキーと同様にファンクションキーを使うこともできます。マウスイベントを使うことさえできますが、その場合は注意してください。キーボードマクロはマウスイベントを再現しますが、マウス位置としては最初にキーボードマクロを定義したときの位置がそのまま使われます。その結果は予想し難いものになります。（現在のマウス位置を使っても、結果はさらに予想し難いものになる。）

キーボードマクロの中で必ずうまくいくとは限らないことの1つに、 C-M-c（exit-recursive-edit）コマンドがあります。このコマンドがマクロの中で開始させた再帰編集を終らせる場合には、期待どおりに動くでしょう。しかし、このコマンドがキーボードマクロを起動するまえに入っていた再帰編集を終らせるとすると、その終了処理の過程でキーボードマクロの実行も終らせてしまいます。

定義済みのキーボードマクロを編集するには、 C-x C-k（edit-kbd-macro）と打ちます。このコマンドに続けてマクロを起動する打鍵、つまり、 C-x eやM-x NAMEなどのキー列を入れます。すると、キー列に対応するキーボードマクロの内容が整形されて特別な編集用メジャーモードのバッファに入ります。そのバッファ中でC-h mと打つと編集方法が表示されます。編集し終えたらC-c C-cと打ちます。

コマンドM-x apply-macro-to-region-linesは最後に定義されたキーボードマクロを現在のリージョンの各行に対して実行します。つまり、各行について、行頭にポイントを置いてからキーボードマクロを実行します。

キーボードマクロの命名と保存
--------------

新たにつぎのキーボードマクロを定義したあとでも現在のキーボードマクロを使いたいなら、 M-x name-last-kbd-macroでキーボードマクロに名前を付けておく必要があります。このコマンドは、ミニバッファで名前を読み取り、その名前でキーボードマクロを実行できるように定義します。マクロ名はLispシンボルであり、このように定義されているので、 M-xで呼び出したりglobal-set-key （see Keymaps）でキーに対応付けたりできる有効なコマンド名になります。その名前にキーボードマクロ以外のものがすでに定義されていると、エラーメッセージが表示され何の変更も起こりません。

キーボードマクロにコマンド名を付けると、その定義をファイルに保存できます。そうすると、別の編集セッションで使えるようになります。まず、定義を保存したいファイルを訪問してから、つぎのコマンドを使ってください。

     M-x insert-kbd-macro RET MACRONAME RET

このコマンドは、実行するとそのキーボードマクロと同じ動作を行うLispコードをバッファに挿入します。（insert-kbd-macroがLispコードの生成を代行するので、 Lispコードを理解する必要はない。）そうしたら、このファイルを保存します。 load-file（see Lisp Libraries）でファイルをロードできます。保存するファイルとして~/.emacs（see Init File）を使えば、 Emacsを起動するとつねにそのマクロが定義されます。

insert-kbd-macroに数引数を指定すると、さらに（もしあれば）キーボードマクロに割り当てたキーを記録するLispコードが追加されるので、ファイルをロードしたときに同じキーがマクロに割り当てられます。

変化のあるマクロの実行
-----------

C-x q（kbd-macro-query）を使うと、 query-replaceと同様に変更するかどうか尋ねてくるキーボードマクロを作れます。キーボードマクロを定義しているときに、問い合わせが起きてほしい箇所で C-x qを打ちます。マクロの定義中はC-x qは何の動作もしませんが、あとでマクロを実行させたときにはC-x qの箇所で処理を続けるかどうか尋ねてくるようになります。

C-x qの問い合わせに対する有効な応答は、SPC（またはy）、 DEL（またはn）、RET（またはq）、C-l、 C-rです。これらの意味はquery-replaceと同じですが、 query-replaceのすべての応答が意味を持つとは限りません。

SPCは続行、DELはこの回の反復の残りを飛ばしてただちにつぎの反復に進むという意味になります。 RETではこの回の反復の残りも以後の反復もすべて取り消します。 C-lは画面を再描画し、再度どうするかを問い合わせてきます。

C-rで再帰編集レベルに入るので、そこでキーボードマクロにはない編集を行えます。 C-M-cで再帰編集から抜けると、再度どうするかを聞いてきます。ここでSPCを打つと、キーボードマクロの残りの部分が実行されます。キーボードマクロの残りの部分が望みどおりの動作をする状態にポイントやテキストを保っておくのは、ユーザーの責任です。

C-u C-x q、つまり、数引数を指定したC-x qは、まったく違った動作をします。キーボードマクロの定義中でも実行中でも、キーボードから入力を受け付ける再帰編集に入ります。定義中の場合、再帰編集の中で行った操作はマクロの一部にはなりません。実行中の場合、再帰編集の中で各反復ごとに個別の編集を行う機会が得られます。 See Recursive Edit。

キーバインディングのカスタマイズ
================

本節では、コマンドをキーに対応付けるキーバインディングと、キーバインディングを記録するキーマップについて説明します。また、キーバインディングをカスタマイズする方法についても説明します。

コマンドとは、対話利用向けに定義されたLisp関数であることを思い出してください。コマンドには、他のLisp関数と同様、通常、英小文字とハイフンから成る関数名前が付いています。

キーマップ
-----

キー列とコマンド関数との対応はキーマップと呼ばれるデータ構造に保持されています。 Emacsには数多くのキーマップがあり、それぞれが特定の場面で使われます。

キー列（または単にキー）とは、ひとまとまりの意味を持つ入力イベントの並びをいいます。入力イベントは、文字、ファンクションキー、マウスボタン、つまり、端末から計算機に送ることができるすべての入力から成ります。キー列の意味付けは、どのコマンドを実行するかを表すバインディングによって決まります。キーマップの役割は、これらのバインディングを保持することです。

グローバルキーマップはもっとも重要なキーマップですが、それはグローバルキーマップがつねに有効だからです。グローバルキーマップは基本（fundamental）モードのキーを定義します。つまり、そこに含まれる定義の大部分は、ほとんどまたはすべてのメジャーモードに共通のものです。各メジャー／マイナモードは、グローバルキーマップの定義の一部を置き換えるような独自のキーマップを持つことができます。

たとえば、gのような自己挿入文字を打つとその文字がバッファに挿入されるのは、グローバルキーマップでこれらのキーが self-insert-commandに対応付けられているからです。また、C-aのような標準の編集コマンドも、その意味付けはグローバルキーマップに書かれています。 M-x global-set-keyのようなバインディングを変更するコマンド群は、グローバルキーマップの適切な箇所に新しいバインディングを書き込みます。

メタ文字はやや違った動作になります。 Emacsでは、メタ文字はESCで始まる文字列に変換されます。ですから、M-aという入力はつねにEmacsの中では ESC aに置き換えられて処理されます。つまり、メタ文字は単一の入力イベントですが、キーバインディングの観点では2つのイベントとして扱われます。こうなっている理由は歴史的なもので、将来は変わる可能性もあります。

最近のほとんどのキーボードには、文字キーの他にファンクションキーがあります。ファンクションキーは文字キーと同様に入力イベントを送出し、キーマップはそれに対応するバインディングを保持することができます。

多くの端末では、ファンクションキーを打つとコンピュータには一連の文字列が送られます。具体的にどのファンクションキーがどんな文字列を送るかは端末によってまちまちです。（多くの場合、文字列はESC [で始まる。） Emacsが使用中の端末種別を正しく認識していれば、キー列（の先頭でだけでなく）に現れるファンクションキーに対応した文字列を正しく判別できます。ですから、多くの場合、ファンクションキーの打鍵も 1つの入力イベントとして直接Emacsに送られているとみなして、文字列としての表現形式は無視してかまいません。

マウスボタンも入力イベントを発生させます。これらのイベントには、追加データ、つまり、ボタンを押したり放したりしたときのウィンドウとその中での位置、時刻が付属しています。ただし、キーバインディングに関しては、どのボタンが使われたかだけが問題となります。残りの情報は、コマンドがこれらの情報を参照する場合だけ意味を持ちます。（通常、マウスから起動できるコマンドは、これらの情報を参照する。）

キーマップは1つのイベントに対する定義のみを保持します。複数キーの列から成る複数のイベントの解釈には、キーマップの連鎖が使われます。最初のキーマップが最初のイベントの定義を保持し、その定義がつぎのキーマップになっていて、 2番目のイベントの定義を保持し、というようになっています。

キー列にはファンクションキーと文字キーとが混ざっていてもかまいません。たとえば、C-x SELECTというのも許されます。 SELECTをプレフィックスキーとして定義しておけば、 SELECT C-nというのも許されます。マウスイベントとキーボードイベントを混ぜることさえ可能ですが、そうすると打ち込むのが面倒ですからお勧めしません。

ユーザーはどんなキー列でも再定義して利用できますが、 C-cに続けて1文字というキー列だけを使うのが最善です。このキー列は『ユーザー定義のために予約』されていて、正しく設計されたEmacsの各種拡張とは衝突しないようになっているからです。 F5からF9までのファンクションキーもユーザー定義のために予約してあります。これ以外のキー列を再定義すると、同じキーを再定義する拡張やメジャーモードによってあなたの定義が上書きされてしまう可能性があります。

プレフィックスキーマップ
------------

C-xやESCのようなプレフィックスキーはそれぞれ専用のキーマップを持っていて、そこにはそのプレフィックスキーに続くイベントの定義が保持されています。

プレフィックスキーの定義は、通常、それに続くイベントの定義を検索するためのキーマップです。あるいは、プレフィックスキーの定義がLispシンボルであって、その関数の定義がキーマップというのもあります。どちらでも効果は同じですが、後者では、プレフィックスキーにコマンド名を与えてその用途を示すことができます。このため、C-xにバインドされているのはシンボルCtl-X-Prefixであり、その関数定義はC-xコマンド群に対応するキーマップです。 C-c、C-x、C-h、ESCはグローバルマップでプレフィックスキーとして定義されていますから、これらはつねにプレフィックスキーとして使用できます。

通常のプレフィックスキーに加えて、メニューバーを表す『仮想的なプレフィックスキー』があります。メニューバーのキーバインディングに関する特別な点についてはメニューバー (Emacs Lisp リファレンスマニュアル)を参照してください。ポップアップメニューを表示させるマウスボタンイベントもまた、プレフィックスキーです。こちらの詳細についてはメニューキーマップ (Emacs Lisp リファレンスマニュアル)を参照してください。

決まった変数に格納されているプレフィックスキーマップもあります。

  * ctl-x-mapはC-xに続くキーを探すためのマップを納めた変数名。

  * help-mapはC-hに続くキーを探すためのマップを納めた変数名。

  * esc-mapはESCに続くキーを探すためのマップを納めた変数名。つまり、すべてのメタ文字は実際にはこのマップで定義されている。

  * ctl-x-4-mapはC-x 4に続くキーを探すためのマップを納めた変数名。

  * mode-specific-mapはC-cに続くキーを探すためのマップを納めた変数名。

ローカルキーマップ
---------

これまではグローバルキーマップの諸側面について説明しました。メジャーモード固有のキーバインディングをローカルキーマップに定義することで、各メジャーモードはEmacsの動作を変更します。たとえば、Cモードでは、 TABをCのコードの現在行を字下げする機能に差し替えます。バッファ内の一部のテキストで、そのバッファのメジャーモードのかわりとなる固有のキーマップを指定することもできます。

マイナモードもローカルキーマップを持てます。その場合、マイナモードが生きているときには、そのキーマップがメジャーモードのローカルキーマップやグローバルキーマップに優先します。

Lispモードおよびその他のいくつかのメジャーモードのローカルキーマップは、そのモードを使っていないときでもつねに存在します。これらのキーマップは、lisp-mode-mapなどの変数に格納されています。さほど頻繁に使われないメジャーモードの場合は、そのモードがセッションの中で初めて起動されたときにローカルキーマップが作られます。これは、メモリを節約するためです。このようなモードのキーマップを変更したい場合には、当該メジャーモードのモードフックを使う必要があります（以下を参照）。

すべてのマイナモードのキーマップは、あらかじめ作られています。マイナモードのキーマップ作成をそのマイナモードが最初に起動されるまで遅延させる方法はありません。

ローカルキーマップでは、その中のあるキーの定義をプレフィックスキーマップとすることで、そのキーをローカルなプレフィックスキーとして再定義できます。そのキーがグローバルにもプレフィックスキーであると定義されているなら、ローカルキーマップとグローバルキーマップの内容は実質的に統合され、プレフィックスキーに続くイベントは両方のキーマップで検索されます。したがって、あるモードのローカルキーマップがC-cを別のキーマップとして定義し、そのキーマップではC-zをコマンドとして定義すると、これらによってC-c C-zのローカルな意味が与えられます。しかし、これはC-cで始まる他のキー列には影響しません。あるキー列が独自のローカルなバインディングを持たなければ、グローバルなバインディングが意味を持つからです。

いいかえれば、Emacsが複数イベントから成るキー列を扱う方法は、複数のキーマップから1つずつ、キー列全体に一致するバインディングを探すのです。まず、マイナモードが生きていればそのキーマップを検索し、つぎにメジャーモードのキーマップを検索し、最後にグローバルキーマップを検索します。これは厳密にはキーの検索動作とは違いますが、通常の状況でどうなるか理解するには十分です。

メジャーモードのローカルバインディングを変更するには、そのモードのローカルキーマップを変更する必要があります。通常、そのためにはそのモードが最初に使われるまで待つ必要があります。というのは、ほどんどのメジャーモードは使われるまでキーマップを作成しないからです。ですから、個人の~/.emacsファイルでメジャーモードのバインディングを変更したければ、そのモードのモードフックを使ってそのモードが最初に使われるまで（変更を）遅らせる必要があります。

たとえば、texinfoモードを選択するtexinfo-modeコマンドはフックtexinfo-mode-hookを実行します。このフックを使ってC-c nとC-c pに対する（有益ではないですが）ローカルバインディングを texinfoモードに追加するには、つぎのようにします。

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

See Hooks。

ミニバッファのキーマップ
------------

ミニバッファも一群の専用ローカルキーマップを持っています。それらには各種の補完や脱出コマンドが定義されています。

  * minibuffer-local-mapは通常の入力に使われる（補完なし）。

  * minibuffer-local-ns-mapも同様。ただし、SPCは、RETと同様に、脱出動作である。これは主にMocklispとの互換性のために使われる。

  * minibuffer-local-completion-mapは弱い補完に使われる。

  * minibuffer-local-must-match-mapは強い補完と慎重な補完に使われる。

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

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を使います。本書のキーの説明にもコマンド名を掲載してあります。

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

初期化ファイルでのキーの変更
--------------

いつでもあるキーバインディングを設定しておきたければ、その指定を個人の.emacsファイルにLispのコードとして書いておきます。

これを行うもっとも簡単な方法は、 ASCII文字とメタ修飾付きのASCII文字に対してのみ使えます。たとえば、C-zをshellにバインドするにはつぎのようにします。

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

この例では1つの文字C-zから成る文字列定数を指定しています。コマンド名shellのまえのクォート「'」は、 shellを変数ではなく定数シンボルとして扱う印です。クォートがないと、Emacsはshellを変数としてその値をただちに評価しようとします。すると、望んでいることではなく、エラーになります。

つぎは、2文字のキー列をバインドする例です。

     (global-set-key "\C-xl" 'make-symbolic-link)

キー列にファンクションキーやマウスボタンイベントが含まれていたり、 C-=やH-aなどの非ASCII文字が含まれているなら、文字列よりもっと一般的な指定方法であるベクタを使った指定を使う必要があります。

Emacs Lispでのベクタの書き方は、その要素を中括弧（[...]）で囲みます。要素は空白で区切ります。要素がシンボルであれば、単にその名前だけを書けばよく、区切り記号などは不要です。要素が文字であれば、Lispの文字定数として、つまり?に続けてその文字が文字列中に現れるのと同じ書き方で、書いてください。

ベクタを使ってC-=（ASCIIの範囲にないコントロール文字）、 H-a（ハイパー文字。ASCIIにはハイパー文字は含まれない）、 F7（ファンクションキー）、 C-Mouse-1（キーボード修飾付きのマウスボタン）をバインドする例を示します。

     (global-set-key [?\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)

単純な（文字列ですむ）場合にベクタを使ってもかまいません。先の2つの例をベクタを使うように書き直すとつぎのようになります。

     (global-set-key [?\C-z] 'shell)

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

ファンクションキーの再定義
-------------

キー列には通常の文字以外にもファンクションキーを含めることができます。キーボードの文字がLispの文字（実は整数です）で表されるのに対し、ファンクションキーはLispシンボルで表されます。ファンクションキーに単語のラベルが付いているなら、その単語が対応するLispシンボルの名前になります。たとえば普通に見られるファンクションキーとLispシンボルの対応はつぎのとおりです。

left, up, right, down
     カーソル矢印キー。

begin, end, home, next, prior
     その他のカーソル移動キー。

select, print, execute, backtab
insert, undo, redo, clearline
insertline, deleteline, insertchar, deletechar
     その他のファンクションキー。

f1, f2, ... f35
     （キーボードの上端に並んでいる）番号の付いたファンクションキー。

kp-add, kp-subtract, kp-multiply, kp-divide
kp-backtab, kp-space, kp-tab, kp-enter
kp-separator, kp-decimal, kp-equal
     （普通のキーボードの右側にまとまっている）キーパッドのキーで、名前や句読点が印字されているもの。

kp-0, kp-1, ... kp-9
     キーパッドの数字キー

kp-f1, kp-f2, kp-f3, kp-f4
     キーパッドのPFキー。

これらの名前は習慣的なものですが、システムによっては（とりわけXウィンドウシステムを使っている場合は）、別の名前になっている場合があります。あるファンクションキーにどのシンボルが対応しているか調べるには、 C-h cに続いてそのキーを打鍵してください。

ファンクションキーのシンボルを含むキー列（あるいは、 ASCII以外の文字を含むもの）は文字列ではなくベクタで指定してください。ベクタの構文では要素と要素のあいだは空白で区切り、全体を中括弧[...]で囲みます。たとえば、ファンクションキーf1をコマンドrmailにバインドするには、つぎのようにします。

     (global-set-key [f1] 'rmail)

右矢印キーをコマンドfowared-charにバインドするには、つぎのようにします。

     (global-set-key [right] 'forward-char)

これは、シンボルrightを要素とするベクタのLisp構文です。（このバインディングはEmacsのデフォルト設定に入っている。）

ベクタを用いたキーの再定義ついてより詳しくは、see Init Rebinding。

キー列の中でファンクションキーと文字を混ぜることができます。以下の例は、 C-x NEXTをコマンドforward-pageにバインドしています。

     (global-set-key [?\C-x next] 'forward-page)

ここで、?\C-xはLispの文字定数で、文字C-xを表します。ベクタのもう1つの要素であるnextは、シンボルですから?は不要です。

ファンクションキーに対して、修飾キーCTRL、META、HYPER、 SUPER、ALT、SHIFTを指定できます。これらの修飾キーを指定するには、シンボル名のまえにC-、 M-、H-、s-、A-、S-を付けてください。たとえば、Hyper-Meta-RIGHTで 1語先へ移動するにはつぎのように指定します。

     (global-set-key [H-M-right] 'forward-word)

名前の付いたASCIIコントロール文字
-------------------

TAB、RET、BS、LFD、ESC、DELはもともとASCIIの特定のコントロール文字に対応していたのですが、よく使われるため別にそれ専用のキーを持つようになりました。のちに人々はEmacsでこれらのキーとそれらと『同じ』文字を CTRLキーと組み合わせて打鍵した場合とを区別できると便利だと気がつきました。

EmacsではXウィンドウシステムを使っている場合、これら2種類の入力を区別します。つまり、キーボード上の特殊キーの方はtab、return、 backspace、linefeed、escape、 deleteという名前のファンクションキーとして扱うのです。これらのファンクションキーは、もしそれ固有のバインディングが指定されていなければ、自動的に対応するASCII文字に変換されます。その結果、特にこの2種類を区別したいと思わない限りは、ユーザーもLispプログラムもこれらの区分について気にする必要はありません。

（たとえば）TABとC-iを区別したくないなら、 ASCII文字TAB（8進コード011）に対応するバインディング1つだけを指定してください。区別したいのなら、このASCII文字に対するバインディングに加えて、『ファンクションキー』tabに対するバインディングも指定します。

通常のASCII端末では、TABとC-i （および上記の対応する組のそれぞれ）を区別する方法はありません。というのは、端末はどちらが押されても同じ文字を送出するからです。

キーボード上の非ASCII文字
---------------

アクセント付き文字などの非ASCII文字を送出するキーがあるキーボードでは、それらのキーの再定義には、少々トリックが必要です。 2つの解決方法があります。 1つめは、set-keyboard-coding-system（see Specify Coding）を使って、キーボードのコーディングシステムを指定することです。そうすれば、つぎのように書いて、通常の方法でそれらのキーを再定義できます。

     (global-set-key [?CHAR] 'some-function)

ただし、CHARを挿入するには、定義したいキーを打ちます。

キーボードのコーディングシステムを指定しないと、上のようにはできません。そのかわりに、端末が実際に送出するコードを調べる必要があります。 Emacsでこれを簡単に行うには、 C-x b temp RETで空バッファを作成し、 M-x toggle-enable-multibyte-characters RETでユニバイトにしてから、このバッファに文字を挿入するキーを打ちます。

文字のまえにポイントを移動して、C-b C-x =と打ちます。 8進数、10進数、16進数の3通りで表した文字コードを括弧で括ったメッセージがミニバッファに表示されます。定義するには、3つの数字の2番目、つまり、10進数をベクタの中に書きます。

     (global-set-key [DECIMAL-CODE] 'some-function)

マウスボタンの再定義
----------

Emacsではマウスボタンを表すのにもLispシンボルを使います。 Emacsのもっとも一般的なマウスイベントはクリック（click）イベントです。これはマウスボタンを押して、マウスを移動せずにボタンを放したときに発生します。ボタンを押した状態でマウスを移動するとドラッグ（drag）イベントになります。そして最後にマウスボタンを放したときにも、やはりドラッグイベントが発生します。

基本的なクリックイベントに対応するシンボルは、左ボタンに対してはmouse-1、左から2番目のボタンに対してはmouse-2、などとなっています。 2番目のボタンをクリックしたときカレントウィンドウを分割するには、つぎのように設定します。

     (global-set-key [mouse-2] 'split-window-vertically)

ドラッグイベントについても同様ですが、イベント名のmouseのまえにdrag-が付きます。たとえば、第1ボタンを押したままドラッグすると drag-mouse-1イベントが発生します。

マウスボタンが押されたときに発生するイベントに対してバインディングを指定することもできます。これらのイベントはdrag-のかわりにdown-で始まります。これらのイベントはキーバインディングが定義されているときだけ生成されます。 down-イベントのあとには、必ず、対応するクリック／ドラグッイベントが発生します。

必要ならば、シングルクリック／ダブルクリック／トリプルクリックを区別することもできます。ダブルクリックとは、ほぼ同じ位置でマウスボタンを2回クリックすることです。最初のクリックで通常のクリックイベントが発生します。最初のクリックから十分短い時間内に2回目のクリックが起こると、クリックイベントではなくダブルクリックイベントが発生します。ダブルクリックイベントは、double-で始まります。たとえば、double-mouse-3です。

つまり、同じ場所で2回クリックがあったとき、 2回目のクリックに特別な意味を与えることはできますが、ただし最初のクリックで発生する通常のシングルクリックに対して定義された動作も実行されることを前提としなければなりません。

このような制限のため、ダブルクリックで行えることが制約されますが、ユーザーインターフェイスデザイナは、よいユーザーインターフェイスがつねにそのような制約に従うべきだとの考えを述べています。つまり、ダブルクリックはシングルクリックと類似した動作をすべきであり、『それよりいくらか多く』の動作をするのがよい、ということです。そして、ダブルクリックイベントに対応するコマンドがその「いくらか多く」のぶんの動作を行うべきだということです。

ダブルクリックイベントに対してバインディングが定義されていなければ、ダブルクリックは2つのシングルクリックとして扱われます。その結果、シングルクリックに対応するコマンドが2回実行されることになります。

Emacsではさらにトリプルクリックイベントも使えます（その場合、名前はtriple-で始まる）。しかし4重クリックをイベントタイプとして区別しません。ですから、3回目以降の連続したクリックは、すべてトリプルクリックイベントとして報告されます。ただし、連続したクリックの回数はイベントリストに記録されていますから、本当に4重以上のクリックを区別したければそうすることもできます。 4重以上のクリックに特別な意味を与えるのはお勧めできませんが、 4回だと1回と同じ、5回だと2回と同じというように3つの選択肢のあいだで巡回できるようにするのは場合によっては有効かもしれません。

Emacsはまた、ドラッグやボタンイベントでも複数回の押し下げを記録します。たとえば、ボタンを2回押してからそのままマウスを移動した場合、 Emacsはdouble-drag-で始まるイベントを生成します。ドラッグでなくボタンを押し下げただけの場合は同様に、 double-down-で始まるイベントを生成します（ただし、他のボタンイベントと同様に、そのイベントに対するバインディングがなければ無視される）。

変数double-click-timeは、どれくらいの時間間隔内であれば 2つの隣接するクリックをダブルクリックとみなすかを指定します。単位はミリ秒です。値がnilであれば、ダブルクリックを検出しません。値がtであれば、時間間隔の上限はないものとして扱います。

マウスイベントに対応するシンボルにはさらに、 C-、M-、H-、s-、A-、 S-の各プレフィックスで、修飾キーの情報も組み込めます。順番は、プレフィックスに続いてdouble-やtriple-があり、そのあとがdrag-やdown-ということになります。

フレームには、モード行やスクロールバーなどのバッファ中のテキストを表示する以外の部分もあります。マウスイベントがこれらの特別な部分で発生したものかどうかを調べるために、ダミーの「プレフィックスキー」があります。たとえば、マウスがモード行でクリックされた場合、まずmode-lineというプレフィックスキーが送られ、続いて通常のマウスボタンに対応したイベントが送られます。ですから、モード行で第1ボタンがクリックされたときに scroll-upを実行するにはつぎのようにします。

     (global-set-key [mode-line mouse-1] 'scroll-up)

ダミーのプレフィックスキーとその意味はつぎのとおりです。

mode-line
     マウスがウィンドウのモード行にある。

vertical-line
     マウスが横に隣接するウィンドウ間の境界線上にある。（スクロールバーを表示させると、境界線のかわりにスクロールバーが現れる。）

vertical-scroll-bar
     マウスが縦スクロールバー上にある。（Emacsで使えるスクロールバーは、現在のところ縦スクロールバーのみ。）

1つのキー列の中に2つ以上のマウスボタンイベントを含めることもできますが、普通はあまりしないでしょう。

使用禁止コマンド
--------

コマンドを使用禁止にすると、コマンドの実行にはユーザーの確認が必要になります。コマンドを使用禁止にする目的は、初心者がそのコマンドをまちがって実行してしまい、混乱するのを防ぐためです。

Emacs上で使用禁止コマンドを対話的に実行しようとすると、コマンド名、説明文、とりあえずどうすべきかの指示を表示したウィンドウが現れます。つぎにEmacsはコマンドを実行するか、使用禁止を解除してから実行するか、実行を取り消すかを問い合わせてきます。コマンドの使用禁止を解除することを選ぶと、 Emacsさらに、以後恒久的にそうするのか、または現在のセッション内だけそうするのかも問い合わせてきます。恒久的に使えるようにすると、自動的に個人の.emacsファイルを編集します。

コマンドを使用禁止にする機構は、コマンドに対応するLispシンボルの属性disabledに nil以外の値を設定することです。これを行うLispプログラムはつぎのようになります。

     (put 'delete-region 'disabled t)

属性disabledの値が文字列であれば、コマンドを使用しようとしたときに表示されるメッセージにその文字列も含まれるようになります。

     (put 'delete-region 'disabled
          "It's better to use `kill-region' instead.\n")

コマンドを使用禁止にするには、.emacsファイルを直接編集するか、かわってこのファイルを編集するコマンドM-x disable-commandを使います。同様に、コマンドM-x enable-commandは、 .emacsファイルを編集してコマンドを恒久的に使える状態にします。 See Init File。

コマンドが使用禁止であるかどうかは、そのコマンドを起動するキー列には無関係です。したがって、M-xでそのコマンドを起動しても Emacsはその可否を問い合わせてきます。 Lispプログラムからコマンドを関数として呼び出す場合には使用禁止にしても何の効果もありません。

キーボード変換
=======

キーボードの機種によっては、Emacsが使用するすべての特殊文字を送ってくれないものがあります。もっともよくある問題は、DEL文字に関するものです。いくつかのキーボードでは、このきわめて重要な文字を簡単に打ち込む手段がありません。それは、削除にはC-hを使うことを前提としているからです。そのようなキーボードで削除のためのキーを打つと、 Emacsはそれをプレフィックス文字C-hとして解釈し、どのヘルプ機能を使うか問い合わせてきてしまいます。それはユーザーがしたかったことではありません。

Emacs内でこの問題を回避するには、C-hをDELに、 DELをC-hに変換するキーボード変換を以下のように設定することで回避できます。

     ;; C-hをDELに変換する。
     (keyboard-translate ?\C-h ?\C-?)

     ;; DELをC-hに変換する。
     (keyboard-translate ?\C-? ?\C-h)

キーボード変換はキーマップによるキーバインディング（see Keymaps）と同じではありません。 Emacsには状況ごとに使い分けられる多数のキーマップがあるのに対し、キーボード変換は一式だけしかなく、 Emacsが端末から読むすべての文字に対してその変換が適用されます。キーボード変換は入力処理のいちばん下位のレベルで行われ、キーマップ上の検索はキーボード変換を施した結果に対して行われます。

XウィンドウシステムではDELETEというキーはファンクションキーであり、 ASCII文字DELとは別ものです。 See Named ASCII Chars。キーボード変換はASCII文字入力だけに適用され、ファンクションキーとは無関係ですから、 Xウィンドウシステムでは上の例はDELETEキーに対して効果をもたらしません。しかし、Xウィンドウシステムでは上のようなキーボード変換そのものが不要です。というのは、EmacsはXウィンドウシステムでは BACKSPACEキーとC-hも区別でき、通常、BAKSPACEをDELとして扱うからです。

キーボード変換の使い方に関する詳しい情報は、入力イベントの変換 (Emacs Lisp リファレンスマニュアル)を参照してください。

構文テーブル
======

単語や対応した括弧の対を認識するEmacsコマンドはすべて、構文テーブル（syntax table）によって制御されます。構文テーブルは、どの文字が開き括弧で、どの文字が単語の中身で、どの文字がシングルクォートかといったことを記述しています。各メジャーモードにはそれぞれ専用の構文テーブルがあり（ただし、互いに関係のあるメジャーモードが 1つの構文テーブルを共用することはある）、各バッファごとにそのときのメジャーモードの構文テーブルが使われます。カレントバッファに設定されている構文テーブルはすべてのコマンドが使うので、以下ではこれを『現在の』構文テーブルと呼びます。構文テーブルは文字テーブル（char-table）型のLispオブジェクトであり、その要素は数値です。

現在の構文テーブルの内容に関する記述を表示するには、 C-h s（descirbe-syntax）を使います。記述の表示には各文字ごとに、その文字の現在の構文を設定するためにmodify-syntax-entryに渡すべき文字列、および、その文字列の英語での説明が含まれます。

構文テーブルに関する詳しい情報については、構文テーブル (Emacs Lisp リファレンスマニュアル)を参照してください。

初期化ファイル~/.emacs
===============

Emacsが実行を開始するとき、通常はユーザーのホームディレクトリにあるファイル.emacsや.emacs.elからLispプログラムをロードします。このファイルがEmacsの初期化の仕方を指定するので、このファイルのことを初期化ファイル（init file）と呼びます。コマンド行オプション-qで、 Emacsに初期化ファイルを読まないことを指示したり、 -u（あるいは--user）で、別のユーザーの初期化ファイルを指定できます（see Entering Emacs）。

デフォルトの初期化ファイルもあります。これはdefault.elという名前のライブラリファイルで、 Emacsはライブラリ探索パスをとおしてその場所を探します。 Emacsの配布にはdefault.elは含まれていません。ローカルなカスタマイズのためにサイトでdefault.elを用意することもあります。このファイルがあれば（-qを指定したときを除いて） Emacsを開始するときつねにロードされます。しかし、あるならば個人の初期化ファイルが最初にロードされます。その中でinhibit-default-initにnil以外の値を設定すると、 default.elはロードされません。

各サイトにはサイトスタートアップファイルがあるかもしれません。あるならば、このファイルの名前はsite-start.elです。 Emacsはユーザーの初期化ファイルを読むまえにこのファイルもロードします。このファイルのロードを抑止するには、オプション-no-site-fileを指定します。

.emacsに大量のコードがある場合には、 ~/.emacs.elと改名してバイトコンパイルしておくべきです。 Emacs Lispプログラムのコンパイルについてより詳しくは、 see バイトコンパイル (Emacs Lisp リファレンスマニュアル)。

単なるカスタマイズを超えるような実際のEmacsプログラムを書くのであれば、 The Emacs Lisp Reference Manual (【訳注】日本語訳：『Emacs Lispリファレンスマニュアル』、アスキー出版局、ISBN4-7561-3414-9)を読むべきです。 See Emacs Lisp (The Emacs Lisp Reference Manual)。

初期化ファイルの構文
----------

ファイル.emacsにはLispの関数呼び出し式を書きます。関数呼び出しは、関数名に続けて引数リストを並べ、全体を括弧で囲みます。たとえば、(setq fill-column 60)は、関数setqによって、変数fill-column（see Filling）に 60を設定します。

setqの2番目の引数は変数の新しい値を表す式です。これは、定数でも、変数でも、関数呼び出し式でもかまいません。 .emacsファイルでは定数を使うことがもっとも多いでしょう。定数にはつぎのものがあります。

数値：
     数値は10進表記し、先頭にマイナス符号があってもよい。

文字列：
     Lispの文字列の構文はCの文字列の構文とほぼ同じだが、多少違うところもある。文字列定数の始まりと終りにはダブルクォートを使う。

     文字列の中には、改行や特殊文字をそのまま入れることができる。しかし、バックスラッシュで始まる形式、つまり、改行は\n、バックスペースは\b、復帰は\r、タブは\t、ページ送りは\f（コントロールL）、エスケープは\e、バックスラッシュは\\、ダブルクォートは\"、8進コードOOOの文字は\OOOで表すことができ、そのほうが読みやすい。バックスラッシュとダブルクォートの2つだけは、文字列に含めるのに必ずこのような形で書き表す必要がある。

     \C-はコントロール文字を表すプレフィックスとして使用できる。たとえば、\C-sでASCIIのコントロールSを表す。同様に、\M-はメタ文字を表すプレフィックスとして使用できる。たとえば、\M-aでMeta-A、 \M-\C-aでControl-Meta-Aを表す。

文字：
     Lispの文字定数は、?に続けて文字または\で始まるエスケープシーケンスを書いたもの。たとえば、?x、?\n、?\)などは文字定数。 Lispでは文字と文字列は別ものなので注意すること。ある場面では文字列が必要であり、別の場面では文字が必要である。

真：
     tは「真」を表す。

偽：
     nilは「偽」を表す。

その他のLispオブジェクト：
     シングルクォートに続けてそのLispオブジェクトを書く。

初期化ファイルの例
---------

以下にはよく使われるLispの式の例をあげておきます。

  * Cモードにおいて、行の途中でTABが押されたときにはタブ文字を挿入するように設定する。

          (setq c-tab-always-indent nil)

     変数の値を「真」にするにはtを設定し、逆に「偽」にするにはnilを設定する。

  * 探索をデフォルトで大文字小文字を区別するように設定する（ただし、違う設定に変更しているバッファは除く）。

          (setq-default case-fold-search nil)

     ここではsetq-defaultで変数のデフォルト値を設定し、その変数に対してローカルな値を設定していないすべてのバッファで有効である。 setqでcase-fold-searchに値を設定すると、カレントバッファのローカルな値だけに影響し、初期化ファイルで記述したいこととは異なるだろう。

  * Emacsが自動的にメイルアドレスを割り出せない場合に備え、この変数に自分のメイルアドレスを指定する。

          (setq user-mail-address "coon@yoyodyne.com")

     メイルアドレスを必要とする多くのEmacsパッケージは、 user-mail-addressの値を使う。

  * 新たに作ったバッファのデフォルトのモードをテキストモードにする。

          (setq default-major-mode 'text-mode)

     text-modeを指定しているのは、これがテキストモードに入るためのコマンドだから。コマンド名のまえのシングルクォートは、シンボルを定数として扱うため。さもないとtext-modeという変数を参照することになってしまう。

  * 西ヨーロッパのほとんどの言語を扱えるLatin-1文字集合をデフォルトとする
      (【訳注】日本語環境を設定するには、)

          (set-language-environment "Japanese")

     とする。。

          (set-language-environment "Latin-1")

  * テキストモードやそれに関連するモードでは、自動詰め込みモードをオンにする。

          (add-hook 'text-mode-hook
            '(lambda () (auto-fill-mode 1)))

     これはノーマルフック変数（see Hooks）にフック関数を追加する例。ここでは関数としてlambdaで始まるリストを指定し、シングルクォートを前置して式ではなく定数として扱わせる。

     Lispの関数について説明するのは本書の範囲外だが、この例を理解するには、テキストモードに入るときに (auto-fill-mode 1)が実行されるのだと考えておけば十分。この式を別の式に変えたり、式を複数並べてもかまわない。

     Emacsにはturn-on-auto-fillという関数が用意されており、その定義は(lambda () (auto-fill-mode 1))になっている。したがって、上の例をもっと簡単に書くとつぎのようになる。

          (add-hook 'text-mode-hook 'turn-on-auto-fill)

  * あらかじめ用意してあるLispライブラリfoo （実際には標準Emacsディレクトリに置かれたファイルfoo.elc またはfoo.el）をロードする。

          (load "foo")

     loadに渡す引数が相対ファイル名、つまり、 /や~で始まらない場合には、 loadはload-path（see Lisp Libraries）のディレクトリ群を順に探索する。

  * 自分のホームディレクトリにあるコンパイル済みのLispファイルfoo.elcをロードする。

          (load "~/foo.elc")

     ここでは絶対ファイル名が使われているので、探索は行わない。

  * キーC-x lで関数make-symbolic-linkが実行されるようにバインディングを設定する。

          (global-set-key "\C-xl" 'make-symbolic-link)

     または

          (define-key global-map "\C-xl" 'make-symbolic-link)

     ここでもシンボルmake-symbolic-linkを変数としての値ではなく定数とするためにシングルクォートが使われていることに注意。

  * 上と同じだが、Lispモードの中だけでのバインディングを設定する。

          (define-key lisp-mode-map "\C-xl" 'make-symbolic-link)

  * 基本（fundamental）モードでnext-lineを実行するようになっているすべてのキーを、かわりにforward-lineを実行するように直す。

          (substitute-key-definition 'next-line 'forward-line
                                     global-map)

  * C-x C-vを未定義にする。

          (global-unset-key "\C-x\C-v")

     キーを未定義にする必要のある場合の1つとして、そのキーをプレフィックスにしたい場合がある。たとえば、C-x C-v ANYTHINGを定義すると、 C-x C-vは自動的プレフィックスになるが、しかしそのまえにC-x C-vの通常の（プレフィックスではない）定義を未定義に戻しておく必要がある。

  * $をテキスト（text）モードでの区切り文字にする。 $を文字定数として指定していることに注意。

          (modify-syntax-entry ?\$ "." text-mode-syntax-table)

  * コマンドnarrow-to-regionを確認なしに使えるようにする。

          (put 'narrow-to-region 'disabled nil)

端末に固有の初期化
---------

各端末種別ごとに、Emacsがその端末で動くときにロードするライブラリを指定できます。つまり、TERMTYPEという名前の端末でEmacsを起動するときには、 term/TERMTYPEというライブラリがロードされます。ライブラリの探索は通常どおり load-pathの各ディレクトリに対して行われ、ファイルの拡張子は.elcか.elです。通常、これらのライブラリはほとんどの Emacsライブラリを収めたディレクトリの下のtermというサブディレクトリに置かれます。

端末固有のライブラリの普通の用途は、端末のファンクションキーによって送出されるエスケープシーケンスをfunction-key-mapを使って意味のある名前に対応付けることです。このような設定を行うファイルの例として、たとえばファイルterm/kl201.elを見てみてください。多くのファンクションキーはtermcapデータベースの情報に基づいて自動的に対応付けがなされます。端末固有ライブラリでは、termcapで指定されていないファンクションキーだけを対応付ければよいのです。

端末種別にハイフンが含まれている場合は、ライブラリ名の選択には最初のハイフンよりまえの部分だけが使われます。つまり、端末種別aaa-48とaaa-30-rvでは、どちらもterm/aaaをロードします。ライブラリ中のコードでは(getenv "TERM")を使って必要なら完全な端末種別名を取得できます。

端末ライブラリの名前は、変数term-file-prefixと端末種別とを連結して作られます。ファイル.emacs中でterm-file-prefixを nilに設定すると端末ライブラリのロードを抑止できます。

Emacsは.emacsと端末ライブラリを読んだあと、初期化の最後にフックterm-setup-hookを実行します。端末ライブラリによる指定を一部変更したり、端末ライブラリがない端末の初期設定を行いたければ、このフックにフック関数を追加してください。 See Hooks。

個人の初期化ファイルの探し方
--------------

通常、Emacsは環境変数HOMEに基づいて.emacsを探し、ファイル名の~の意味を定めます。しかし、suを実行したあとでは、Emacsは（su実行前の）もとのユーザーの.emacsを読もうとし、 suした先のユーザーのではありません。これは、たとえスーパーユーザーになっているとしても、本来のユーザー独自のエディタのカスタマイズを使うべきだと考えるからです。

より正確には、Emacsはまずどのユーザーの初期化ファイルを使うかを決めます。それにはまず環境変数LOGNAMEおよびUSERからユーザー名を取得します。これらの環境変数がみつからなければ、Emacsは実効ユーザーIDを参照します。ユーザー名と実ユーザーIDが一致すれば、EmacsはHOMEを利用します。一致しない場合は、システムのユーザーデータベースからそのユーザー名に対応するホームディレクトリを探して使用します。