[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

16. `.emacs' ファイル

「Emacs を好きになるために Emacs を好きになる必要はない。」-- この、一見 パラドクスのように聞こえる格言こそが、GNU Emacs の秘密である。ただ箱を開 けて取り出したままの Emacs は一般的な道具でしかない。大抵の人は、それを 自分自身が使いやすいようにカスタマイズする。

GNU Emacs は多くの部分が Emacs Lisp で書かれている。これは、Emacs Lisp の式を書くことで、変更したり拡張したり出来るということを意味する。

Emacs のデフォルトの設定  
16.1 サイトごとの初期化ファイル  
16.2 あるセッションでの変数の設定  
16.3 `.emacs' の書き方  .emacs file の書き方
16.4 Text モードと Auto Fill モード  自動的に行を折り返す
16.5 メールのエイリアス  Email の短縮アドレス
16.6 Indent Tabs モード  TeX ではタブを使わないようにするには
16.7 幾つかのキーバインディング  
16.8 ファイルのロード  
16.9 オートロード  Autoload: 関数をすぐ使える状態に
16.10 ちょっとした拡張: line-to-top-of-window  関数を定義し、キーにバインドする
16.11 キーマップ  
16.12 X11 でのカラー表示  Version 19 の X 上でのカラー表示
16.13 V19 での雑多な事柄  ミニバッファを自動的なリサイズ etc.
16.14 モード行の修正  

Emacs のデフォルトの設定

Emacs のデフォルトの設定を素直にありがたく使う人達もいる。それでも Emacs は C のファイルを編集する際は C mode になるし、Fortran のファイルを編集 する際は Fortran mode になるし、特に設定されていないファイルについては Fundamental mode になる。誰が Emacs を使うか分らない状況では、これは合理 的な設定である。人々がどのファイルに対して何をしたいかを把握出来る人など 何処にもいないだろう。Fundamental mode は把握出来ないようなファイルに対 しての正しいデフォルトである。ちょうど C mode が C のコードを編集する際 の正しいデフォルトであるのと同じである。しかし、もし誰が Emacs を使おう としているかが分る場合---例えば自分自身が使う場合---なら Emacs をカスタ マイズするのが合理的である。

例えば私は、適当なモードが見つからないようなファイルに対しては Fundamental mode にしたいことは殆どない。そういう場合には Text mode を使 うことが多い。そこで Emacs をカスタマイズする。結果として、私にとって使 いやすいものになる。

Emacs をカスタマイズしたり拡張したりするには `~/.emacs' ファイルを 書くことになる。これは個人用の初期化ファイルである。中身は Emacs Lisp で 書かれ、Emacs に何をするかを伝える。

この章では、簡単な `.emacs' の説明をする。より多くの情報については、 以下を参照して欲しい。section `The Init File' in The GNU Emacs Manual, section `The Init File' in The GNU Emacs Lisp Reference Manual.


16.1 サイトごとの初期化ファイル

Emacs は個人的な初期化ファイルに加えて、サイト用の初期化ファイルが存在す れば、それも自動的にロードする。これらは `.emacs' と同様な形式で書 かれるが、全員に対してロードされる。

このサイト用の初期化ファイルの中の `site-load.el'`site-init.el' の二つは、Emacs が dump される際に、ロードされ、かつ 標準的なものとして `dump' される。(Dump することで、Emacs はより速くロー ド出来る。しかしながら、一旦ファイルがロードされ dump されると、もう一度 自分でロードしたり再 dump したりしない限り、変更は Emacs に反映されない。 これについては section `Building Emacs' in The GNU Emacs Lisp Reference Manual, 及び `INSTALL' ファイルを参照のこと。)

これら以外にも三つのサイト用の初期化ファイルがあり、それらは存在すれば Emacs の起動時に自動的にロードされる。この三つのファイルというのは、 `.emacs'前にロードされる `site-start.el'、及び `.emacs'後にロードされる `default.el' と端末タイプファ イルである。

`.emacs' での設定や定義は、`site-start.el' での設定や定義を上 書きする。そして、`default.el' や端末タイプファイルが更にその設定や 定義を上書きすることになる。(端末タイプファイルによる上書きを防ぐには、 term-file-prefixnil にする。ちょっとした拡張, を参照。)

配布の中に含まれる `INSTALL' ファイルには、`site-init.el'`site-load.el' についての説明がある。

`loadup.el'`startup.el'、そして `loaddefs.el' ファイル がロードをコントロールしている。これらのファイルは Emacs の配布の中の `lisp' ディレクトリの中にあるので、読んでみると良い。

`loaddefs.el' ファイルには、何を個人的な `.emacs' ファイルの中 に書き、何をサイト用の初期化ファイルに書くべきなのかということについて多 くの有益な示唆が書かれている。


16.2 あるセッションでの変数の設定

私の使用している Emacs version 19.23 には、edit-options コマンド を利用して設定出来る392のオプションがある。これらの「オプション」という のは以前説明したように、defvar を使って定義された変数に過ぎない。

Emacs では、これらの変数が「容易に設定出来るように意図されたものか」とい うことを、説明文字列の最初の一文字で判別している。つまり、もし最初の文字 が `*' だったら、その変数はユーザが設定出来るオプションである。 (defvar を用いた変数の初期化, を参照。)

edit-options コマンドは Emacs Lisp のライブラリを書いた人々が簡単 に設定出来るようにするべきだと考えた Emacs の変数を全て列挙してくれる。 そして、変数を簡単に再設定出来るようなインターフェースを与えてくれる。

一方で、edit-options で設定されたオプションは現在の編集セッション の間にしか効力を持たない。新しく設定した値は次のセッションには保存されな い。Emacs は起動される度に新しくソースコードから defvar されたオ リジナルの値を読み取るわけである。次のセッションでもその変数の設定を使い たい場合には、`.emacs' 等の起動の度にロードされるファイルで setq 式を使って値を上書きする必要がある。

私にとっての edit-options コマンドの主な使い道というのは、自分の `.emacs' ファイルで設定したくなるような変数を示唆してもらうというも のである。このコマンドが出すリストを見てみることを強く薦めておく。

section `Editing Variable Values' in The GNU Emacs Manual, を見れば、より詳しいことが書かれている。


16.3 `.emacs' の書き方

Emacs を起動すると、コマンドラインに `-q' を指定して読み込まないよ うにした場合を除き、`.emacs' ファイルがロードされる。 (emacs -q コマンドでは、素のままの Emacs が起動される。)

`.emacs' ファイルは Lisp 式を含んでいる。大抵は値を設定するだけだが、 時には関数定義が書かれていることもある。

初期化ファイルの簡単な説明については、次を参照。section `The Init File `~/.emacs'' in The GNU Emacs Manual.

この章でも同じようなことを説明するのだが、その際、私が長く使ってきた私 自身の `.emacs' を素材にすることにする。

ファイルの最初の部分はコメントからなる。これは個人的なメモとして利用して いる。勿論、今はその内容を把握しているが、最初はそうではなかった。

 
;;;; Bob's .emacs file
; Robert J. Chassell
; 26 September 1985 

日付を見てみよう! このファイルを使い初めたのは随分と昔だ。それ以来、 内容を追加してきたわけである。

 
; Each section in this file is introduced by a
; line beginning with four semicolons; and each
; entry is introduced by a line beginning with
; three semicolons.

 
(日本語訳)
; このファイルの各セクションは行頭がセミコロンであるような
; 行から始まる。また、各項目は行頭が三つのセミコロンである
; ような行から始まる。

ここでは Emacs Lisp のコメントの通常の便宜上の慣習を説明している。セミ コロンで始まる行は全てコメントである。二つ、三つ、ないしは四つのセミコロ ンがセクションやサブセクションのために使われる。(コメントについての説明 は次を参照。section `Comments' in The GNU Emacs Lisp Reference Manual.)

 
;;;; The Help Key
; Control-h is the help key; 
; after typing control-h, type a letter to
; indicate the subject about which you want help.
; For an explanation of the help facility, 
; type control-h three times in a row.

 
(日本語訳)
;;;; ヘルプキーについて
; Control-h がヘルプキーである。
; control-h をタイプした後、見たいヘルプの内容を示す
; 文字をタイプする。ヘルプ自体の簡単な説明を見るには
; control-h を三回タイプすればよい。

ここでは特に C-h を三回タイプすることでヘルプが表示されることを注 意しておく。(訳註:これは訳者の Mule-2.3 (Emacs version 19.28) では二回 押すだけで表示された。仕様が変わったのだと思う。)

 
; To find out about any mode, type control-h m
; while in that mode.  For example, to find out
; about mail mode, enter mail mode and then type
; control-h m.

 
(日本語訳)
; あるモードがどんなものか知りたい場合は、そのモードで
; control-h m とタイプする。例えば、mail mode について
; 知りたい場合は mail mode に入ってから control-h m と
; タイプする。

私はこれを「モードヘルプ (mode help)」と読んでいるのだが、大変便利である。 普通はこれを読むだけで必要なことが殆ど分ってしまう。

勿論、このようなコメントは `.emacs' ファイルに含める必要はない。私 がこれらを含めたのは、よくモードヘルプのことやコメントの書き方を忘れたた めだ。で、これを見れば思い起こすことが出来たわけである。


16.4 Text モードと Auto Fill モード

さて、Text mode や Auto Fill mode をオンにする箇所まで来た。

 
;;; Text mode and Auto Fill mode
; The next two lines put Emacs into Text mode
; and Auto Fill mode, and are for writers who
; want to start writing prose rather than code.

 
(日本語訳)
;;; Text mode と Auto Fill mode
; 次の二つの行は、Emacs を Text mode や Auto Fill mode 
; にするためのものである。コードを書くよりは普通の文章
; を書くことが多い人向けの設定である。
 
(setq default-major-mode 'text-mode)
(add-hook 'text-mode-hook 'turn-on-auto-fill)

これが、この `.emacs' の中で、どこかの忘れっぽい人間のための備忘録 以外のちゃんとした役目を果たす最初の部分である。

この括弧で挟まれた二行の内の最初の一行は、ファイルを読み込む際に、そのファ イルに C mode のような特定のモードが設定されていない場合には Text mode に入るようにするものである。

Emacs は、ファイルを読む際にその拡張子を見る。(拡張子というのは `.' の後に続く部分である。もしファイルが `.c'`.h' という拡張子 で終わっていれば、Emacs は C mode になる。また、Emacs はファイルの最初の 空行でない行も見る。例えば最初の行に `-*- C -*-' と書かれていれ ば、Emacs は C mode になる。Emacs は自動判別のための拡張子とモード指定の リストを持っている。更に Emacs は、そのバッファの最後のページ付近に "local variable list" があれば、それも見る。

section `How Major Modes are Chosen' in The GNU Emacs Manual.

section `Local Variables in Files' in The GNU Emacs Manual.

さて、`.emacs' ファイルに戻ろう。

もう一度、さっきの行を書いておく。これは何をするのものだろう?

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

この行は、短いながらも完全な Emacs Lisp の式である。

我々は既に setq には慣れ親しんでいる。これは、後に続く変数 default-major-mode をその後の text-mode という値にセットす るものだ。text-mode の先頭の引用符は、Emacs に text-mode がシンボルとして何を表しているかを見るのではなく、文字 通りそのまま扱うよう指示するものである。setq のより詳しい説明につ いては次を参照。変数の値の設定. 大切なポイントは、`.emacs' で値をセットする手続きは、Emacs の他 の場所での手続きと全く違いはないということである。

次は二行目である。

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

この行では、add-hook コマンドで turn-on-auto-filltext-mode-hook という変数に加えている。turn-on-auto-fill はプログラムの名前であり、名前から推察される通りのことを行う。Auto Fill mode をオンにするのである。

Emacs は Text mode に入るたびに、Text mode にフック (hook) されたコマン ドを実行する。従って、Emacs が Text mode になるごとに Auto Fill mode も オンになるわけである。

まとめると、最初の行は、特に拡張子や最初の空でない行や局所変数からどのモー ドにしてよいか分らない場合には Text mode になるよう設定するものである。

Text mode では、物書きには便利な構文テーブルが設定されたりする。例えば、 アポストロフィ `'' は普通の文字ように単語の一部だと解釈するが、終止 符や空白は単語の一部だとは考えない。従って M-f では `it's' 全 体を飛び越えて進む。一方、C mode では、`it's' のちょうど `t' の直後の位置で止まる。

また二行目は、Text mode に入る際に同時に Auto Fill mode もオンにするため のものである。Auto Fill mode では、Emacs は自動的に長い行を次の行に折り 返してくれる。その際は、単語を寸断したりせずちゃんと単語と単語の間を折り 返すようになっている。

Auto Fill mode がオフになっている場合は、行はあなたがタイプしていくとそ のまま右に伸びていく。行が右端まで到達した場合、truncate-lines の 値をどう設定しているかによって、右の部分が見えなくなったり、あるいは汚い 形で表示されたりする。


16.5 メールのエイリアス

以下が mail aliases 等を使えるようにする setq 式、及びそれについ ての備忘録である。

 
;;; Mail mode
; To enter mail mode, type `C-x m'
; To enter RMAIL (for reading mail), 
; type `M-x rmail'

 
(日本語訳)
;;; Mail mode
; Mail mode に入るには、`C-x m' とタイプする。
; (mail を読むために) RMAIL にはいるには、
; `M-x rmail' とタイプする。

(setq mail-aliases t)

この setq コマンドは、変数 mail-aliases の値を t に セットする。t は真を意味するので、この行は「どうぞ、mail aliases を使って下さい」という意味になる。

Mail aliases というのは、長い電子メールアドレスや電子メールアドレスのリ ストに対する便宜上の短い名前のことである。あなたの `aliases' を保存して おくファイルは `~/.mailrc' である。alias は次のような形式で書けばよ い。

 
alias geo george@foobar.wiz.edu

George にメッセージを書く場合は、アドレスに `geo' と書くだけでよい。 するとメイラーは自動的に `geo' をフルアドレスに展開してくれる。


16.6 Indent Tabs モード

Emacs はデフォルトでは、リージョンを整形する際に沢山の空白の連続にはタブ を挿入する。(例えばあなたは、沢山の行を一度にインデントするために indent-region を使ったりすることだろう。) タブは端末や普通の印刷 では綺麗に見える。しかし TeX ではタブは無視されるために、TeX や Texinfo を使う際には出力が汚くなってしまう。

次のようにすれば、Indent Tabs mode をオフに出来る。

 
;;; Prevent Extraneous Tabs
(setq-default indent-tabs-mode nil)

この行では、今まで使ってきた setq ではなく setq-default を 使っていることに注意しよう。setq-default コマンドは、その変数に対 するバッファローカルな値がない場合に限り、その値をセットする。

section `Tabs vs. Spaces' in The GNU Emacs Manual.

section `Local Variables in Files' in The GNU Emacs Manual.


16.7 幾つかのキーバインディング

次は、幾つかの個人的なキーバインディングの設定である。

 
;;; Compare windows
(global-set-key "\C-cw" 'compare-windows)

compare-windows は、現在のウィンドウと次のウィンドウの中のテキス トを比較してくれるという、洒落たコマンドである。これは、各々のウィンドウ の中のポイントの位置から比較を開始して、両方が同じである所まで進む。私は このコマンドをいつも利用している。

また、これを見れば、全てのモードに対する大域的なキーバインディングを設定 する方法が分る。

コマンドは global-set-key だ。この後にキーバインディングが続く。 `.emacs' ファイルではキーバインディングは上に示した通りの方法で書か れる。\C-c は `control-c', つまり、「control キーと c を同 時に押す」ことを表わす。また、w は「w を押す」ことを表わす。 説明の中では、C-c w のように書かれる。(CTL キーではなく M-c のような META キーを使ったバインドをしたい場合は、 \M-c のように書く。詳しくは次を参照。section `Rebinding Keys in Your Init File' in The GNU Emacs Manual.)

このキーで呼び出されるコマンドは compare-windows である。この時、 compare-windows の先頭に引用符を付けることに注意しよう。そうしな いと、Emacs は最初にこのシンボルの値を評価しようとしてしまう。

二重引用符と、`C' の前のバックスラッシュ、及び単独の引用符の三つは キーバインディングには必須であるにもかかわらず、私はよく忘れてしまう。幸 いなことに、これらは `.emacs' を見れば思い出すことが出来る。

C-c w というキーバインディングそのものについても書いておく。これは、 C-c という前置キーと一文字---今の場合は w---からなっている。 このような C-c に続けて一文字というキー設定は、特に個人的な用途に 残されている。もしあなたが Emacs を拡張したい場合、これらのキーを公の 用途に使わないで欲しい。その代わり、C-c C-w のようなキーを使うべき である。そうでないと個人用にバインドするキーがなくなってしまう。

以下にコメント付きで他のキーバインディングを書いておく。

 
;;; Keybinding for `occur'
; I use occur a lot, so let's bind it to a key:
; (私は occur をよく使うので、キーにバインドしておく。)
(global-set-key "\C-co" 'occur)

occur コマンドは、現在のバッファの中で正規表現にマッチする部分を 含む行を全て表示してくれるコマンドである。マッチした行は、`*Occur*' というバッファに表示される。このバッファはその位置に簡単に飛ぶためにも使 われる。

次に、キーバインディングの解除の仕方を示す。特定のキーバインディングを使 えなくするわけである。

 
;;; Unbind `C-x f'
(global-unset-key "\C-xf")

このキーバインディングを解除するのには理由がある。私は、自分がよく C-x C-f とタイプしようとして、間違って C-x f とタイプし てしまうことに気が付いた。ファイルを読み込もうとして、偶然行詰めの幅を設 定してしまうわけである。結果的に大抵は変な幅が設定されてしまう。私はこの 幅を変更することは殆どないので、単にキーバインディングを解除することにし たのだ。

次は現在のキーをバインドし直すものである。

 
;;; Rebind `C-x C-b' for `buffer-menu'
(global-set-key "\C-x\C-b" 'buffer-menu)

デフォルトでは、C-x C-blist-buffer コマンドを起動するも のである。このコマンドは現在のバッファのリストを別のウィンドウに 表示する。私は大抵はそのウィンドウで何かをしたいことが多いので buffer-menu コマンドの方が好きである。これは単にバッファのリスト を表示するだけでなく、ポイントをそのウィンドウに移動してくれる。


16.8 ファイルのロード

GNU Emacs のコミュニティの沢山の人々が Emacs の拡張を行ってきた。時が経 つにつれ、これらの拡張が新しいリリースに含まれることも多くなった。例えば カレンダーや日記のパッケージは今や Emacs version 19 の配布の一部になって いる。これらは標準の Emacs version 18 の配布には含まれていなかったものだ。

(私は Calc も Emacs の大切な一部だと考えている。パッケージが大きいために 別配布の形を取ってはいるものの、これも標準の配布の一部と言えるだろう。)

load コマンドを使うと、ファイルの中身全てを評価することが出来る。 従って、そのファイルの関数や変数を全て Emacs にインストールすることが可 能だ。例えば、

 
(load "~/emacs/kfill")

というS式は、ホームディレクトリの `emacs' というサブディレクトリの 下の `kfill.el' ファイルを評価、即ちロードする。(もしバイトコンパイ ルされた `kfill.elc' があれば、そちらがロードされる。こっちの方が速 くロード、実行出来る。)

(`kfill.el' は、Kyle E. Jones の `filladapt.el' パッケージを Bob Weinere が改造したもので、「すっきりとして、こうるさいくない折り返し 及びパラグラフの行詰めを提供し、ニュースやメール、それに Lisp, C++, Postscript やシェルコマンドなんかを含めてインデントしてくれる」パッケー ジである。私はこれをよく利用するので、標準の配布の中に含めてくれることを 願っている。)

沢山の拡張パッケージをロードしたい場合は、上のようにそのファイルの位置を 正確に指定するのではなく、あるディレクトリを Emacs の load-path に指定するとよい。私はそうしている。この場合には、Emacs はファイルをロー ドする際にデフォルトのディレクトリのリストに加えてそのディレクトリも検索 してくれるようになる。(デフォルトのディレクトリは Emacs を作成する際に `paths.h' で指定される。)

次のコマンドで、`~/emacs' ディレクトリを現在のロードパスに含めるこ とが出来る。

 
;;; Emacs Load Path
(setq load-path (cons "~/emacs" load-path))

ついでに言っておくと、load-library は関数をロードする際のインタラ クティブなインターフェースも提供してくれる。この関数の完全なコードは次の ようになっている。

 
(defun load-library (library)
  "Load the library named LIBRARY.
This is an interface to the function `load'."
  (interactive "sLoad library: ")
  (load library))

load-library という関数の名前では `library' という言葉を便宜的に `file' の同意語として見ている。load-library コマンドのソースは `files.el' ライブラリにある。

これと若干違う動作をするインタラクティブなコマンドとして、 load-file がある。これが load-library とどう違うかについて のより詳しい情報は次を参照。section `Libraries of Lisp Code for Emacs' in The GNU Emacs Manual.


16.9 オートロード

その関数を含むファイルをロードしたり、関数定義を直接評価したりしてインス トールする代わりに、その関数が実際に最初に使われるまではインストールはし ないが、いつでも呼び出せる状態にはしておくということも出来る。これは オートロード (autoloading) と呼ばれる。

オートロードされた関数を実行すると、Emacs は自動的にその定義を含むファイ ルを評価して、その関数を呼び出す。

オートロード関数を使うと Emacs をより速く起動出来る。というのも起動時に はそのライブラリはロードされないからだ。その代わり、最初にオートロードさ れた関数を使う際には、それを含むファイルを評価する間ちょっと待たされるこ とになる。

めったに使われない関数はしばしばオートロードされる。`loaddefs.el' ライブラリには bookmark-set から wordstar-mode まで何百も のオートロードされる関数が含まれている。勿論、個人的にこれらの「めったに 使わない」関数を頻繁に使うことになることもあるかもしれない。この場合は、 その関数のファイルを load 式を使って .emacs ファイルの中で ロードしておくべきだろう。

私の Emacs version 19.23 用の `.emacs' ファイルでは、元々オートロー ドされるような関数を含む17のライブラリがロードされている。(実際には、こ れらの関数を「dump」した Emacs を作るべきなのだが、忘れていたのだ。dump についての詳しい情報は、section `Building Emacs' in The GNU Emacs Lisp Reference Manual, や `INSTALL' を見て欲しい。)

あるいはまた `.emacs' ファイルにオートロード式を書きたいこともある だろう。autoload は五つの引数を取る組み込み関数であり、最後の三つ の引数は省略可能である。最初の引数はオートロードする関数の名前、二番目の 引数はロードされるファイル名、三番目は関数の説明文、四番目はその関数をイ ンタラクティブに呼び出せるかどうか、そして最後の五番目の引数は、オブジェ クトのタイプ---autoload は関数だけでなく、キーマップやマクロも扱 えるので---である。(デフォルトは関数である。)

以下に典型的な例を挙げる。

 
(autoload 'html-helper-mode
  "html-helper-mode" "Edit HTML documents" t)

この式は、html-helper-mode 関数をオートロードするものである。これ は、`html-helper-mode.el' ファイルの中でロードされる。(あるいは、も し `html-helper-mode.elc' があれば、そちらから読み込まれる。) この ファイルは load-path で指定されたディレクトリに置かれていなければ ならない。説明文を読むと、これは HyperText Markup Language で書かれた文 書を編集するためのモードであることが分る。このモードは M-x html-helper-mode とタイプすることでインタラクティブに呼び出すことが出来 る。(この場合、オートロード式の説明文には正規の説明文をそのまま複写する 必要がある。正規の説明文はまだロードされていないので、まだ読めないわけで ある。)

詳しくは、次を参照。section `Autoload' in The GNU Emacs Lisp Reference Manual.


16.10 ちょっとした拡張: line-to-top-of-window

次に、ポイントのある行をウィンドウの最上段に移動する簡単な Emacs の拡張 を書いておく。これを使うとテキストを簡単に見ることが出来るので、私は普段 よく利用している。

次のコードを別ファイルにして、それを `.emacs' でロードしても良いし、 コードを直接 `.emacs' の中に含めてしまうことも出来る。

以下が定義である。

 
;;; Line to top of window;  
;;; replace three keystroke sequence  C-u 0 C-l
(defun line-to-top-of-window ()
  "Move the line point is on to top of window."
  (interactive) 
  (recenter 0))

次にキーバインディングである。

大抵の Emacs version 18 用の `.emacs' ファイルは、そのまま version 19 でも動くのだが、やはり幾つかの違いがある。(勿論 Emacs 19 での新しい 機能もある。)

Version 19 の Emacs では、ファンクションキーを `[f6]' のように書く ことが出来る。Version 18 ではファンクションキーを押した時にキーボードか ら送られるキーストロークを指定しなければならなかった。例えば Zenith 29 キーボードでは、6番目のファンクションキーを押すと ESC P が送られる し、Ann Aubor Ambassador キーボードでは ESC O F が送られる。これら のキーストロークは各々 `\eP' 及び `\eOF' のように書かれること になる。

私は version 18 の `.emacs' では line-to-top-of-window を端 末のタイプに依存するキーにバインドしている。

 
(defun z29-key-bindings () 
  "Function keybindings for Z29 terminal."
  ;; ...
  (global-set-key "\eP" 'line-to-top-of-window))

(defun aaa-key-bindings () 
  "Function keybindings for Ann Arbor Ambassador"
  ;; ...
  (global-set-key "\eOF" 'line-to-top-of-window))

(ファンクションキーを押した時にどういうキーストロークが送られるかは、 C-h l (view-lossage) とタイプすることで知ることが出来る。こ れは、最後にタイプした100のキーストロークを表示してくれる。)

キーバインディングを指定した後は、端末タイプに従って、そのどちらかのキー バインディングを選択するS式を評価する。が、その前に以前定義されたデフォ ルトのキーバインディングを削除する。そうしないと、定義がぶつかった場合に `.emacs' でのキーバインディングが上書きされる。

 
;;; Turn Off Predefined Terminal Keybindings

; The following turns off the predefined 
; terminal-specific keybindings such as the
; vt100 keybindings in lisp/term/vt100.el.  
; If there are no predefined terminal
; keybindings, or if you like them,
; comment this out.

 
(日本語訳)
;;; 以前定義された端末のキーバインディングを取り消す
; 下の式では、以前定義された端末固有のキーバインディング、
; 例えば lisp/term/vt100.el にある vt100 のキーバインディ
; ングを取り消すものである。
; もしまだ端末固有のキーバインディングが定義されていなかっ
; たり、そのバインディングが好みのものであった場合は、これ
; をコメントアウトしよう。

(setq term-file-prefix nil)

以下が選択のためのS式である。

 
(let ((term (getenv "TERM")))
  (cond 
   ((equal term "z29") (z29-key-bindings))
   ((equal term "aaa") (aaa-key-bindings))
   (t (message
       "No binding for terminal type %s."
       term))))

Emacs version 19 では、ファンクションキーは (マウスボタンイベントや非 アスキー文字と同様) 引用符無しの角括弧でくくって書くことが出来る。 私は次のようにして line-to-top-of-window をファンクションキー F6 にバインドしている。

 
(global-set-key [f6] 'line-to-top-of-window)

こっちの方がずっと単純だ!

より詳しいことについては、次を見て欲しい。section `Rebinding Keys in Your Init File' in The GNU Emacs Manual.

Emacs 18 と Emacs 19 の両方を走らせている場合、次のような条件分岐を使っ て、どちらのコードを使うかを選択することが出来る。

 
(if (string=
     (int-to-string 18)
     (substring (emacs-version) 10 12))
    ;; evaluate version 18 code
    (progn
       ... )
  ;; else evaluate version 19 code
  ...


16.11 キーマップ

Emacs はどのキーをどのコマンドにバインドするかを keymaps を使って 記録する。C mode や Text mode のような特定のモードは、それ自身のキーマッ プを持っている。モード独自のキーマップは、全てのバッファで共有される global map を上書きする。

global-set-key 関数は global keymap のキーをバインドしたり再バイ ンドしたりする。例えば次のS式は、キー C-c C-l を関数 line-to-top-of-window にバインドする。

 
(global-set-key "\C-c\C-l" 'line-to-top-of-window)

モード独自のキーマップは define-key 関数を使ってバインドされる。 これは、キーやコマンドと同時に特定のキーマップも引数に取る。例えば私の `.emacs' ファイルでは、texinfo-insert-@group コマンドを C-c C-c g にバインドするために、次のようなS式が書かれている。

 
(define-key texinfo-mode-map "\C-c\C-cg"
  'texinfo-insert-@group)

texinfo-insert-@group 関数そのものは、Texinfo ファイルに `@group' をインサートするためのちょっとした Texinfo mode の拡張であ る。私はこのコマンドをいつも使うので、六つのキーストローク @ g r o u p よりも三つのキーストロークである C-c C-c g を使う方がずっと便 利なのだ。(`@group' と対応する `@end group' は中のテキストを 一つのページに収めるためのコマンドである。この本の中の、沢山の複数行に 渡る例が `@group ... @end group' で囲まれている。)

以下が texinfo-insert-@group の関数定義である。

 
(defun texinfo-insert-@group ()
  "Insert the string @group in a Texinfo buffer."
  (interactive)
  (beginning-of-line)
  (insert "@group\n"))

(タイプ数を節約するためには、勿論、単語を挿入する関数を定義したりする代 わりに Abbrev mode を使うことも出来る。しかし、キーストロークが他の Texinfo mode のキーバインディングと調和が取れているという意味で、私は上 の方法の方が好みである。)

`loaddefs.el' を見れば `c-mode.el'`lisp-mode.el' のよ うな様々なモードライブラリと同時に沢山の define-key 式が書かれてい るのが分る。

キーマップについての詳細は次を参照のこと。 section `Customizing Key Bindings' in The GNU Emacs Manual, 及び section `Keymaps' in The GNU Emacs Lisp Reference Manual.


16.12 X11 でのカラー表示

X Window System を使うと、Emacs version 19 をカラーで使うことが出来る。 (これまでに挙げた全ての例は、Emacs version 18 でも Emacs version 19 でも 動くはずである。が、ここの例は Emacs version 19 でのみ動作する。)

私はデフォルトのカラーが気に入らないので、自分独自の色を指定している。

私の指定は、大抵の X の初期化ファイルにあるものである。やったことを備忘 録として自分の `.emacs' に記述している。

 
;; I use TWM for window manager;
;; my ~/.xsession file specifies:

 
(日本語訳)
;; 私はウィンドウマネージャとして TWM を使っている。
;; 私の ~/.xsession ファイルには次のように記されている。
;    xsetroot -solid navyblue -fg white

実際は、X Window のルートは Emacs の一部などでは全くない。が、ともかく書 いておくことにした。

 
;; My ~/.Xresources file specifies:
;; (私の ~/.Xresources ファイルには、次のように記されている。)
;     XTerm*Background:    sky blue
;     XTerm*Foreground:    white
;     emacs*geometry:      =80x40+100+0
;     emacs*background:    blue
;     emacs*foreground:    grey97
;     emacs*cursorColor:   white
;     emacs*pointerColor:  white

次からが、`.emacs' で値を設定しているS式の部分である。

 
;;; Set highlighting colors for isearch and drag
;;; (isearch とドラッグのためのハイライトカラー)
(set-face-foreground 'highlight "white" )
(set-face-background 'highlight "slate blue")
(set-face-background 'region    "slate blue")
(set-face-background
 'secondary-selection "turquoise")

;; Set calendar highlighting colors
;; カレンダー用のハイライトカラー
(setq calendar-load-hook
      '(lambda () 
         (set-face-foreground 'diary-face   "skyblue")
         (set-face-background 'holiday-face "slate blue")
         (set-face-foreground 'holiday-face "white")))

色々な色合いの青が、スクリーンのちらつきから私の眼を守り、そして癒してく れる。


16.13 V19 での雑多な事柄

以下は、Emacs version 19 用の細かい設定である。


16.14 モード行の修正

最後に、モード行の修正について述べる。これが変更出来るようになっているの は本当に嬉しい。

私は時々ネットワーク上で仕事をするので、通常モード行の左側に書かれている `Emacs: ' をシステムの名前で置き換えている---そうしないと、私が現在 どのマシンの上で仕事をしているか忘れてしまうからである。更に、どのディレ クトリにいたかを忘れないようにデフォルトのディレクトリのリストも書いてい る。また、`Line' が溢れるために、line point を on にした。以上の設 定をする `.emacs' の記述は以下の通りである。

 
(setq mode-line-system-identification  
  (substring (system-name) 0
             (string-match "\\..+" (system-name))))

(setq default-mode-line-format
      (list ""
            'mode-line-modified
            "<"
            'mode-line-system-identification
            "> "
            "%14b"
            " "
            'default-directory
            " "
            "%[(" 
            'mode-name 
            'minor-mode-alist 
            "%n" 
            'mode-line-process  
            ")%]--" 
             "Line %l--"
            '(-3 . "%P")
            "-%-"))

;; Start with new default.
(setq mode-line-format default-mode-line-format)

default のモード行のフォーマットは Info のような様々なモードが上 書きすることを許すようにした。リストの中の多くの要素は、名前から役目が推 測出来るようになっている。例えば mode-line-modified はバッファが 修正された場合、それを教えてくれるようにする変数だし、mode-name はモードの名前を教えてくれる、等々。

`"%14b"' は現在のバッファの名前を (お馴染みの buffer-name 関 数を使って) 表示する。`14' は表示する文字数の最大の指定である。それより も文字数が少ない場合は空白文字で埋めてくれる。`%['`%]' は 各々の再帰編集レベルに応じて角括弧の組を表示するものである。 `%n' はナローイングをしている時に `Narrow' と表示してくれる。 `%P' はバッファ全体でウィンドウの最下段より上にある部分が何パーセン トあるか、もしくは `Top' か `Bottom' かを表示してくれる。(小文字の `p' にすると、ウィンドウの最上段より上の部分がどのくらいかを表示す る。) `%-' は行の残りをダッシュ (訳註:`-' のこと) で埋めてくれる。

Emacs version 19.29 以降では、frame-title-format を使って Emacs のフレームにタイトルを表示することが出来る。この変数は mode-line-format と同じ構造をしている。

モード行のフォーマットについては、次に説明がある。section `Mode Line Format' in The GNU Emacs Lisp Reference Manual.

(訳註:Nemacs や Mule では日本語コードや多国語コードの状態を表示するため に拡張が加えられている。default-mode-line-format を一度評価して値 を調べ、それを元に修正するとよいだろう。)

もう一度「Emacs を好きになるために Emacs を好きになる必要はない。」とい う言葉を思い出して欲しい---あなた自身の Emacs はデフォルトの Emacs とは 異なる色や異なるコマンド、そして異なるキーマップを持つことが出来るのだ。

一方で、もし「箱から取り出したままの」カスタマイズされていない素の Emacs を起動したい場合は、次のようにタイプしよう。

 
emacs -q

こうすると、Emacs はあなたの初期化ファイル `~/.emacs' をロードしな いで起動する。これが素のままのデフォルトの Emacs である。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Matsuda Shigeki on April, 10 2002 using texi2html