.emacs'
[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16. 個人用ファイル`.emacs'

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Emacs%20Initialization"
"intro/個人用ファイル`.emacs'"へのコメント(無し)

「Emacsを好きになるにはEmacsが好きである必要はない」。 この矛盾するような言葉は、GNU Emacsの秘密である。 「箱から取り出した」ままのEmacsは、汎用のツールである。 Emacsを使うほとんどの人は、満足のいくようにカスタマイズする。

GNU Emacsは、ほとんどEmacs Lispで書かれている。 つまり、Emacs Lispの式を書けば、Emacsを修正したり拡張できるのである。

Emacs's Default Configuration

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Default%20Configuration"
"intro/Emacs'sDefaultConfiguration"へのコメント(無し)

Emacsのデフォルトの設定に満足する人もいる。 Emacsは、Cのファイルを編集するとCモードで、 Fortranのファイルを編集するとFortanモードで、 普通のファイルを編集すると基本(Fundamental)モードで始まる。 誰がEmacsを使おうとしているのかわからない場合には、 これらはすべて意味があることである。 普通のファイルで何をしたいか予測できる人がいるだろうか?  Cのコードを編集するときにはCモードが正しいデフォルトであるように、 基本モードはそのようなファイルに対する正しいデフォルトである。 しかし、読者自身がEmacsを使う場合には、 Emacsをカスタマイズすることに意味がある。

たとえば、筆者は特定のファイル以外では基本モードを好み、Textモードを好む。 そのために、Emacsをカスタマイズして、筆者に適するようにする。

`~/.emacs'ファイルを書くことで、 Emacsをカスタマイズしたり拡張できる。 これは、個人用の初期化ファイルであり、 その内容はEmacs Lispで書かれており、Emacsに何をすべきかを指示する。

本章では、簡単な`~/.emacs'ファイルについて説明する。 より詳しくは、節 `The Init File' in

GNU Emacsマニュアル
や節 `The Init File' in
GNU Emacs Lispリファレンスマニュアル
を参照してほしい。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.1 サイト全体の初期化ファイル

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Site-wide%20Init"
"intro/サイト全体の初期化ファイル"へのコメント(無し)

個人用の初期化ファイルに加えて、 Emacsはサイト全体のさまざまな初期化ファイルを自動的にロードする。 これらは個人用の`~/.emacs'ファイルと同じ形式であるが、 誰もがロードするものである。

サイト全体の2つの初期化ファイル、`site-load.el'と`site-init.el'は、 もっとも一般的に使われるEmacsの「ダンプ版」を 作成するときにEmacsにロードされる (ダンプ版Emacsは、素早くロードできる。 しかし、いったんファイルをロードしてダンプすると、 変更をロードし直したり再度ダンプし直さない限り、その変更は反映されない。 ファイル`INSTALL'や See 節 `Building Emacs' in

GNU Emacs Lispリファレンスマニュアル
)。

Emacsを起動するたびに、サイト全体の3つの初期化ファイルが自動的にロードされる。 これらは、個人の`.emacs'ファイルをロードするまえにロードされる `site-start.el'と、個人の`.emacs'ファイルをロードしたあとに ロードされる`default.el'と端末タイプファイルである。

個人の`.emacs'ファイル内の設定や定義は、 ファイル`site-start.el'内の重複する設定や定義を上書きする。 しかし、`default.el'や端末タイプファイルでの設定や定義は、 個人の`.emacs'ファイルでの設定や定義を上書きする (端末タイプファイルの干渉を防ぐには、 term-file-prefixnilを設定する。 See 節 16.10 簡単な拡張:line-to-top-of-window)。

ディストリビューションに含まれるファイル`INSTALL'には、 ファイル`site-init.el'と`site-load.el'に関する説明がある。

ファイル`loadup.el'、`startup.el'、`loaddefs.el'は、 ファイルのロードを制御する。 これらのファイルは、Emacsディストリビューションのディレクトリ`lisp'に あり、見ておく価値がある。

ファイル`loaddefs.el'には、個人の`.emacs'ファイルや サイト全体の初期化ファイルに何を書くべきかについて多くの有用な助言がある。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.2 一回だけの作業用の変数の設定

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=edit-options"
"intro/一回だけの作業用の変数の設定"へのコメント(無し)

筆者のEmacs第19.23版には、コマンドedit-optionsで設定可能な オプションが392個ある。 これらの「オプション」は、これまでに説明したきた変数と何ら変わらず、 defvarを用いて定義されている。

Emacsは、変数の説明文字列の最初の文字を調べて、 その変数が設定用のものかどうかを判断する。 最初の文字がアスタリスク`*'ならば、 変数はユーザーが設定可能なオプションである (See 節 8.4 defvarによる変数の初期化)。

コマンドedit-optionsは、Emacs Lispのライブラリ作成者が ユーザーが設定してよいと判断したEmacs内のすべての変数を一覧表示する。 これらの変数を再設定する使いやすいインターフェイスを提供する。

一方、edit-optionsで設定したオプションは、 現在の作業中でのみ有効である。 新しい値は、作業を越えては保存されない。 Emacsを起動するたびに、ソースコードのもとのdefvarの値を読むことになる。 設定変更を次回の作業でも有効にするには、 `.emacs'ファイルや起動時にロードする他のファイルで、 setq式を使う必要がある。

筆者の場合、コマンドedit-optionsの主な利用目的は、 `.emacs'ファイルに設定する変数を探すことである。 一覧表示を読むことを強く勧める。

より詳しくは、 See 節 `Editing Variable Values' in

GNU Emacsマニュアル



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.3 ファイル`.emacs'入門

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Beginning%20a%20.emacs%20File"
"intro/ファイル`.emacs'入門"へのコメント(無し)

Emacsを起動すると、コマンド行で`-q'を指定して `.emacs'ファイルを読まないように指示しないかぎり、 Emacsは個人用の`.emacs'ファイルをロードする (コマンドemacs -qにより、箱から取り出したままのEmacsを使える)。

`.emacs'ファイルには、Lispの式が収めてある。 しばしば、値を設定する式だけの場合もある。 関数定義がある場合もある。

初期化ファイルの概略については、 See 節 `The Init File `~/.emacs'' in

GNU Emacsマニュアル

本章では、長期に渡って使ってきた完全な`.emacs'ファイルを説明する。 つまり、筆者の`.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の注釈の習慣を述べたものである。 セミコロン以降はすべて注釈である。 セミコロンの数で、節や小文を表している (注釈について詳しくは、 See 節 `Comments' in

GNU Emacs Lispリファレンスマニュアル
)。

 
;;;; 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.

ヘルプを起動するにはC-hを3回タイプすることの メモ書きである。

 
; 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.

筆者はこれを「モードヘルプ」と読んでいるが、これはとても助けになる。 普通、知っておくべきことをすべて教えてくれる。

もちろん、読者の`.emacs'ファイルに、これらの注釈を含める必要はない。 筆者のファイルに入れておいたのは、モードヘルプや注釈の習慣を忘れやすかった からである。 ここに書いておけば、見れば思い出せる。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.4 TextモードとAuto Fillモード

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Text%20and%20Auto-fill"
"intro/TextモードとAutoFillモード"へのコメント(無し)

TextモードとAuto Fillモードを有効にする部分である。

 
;;; 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.
 
(setq default-major-mode 'text-mode)
(add-hook 'text-mode-hook 'turn-on-auto-fill)

これは、物忘れしやすい人間へのメモ以外のことを初めて行う `.emacs'ファイルの部分である。

最初の括弧の中の2行は、ファイルを探したときに、 Cモードなどの他のモードでない場合には、Textモードを有効にする指示である。

Emacsがファイルを読み込むとき、ファイル名の拡張子を調べる (拡張子は`.'のあとに続く部分である)。 ファイルが`.c'や`.h'の拡張子で終わっていると、 EmacsはCモードを有効にする。 また、Emacsはファイルの最初の空行でない行を調べ、 その行が`-*- C -*-'となっていると、EmacsはCモードを有効にする。 Emacsは、自動的に使用する拡張子とモード指定のリストを持っている。 さらに、Emacsは、バッファごとの「ローカル変数リスト」を調べるために ファイルの最後のページも調べる。

See 節 `How Major Modes are Chosen' in

The GNU Emacs Manual
.

See 節 `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の残りの動作については、See 節 1.9 変数への値の設定。 重要な点は、`.emacs'ファイルで値を設定する方法と Emacsのそれ以外の場面で値を設定する方法とは何ら変わらないことである。

2行目はつぎのとおりであった。

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

この行では、コマンドadd-hookで、 変数text-mode-hookturn-on-auto-fillを追加する。 turn-on-auto-fillは、読者の予想どおり、プログラムの名前であり、 Auto Fillモードを有効にする。

Textモードを有効にするたびに、 EmacsはTextモードにフックしたコマンドを実行する。 つまり、Textモードを有効にするたびに、Auto Fillモードも有効にする。

まとめると、1行目は、ファイル名の拡張子や最初の空行以外の行や ローカル変数で指定されない限り、ファイルを編集するときは、 Textモードを有効にする指示である。

Textモードは、他のことも含めて、普通の文書作成に適した シンタックステーブルを設定する。 Textモードでは、Emacsは引用符を単語の一部として扱う。 しかし、ピリオドや空白は単語の一部ではない。 したがって、M-fで`it's'を飛び越せる。 一方、Cモードでは、M-fは`it's'の`t'の直後で止まる。

2行目は、Textモードを有効にしたらAuto Fillモードも有効にする指示である。 Auto Fillモードでは、Emacsは自動的に長すぎる行を分割し、つぎの行へ送る。 Emacsは、単語の途中ではなく、単語と単語のあいだで行を分ける。

Auto Fillモードを無効にすると、タイプしたとおりの行分けになる。 truncate-linesに設定した値に依存して、 タイプした単語が画面の右端から消えてしまうか、 見にくいが画面上に継続行として表示される。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.5 メールの別名

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Mail%20Aliases"
"intro/メールの別名"へのコメント(無し)

メモ書きも含めて、メールの別名を有効にするsetqである。

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

(setq mail-aliases t)

コマンドsetqで、変数mail-aliasesの値をtにする。 tは真を意味するので、この行の意味は、 「メールの別名を使うようにする」である。

メールの別名は、長い電子メールアドレスや複数の電子メールアドレスに 短縮名を付ける便法である。 「別名(aliases)」を保持するファイルは、`~/.mailrc'である。 別名はつぎのように書く。

 
alias geo [email protected]

Georgeにメッセージを書くときには、アドレス`geo'を使う。 メール転送プログラムは、自動的に`geo'を完全なアドレスに展開する。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.6 Indent Tabsモード(タブによる字下げ)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Indent%20Tabs%20Mode"
"intro/IndentTabsモード(タブによる字下げ)"へのコメント(無し)

デフォルトでは、リージョンを整形するときに、 Emacsは複数の空白のかわりにタブを挿入する (たとえば、コマンドindent-regionで一度に複数の行を字下げする場合)。 端末や普通の印刷ではタブは適しているのだが、 TeXはタブを無視するのでTeXやTexinfoでの字下げには適さない。

つぎの行は、Indent Tabsモードを無効にする。

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

これまでのようにコマンドsetqではなく、 setq-defaultを使っていることに注意してほしい。 コマンドsetq-defaultは、 その変数にバッファ独自の値が設定されていないバッファでのみ値を設定する。

See 節 `Tabs vs. Spaces' in

The GNU Emacs Manual
.

See 節 `Local Variables in Files' in

The GNU Emacs Manual
.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.7 キーバインド例

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Keybindings"
"intro/キーバインド例"へのコメント(無し)

つぎは、個人用のキーバインドである。

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

compare-windowsは、カレントウィンドウとつぎのウィンドウの テキストを比較するちょっとしたコマンドである。 両者のウィンドウのポイント位置から始めて、一致する限り 両者のウィンドウのテキストを比較する。 筆者はこのコマンドをよく使う。

これは、すべてのモードに対して大局的にキーを設定する方法でもある。

コマンドはglobal-set-keyである。 これに続けてキーバインドを書く。 `.emacs'ファイルでは、ここに記したようにキーバインドを書く。 \C-cは「control-c」のことで、 コントロールキーとcキーを同時に押し下げることを意味する。 wwキーを押し下げることを意味する。 キーバインドは二重引用符で囲む。 説明文章などでは、これをC-c wと書く (CTLキーのかわりにM-cのようにMETAをバインドする場合には、 \M-cと書く。 詳しくは、See 節 `Rebinding Keys in Your Init File' in

GNU Emacsマニュアル
)。

このキーで起動されるコマンドはcompare-windowsである。 コマンドの直前に引用符があることに注意してほしい。 さもないと、Emacsは、値を得るためにシンボルを評価しようとする。

これらの3つ、二重引用符、`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:
(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-bはコマンドlist-buffersを実行する。 このコマンドは、別のコマンドにバッファ一覧を表示する。 筆者はそのウィンドウでほとんどの場合、何かをしたくなるので、 バッファ一覧を表示するだけでなく、そのウィンドウにポイントも移動する コマンドbuffer-menuを好むのである。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.8 ファイルのロード

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Loading%20Files"
"intro/ファイルのロード"へのコメント(無し)

GNU Emacsの利用者の多くの人が、Emacsの拡張を書いている。 時が経つにつれて、これらの拡張はしばしば新しいリリースに取り込まれる。 たとえば、カレンダーや日記のパッケージは、いまでは、 Emacs第19版の標準ディストリビューションの一部である。 しかし、Emacs第18版の標準ディストリビューションの一部ではなかった。

(筆者がEmacsの重要な部分であると考えるCalcは、標準ディストリビューション の一部になるであろうが、巨大なので別配布になっている。)

コマンドloadを使えば、ファイル全体を評価してファイル内の 関数や変数をEmacsにインストールできる。 たとえばつぎのようにする。

 
(load "~/emacs/kfill")

これは、読者のホームディレクトリ下のディレクトリ`emacs'から ファイル`kfill.el'(バイトコンパイルしたファイル`kfill.elc'が あればそれ)を評価する、つまり、ロードする。

(`kfill.el'は、Kyle E. Jonesの`filladapt.el'パッケージを Bob Weinerが適応したもので、仰々しい単語の追い込みはせずに、 ニューズやメールのメッセージ、Lisp、C++、PostScript、シェルの注釈などの テキストを字下げを保存して段落に追い込む。 筆者はいつもこれを使っており、 標準ディストリビューションに組み込まれることを望んでいる。)

筆者のように多数の拡張をロードする場合、 上のように拡張ファイルの正確な場所を指定するかわりに、 そのディレクトリをEmacsのload-pathに追加指定できる。 すると、Emacsがファイルをロードするとき、デフォルトのディレクトリに加えて、 そのディレクトリも探す (デフォルトのディレクトリは、Emacsを構築するときに`paths.h'で指定する)。

つぎのコマンドは、既存のロードパスに 読者のディレクトリ`~/emacs'を追加する。

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

load-libraryは、関数loadの対話的インターフェイスである。 関数全体はつぎのようである。

 
(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(ライブラリ)」からきている。 コマンドload-libraryのソースはライブラリ`files.el'にある。

少々異なるが同じような処理を行う対話的コマンドはload-fileである。 load-libraryとこのコマンドとの違いに 関しては、See 節 `Libraries of Lisp Code for Emacs' in

GNU Emacsマニュアル



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.9 オートロード

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Autoload"
"intro/オートロード"へのコメント(無し)

関数を収めたファイルをロードしたり関数定義を評価したりして関数を インストールするかわりに、関数を利用できるようにはするが、 最初に呼び出すまで実際にはインストールしないようにできる。 これをオートロード(autoloading)という。

オートロードする関数を評価すると、Emacsは、関数を収めたファイルを 自動的に評価してから関数を呼び出す。

オートロードする関数を使うと、ライブラリをただちにロードする必要がないので、 Emacsの起動が素早くなる。 しかし、そのような関数を最初に使うときには、 それらを収めたファイルを評価するので、多少待つ必要がある。

あまり使わないような関数はしばしばオートロードの対象になる。 ライブラリ`loaddefs.el'には、bookmark-setからwordstar-mode までの何百ものオートロードする関数が定義されている。 もちろん、「あまり」使わないような関数を頻繁に使う場合もあろう。 その場合には、`.emacs'ファイルでload式を使って関数のファイルを ロードするようにする。

Emacs第19.23版用の筆者の`.emacs'ファイルでは、 オートロードされる関数の内、17個のライブラリをロードしている (実際には、ダンプ版Emacsを作るときにこれらのファイルを 含めておくべきだが、忘れていた。 ダンプについて詳しくは、ファイル`INSTALL'や See 節 `Building Emacs' in

GNU Emacs Lispリファレンスマニュアル
)。

読者が、`.emacs'ファイルにオートロードの式を含めたい場合もあろう。 autoloadは組み込み関数であり、最大で5つの引数を取るが、 最後の3つは省略できる。 第1引数は、オートロードする関数の名前である。 第2引数は、ロードすべきファイルの名前である。 第3引数は、関数の説明文であり、 第4引数は、関数を対話的に呼ぶかどうかを指定する。 第5引数は、オブジェクトの型であり、 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に指定したディレクトリにある必要がある。 説明文の内容は、このモードはハイパーテキストマークアップ言語で 書かれた文章の編集を助けるである。 M-x html-helper-modeとタイプすると対話的にこのモードになる (関数がロードされていないと説明文も利用できないので、 関数の説明文をオートロードの式に複製する必要がある)。

詳しくは、See 節 `Autoload' in

GNU Emacs Lispリファレンスマニュアル



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.10 簡単な拡張:line-to-top-of-window

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Simple%20Extension"
"intro/簡単な拡張: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第18版の`.emacs'ファイルのほとんどは、 第19版でも使えるが、多少異なるものもある (もちろん、これらはEmacs第19版の新機能でもある)。

Emacs第19版では、`[f6]'のようにファンクションキーを書ける。 第18版では、ファンクションキーを押したときに送られるキー列を 指定する必要がある。 たとえば、Zenith 29キーボードでは、6番目のファンクションキーを押すと ESC Pが送られる。 Ann Arbor Ambassadorキーボードでは、ESC O Fが送られる。 これらのキー列は、それぞれ、`\eP'、`\eOF'と書く。

筆者の第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 lview-lossage)とタイプする。 このコマンドは、最新の100個のキー列を表示する。)

キーバインドを指定したら、端末の種類に応じたキーバインドの式を評価する。 しかし、そのまえに、重複していると`.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.

(setq term-file-prefix nil)

端末の種類に応じた選択はつぎのように行う。

 
(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第19版では、(マウスボタンイベントや非ASCII文字と同様に) ファンクションキーは、引用符を付けずに鈎括弧に囲んで書く。 line-to-top-of-windowをファンクションキーF6にバインドするには、 つぎのようにする。

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

こちらのほうが簡単である!

より詳しくは、節 `Rebinding Keys in Your Init File' in

GNU Emacsマニュアル
を参照。

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
  ...



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.11 キーマップ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Keymaps"
"intro/キーマップ"へのコメント(無し)

Emacsでは、どのキーがどのコマンドを呼ぶかを記録するために キーマップ(keymaps)を使っている。 Cモード、Textモードなどの特定のモードには、それぞれに独自のキーマップがあり、 モード固有のキーマップは、すべてのバッファで共有されるグローバルキーマップを 上書きする。

関数global-set-keyは、グローバルキーマップをバインドする。 たとえば、つぎの式は、 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-@groupC-c C-c gにバインドする式がある。

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

関数texinfo-insert-@group自体は、Texinfoモードを少々拡張するもので、 Texinfoファイルに`@group'を挿入する。 筆者はこのコマンドをいつも使っており、 6文字の@ g r o u pとタイプするかわりに 3文字のC-c C-c gとタイプするほうを好んで使っている (`@group'と対応する`@end group'は、 これらが囲むテキストを1ページに収めるようにするコマンドである。 本書の数行に渡る例題は、`@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"))

(もちろん、タイプ量を節約するには、 単語を挿入する関数を書くかわりにAbbrebモードを使うこともできる。 筆者は、Texinfoモードの他のキーバインドとも整合性のよいキー列を好む。)

`loaddefs.el'には、 `c-mode.el'や`lisp-mode.el'のような、さまざまなモードのライブラリに 加えて、数多くのdefine-key式がある。

キーマップについて詳しくは、 節 `Keymaps' in

GNU Emacs Lispリファレンスマニュアル
や See 節 `Customizing Key Bindings' in
GNU Emacsマニュアル



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.12 X11の色指定

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=X11%20Colors"
"intro/X11の色指定"へのコメント(無し)

Emacs第19版をMITのXウィンドウシステムのもとで使用している場合には、 色を指定できる (これまでの例は、Emacs第18版でも第19版でも動作するはずであるが、 この例は第19版でのみ動作する)。

デフォルトの色は好みに合わないので、自前の指定をする。

筆者の指定は、Xのさまざまな初期化ファイルに書いてある。 `.emacs'ファイルには、何をしたかを覚えておくためのメモを書いておく。

 
;; I use TWM for window manager;
;; my ~/.xsession file specifies:
;    xsetroot -solid navyblue -fg white

実際には、XウィンドウのルートはEmacsの一部ではないが、メモ書きをしておく。

 
;; My ~/.Xresources file specifies:
;     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'ファイルの値を設定する式はつぎのとおりである。

 
;;; Set highlighting colors for isearch and drag
(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")))

青のさまざまな濃淡は目にやさしく、画面のチラツキを目立たせない。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.13 第19版のその他

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=V19%20Miscellaneous"
"intro/第19版のその他"へのコメント(無し)

Emacs第19版のその他の雑多な設定の一部を説明しておく。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

16.14 モード行の変更

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Mode%20Line"
"intro/モード行の変更"へのコメント(無し)

最後に、筆者のお気に入りの機能を説明する。 モード行の変更である。

筆者はネットワークを介して作業することがあるので、 モード行の左端に表示される`Emacs: 'をシステム名で置き換えている。 さもないと、どのマシンを使っているのか忘れることがある。 さらに、どのディレクトリにいるのかを忘れないようにデフォルトのディレクトリを 表示し、ポイントの行位置を`Line'に続けて表示する。 筆者の`.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)

Infoなどのさまざまなモードが書き換えられるように デフォルトのモード行を設定する。 行の構成要素は、自ずとわかるであろう。 mode-line-modifiedはバッファが編集されたかどうかを表す変数であり、 mode-nameはモードの名称を表すなどである。

`"%14b"'は、 (関数buffer-nameを使って)カレントバッファ名を表示する。 「14」は、表示する最大の文字数を指定する。 名前の文字数が少なければ、この文字数になるまで空白文字を追加する。 `%['と`%]'は、各再帰編集レベルに応じて鈎括弧の対を表示する。 `%n'は、ナロイングしている場合に「Narrow」を表示する。 `%P'は、ウィンドウの最下行より上に表示されているバッファの割合や 「Top」、「Bottom」、「All」を表示する (小文字の`p'は、ウィンドウの先頭行より上に表示されているバッファの割合 を表示する)。 `%-'は、モード行が適当な長さになるように`-'を詰め込む。

Emacs第19.29版から以降では、frame-title-formatを使って Emacsのフレームに表題を付けられる。 この変数はmode-line-formatと同じ構造である。

モード行の書式は、節 `Mode Line Format' in

GNU Emacs Lispリファレンスマニュアル
に記載されている。

「Emacsを好きになるにはEmacsが好きである必要はない」を覚えておいてほしい。 読者のEmacsは、デフォルトのEmacsとは、 色表示が異なり、コマンドも異なり、キーも異なるであろう。

一方、「箱から取り出した」ままのカスタマイズしていないEmacsを起動するには つぎのようにタイプする。

 
emacs -q

初期化ファイル`~/.emacs'をロードせずにEmacsを起動する。 デフォルトのままのEmacsである。 何も変わっていない。


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]