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

訳者まえがき

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=PrePreface"
"intro/訳者まえがき"へのコメント(無し)

本書は、「Programming in Emacs Lisp: An Introduction」 (texinfoファイル`emacs-lisp-intro.texi'、1.05版、更新日1997年10月21日) の翻訳である。 日本語訳ファイルは

 
http://www.ascii.co.jp/pub/GNU/emacs-lisp-intro-jp.texi
に置いてある。 日本語のTeXが利用できる環境ならば、texi2dviなどのコマンドで 自前でdviファイルを作成して印刷できる。 また、Muleを用いてバッファに読み込んでから M-x texinfo-format-bufferを実行すれば、 日本語版のinfoファイルを作成することもできる。 ただし、このようにして作ったinfoファイルでは、 (メニューなどの)info特有の部分は未翻訳であることをあらかじめご了承願いたい。

Mule(Multilingual Enhancement to GNU Emacs)とそのLispは、 多国語を扱うために拡張したため、 GNU EmacsやEmacs Lispと互換ではない部分がある。 詳しくはMuleのディストリビューションに含まれる`mule-jp.texi'や

マルチリンガル環境の実現
(1) (特に第3章「Muleによるマルチリンガル環境の実現」)を参照してほしい。 なお、本書の例題は、英数字を使用する限りはそのまま動作する。

GNU Emacsが扱う(7ビットの)ASCIIコードの文字は、 コンピュータ内部では1文字を1バイトで表現し、 これらの文字は画面上の表示でも1文字あたり1コラムを占める。 したがって、文字数、内部表現のバイト数、表示コラム数のどれを とっても同じ値である。 また、テキストをファイルに収めたときの文字コードと GNU Emacsのバッファ内での文字コードはまったく同じである。

ところが、多国語を扱うMuleでは、こうはならない。 各国ごとにその国の文字を1バイトあるいは2バイトで表す規格がある。 たとえば、日本には文字コードの規格としてJIS X 0208があり 2バイトで1文字を表す。 また、ローマ字とカタカナの規格としてJIS X 0201があり 1バイトで1文字を表す。

1つのバッファ内に複数の国の文字コードが混在してもよいように、 Muleでは1バイトないしは2バイトの文字コードのまえに識別用に 1バイト(ないしは2バイト)を付加してバッファ内に保持する。 この識別用のバイトをリーディングキャラクタ(leading character)と呼ぶ。 ただし、7ビットのASCIIコードの文字は、GNU Emacsと同じで、 リーディングキャラクタは付加しない。

たとえば、日本語の「あ」は、文字数は1であるが、 内部表現には3バイト必要であり、表示には2コラム必要である。 半角の「ア」は、文字数は1であるが、内部表現には2バイト必要であり、 表示には1コラム必要である。 ASCII文字の「a」は、文字数も内部表現のバイト数も表示コラム数も1である。

このため、Muleでは、関数length (See 節 7.2.1 リストの長さ:length)は、 文字列の「文字数」ではなく、 内部表現の「バイト数」を返す。 バッファ内のポイントやマーク (See 節 2.4 バッファサイズとポイントの位置) の位置も、「文字数」ではなく内部表現の「バイト数」が単位である。

一方、関数forward-charは、その名前から予想されるように、 文字単位でポイントを移動する。 文字列の「文字数」を調べるには関数chars-in-stringを使い、 「表示コラム数」を調べるには関数string-widthを使う。

 
(length          "abcあいう")     => 12
(chars-in-string "abcあいう")     =>  6
(string-width    "abcあいう")     =>  9

`.emacs'(See 節 16. 個人用ファイル`.emacs')で Muleの版を区別するには、関数mule-versionが返す文字列を使う。 また、日本語入力に「Wnn」、「sj3」、「かんな」のどれが使えるかを判別し、 それぞれに固有の設定を行うには、 関数featurepを使ってつぎのようにする。

 
(if (and (not (featurep 'egg)) (featurep 'canna))
    (progn 「かんな」に固有の設定 ... ))

(if (and (featurep 'egg) (featurep 'wnn-egg))
    (progn 「WNN」に固有の設定 ... ))

(if (and (featurep 'egg) (featurep 'sj3-egg))
    (progn 「sj3」に固有の設定 ... ))

MuleがX Window Systemのクライアントとして動作している場合、 変数window-systemには値xが、 そうでない場合にはnilが束縛されるので、つぎのように判別できる。

 
(if (eq window-system 'x)
    (progn 「X Window System」に固有の設定 ...)
  画面端末の場合の設定 ...)


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