Mule, Multilingual enhancement to GNU Emacs
*******************************************

Mule は GNU Emacs を複数の言語に対応できるように強化したエディタです。 Mule は GNU Emacs のすべての機能に加え、アジア、ヨーロッパ系などのさまざまな文字セットを画面に表示したり、キーボードからの入力を受け付けたり、編集したりする機能を提供します。

この Info ファイルでは、Mule の使い方や多国語対応の新機能などについて説明します。

Mule とは何か
*********

Mule は GNU Emacs に基づく多国語対応エディタです。Mule は GNU Emacs へのパッチの形で配布されています。最新版は Mule Version 1.0 (1993.8.2) で、 GNU Emacs 18.59 をベースにしています。

また、最新の Mule は MS-DOS 上でも動作するよう、Demacs 用のパッチも取り込んであります。このパッチの最新バージョンは 1.3.1 Alpha です。

Mule の日本語チュートリアルはコマンド C-h T (help-with-tutorial-for-mule) で起動できます。Mule のバージョンは mule-version で、最近の変更点は C-h N(view-mule-news)で知ることができます。

コマンド:
 -- Command: help-with-tutorial-for-mule
     Mule の日本語版チュートリアルを起動する。

 -- Command: view-mule-news
     Mule の最新の変更点を表示する。

 -- Command: mule-version
     Mule のバージョンを表示する。

Mule の特徴
========

Mule には以下のような特徴があります。

  * Mule は ASCII 文字セット(7ビット)や ISO Latin-1 の文字セット(8ビット)ばかりでなく、日本語、中国語、韓国語などの文字セット(16ビット)やタイ語も扱うことができます。さらに Mule のテキストバッファはこれらの言語の文字を一つのバッファに混在して保持することができます。

  * いろいろな文字を入力するために、各種の入力方法を Mule 自身が提供しています。また、端末エミュレータのもとで動かす場合は、エミュレータが提供する入力方法も利用できます。

  * ファイル入出力、スクリーン表示、キーボード入力、プロセス間通信のそれぞれについて独立にコード系を設定できます。

  * 多国語モードでない場合には、オリジナルの GNU Emacs とほぼ同様に使えます。

各国語への対応について
===========

日本語
---

Mule では、日本語用の文字セットとしては JIS X0208-1976,1983 (新旧 2バイト漢字)、JIS X0212-1990(補助漢字)、そして JIS X0201-1976 ( 1バイトの JIS ローマ字／片仮名) を扱えます。またこれらをエンコードするコード系としては、いわゆる JIS (JUNET で使われているコード)、MS 漢字コード(通称シフト JIS)、日本語 EUC をサポートしています。

日本語入力システムとしては、以下のものが用意されています。

  * たまご(EGG)「たかな」バージョン

  * sj3-egg

  * かんな(Canna)

いずれもネットワーク仮名漢字変換サーバを利用しローマ字漢字変換方式の日本語入力を提供しています。EGG と Canna については Texinfo マニュアルが用意されていますので、詳しくはそちらを参照して下さい。

その他、仮名漢字変換サーバを必要としない日本語入力システムとしては以下のものが使えます。

  * quail-system による TCODE 入力(doc/QUAIL参照)

  * SKK -- Mule とともに contributed ソフトとして配布。

中国語
---

中国語文字として、Mule は GB2312-1980 と Big5 の二つの文字セットをサポートしています。

中国語入力システムとして、以下のものが用意されています。

  * たまご(EGG)「たかな」バージョン -- PinYin 入力を cserver で中国語 (GB) に変換。

  * quail-system -- cxterm/dict/tit にあるすべての入力変換テーブルをサポート(doc/QUAIL参照)。

quail-system 使用の場合、

  * GB 文字の入力には、quail/py, quail/ccdospy, quail/ctcps3, quail/punct, quail/qj, quail/sw, quail/tonepy

  * Big5 文字の入力には、quail/py-b5, quail/etzy, quail/punct-b5, quail/qj-bt, quail/zozy

が使用できます。

ニュースグループ alt.chinese.text を GNUS (Emacslisp で書かれたニュースリーダ)で読む時は、hz2gb.el(contrib/lisp.tar.Z の中にある)を使うととても便利です。GNUS を起動する前に hz2gb.el をロードすることにより、alt.chinese.text で使われている Hz encoding を自動的にデコードしたり、エンコードしたりします。

韓国語
---

韓国語文字として、Mule は KS C5601-1987 文字セットをサポートしています。

韓国語文字の入力用に、its-hangul.el が提供されています。これを「たまご」システムのもとで使用してください。また、quail/hangul.el を利用することもできます。

ヨーロッパ系言語
--------

Mule では Latin-1 (ISO8859-1)から Latin-5 (ISO8859-9) までの文字セットや、キリル文字、ギリシャ文字もサポートしています。通常の ASCII キーボードからこれらの文字を入力するにはやはり quail-system を使います。

ISO8859 文字の入力には quail/latin.el(初心者用)あるいは quail/ltn.el(キースロトークを少なくした高速入力用) が使えます。この中にはフランス語、ドイツ語、スウェーデン語、その他用のパッケージが入っています。

また、ギリシャ語入力用には quail/greek.el、ロシア語入力用には quail/cyrillic.el が使えます。

タイ語
---

Mule では動的文字合成(dynamic character composition)の機能によって、TIS620 文字セットをベースにしたタイ語をサポートしています。タイ語の入力にはやはり quail-system を使います。このシステムの使い方は doc/QUAIL を参照して下さい。

また、TIS620 のフリーなフォント(12x29 ドット)が fonts/ETL.tar.Z の中に含まれています。このフォントを 12x24 の ASCII フォントと組み合わせて使うためには、コマンド x-set-linespaceあるいは起動時オプションの -lsp で行間を増加させる必要があります。引数として 5+ を指定して下さい。

Mule のドキュメント
============

Mule に関連するドキュメントは、次のものが $MULE/etc ディレクトリにあります。

FAQ.Mule, FAQ.Mule.jp
     Mule に関してよく出される質問とその回答集。英語版(FAQ.Mule)と日本語版(FAQ.Mule.jp)があります。

MULE.tut
     日本語 Mule チュートリアル。 C-h T (help-with-tutorial-for-mule) で読むことができます。英語版(GNU Emacs用)は C-h tで起動されます。

以下のマニュアルは $MULE/man ディレクトリにあります。

mule-jp.texinfo
     この texinfo のソースファイル。

egg-jp.texinfo
     「たまご」システム用 texinfo のソースファイル。

canna-jp.texinfo
     「かんな」システム用 texinfo のソースファイル。

以下のドキュメントは $MULE/doc ディレクトリにあります。

EGG
     「たまご」の使い方の英語による簡単な説明。

ISO2022
     ISO2022 についての英語による簡単な説明。

QUAIL
     quail-system についての英語による簡単な説明。

TERMINOLOGY
     様々な用語についての英語による簡単な説明。

X11
     X11 上で Mule を使う際の英語による簡単な説明。

attribute.text
     文字属性機能についての説明。

character.text
     多国語文字の扱いについての説明。

coding.text
     コード系についての説明。

picture.text
     ピクチャーモードの拡張についての説明。

regexp.text
     正規表現コンパイラについての説明。

syntax.text
     文字のシンタックスとカテゴリについて説明。

また、新しく付け加えられた機能は $MULE/NEWFEATURE に記述されています。

バグレポート
======

Mule のバグレポートあるいは修正の提案などは、以下に示すアドレスのメーリングリストに送ってください。形式は Emacs のものと同様で結構です。

mule@etl.go.jp
     通常の使用言語は英語

mule-jp@etl.go.jp
     通常の使用言語は日本語

これらのメーリングリストには、必要に応じて Mule がサポートしている *junet* というコード系を用いた多国語テキストを流すことが出来ます。

ただし、これらのメーリングリストにバグを連絡するする前に、そのバグが Mule 固有のものなのか、GNU Emacs のバグなのかを確認するようにしてください。ここにあげたメーリングリストは Mule 固有の問題のみを扱うメーリングリストです。

Mule の起動
********

Mule は、通常の端末で使う方法、X Window System の上で使う方法、Sun のコンソール画面で使う方法の 3通りの使い方があります。MS-DOS 上で使う場合については $MULE/INSTALL.dos を参照して下さい。

通常の端末で使う方法
     端末画面の中で Mule を走らせる方法です。その端末用の termcap または terminfo が適切に設定されている必要があります。多国語文字を表示できるかどうかは端末の機能に依存します。

X Window System で使う方法
     X の上で Mule 専用のウィンドウを開いて使う方法です。X に用意されているフォントを使って多国語文字を表示することができます。

Sun のコンソール画面で使う方法
     Sun のワークステーションにおいては、Mule は pixrect ライブラリを用いてフレームバッファを操作し、コンソールに Mule 独自のウィンドウを表示することができます。この機能を使った場合、ウィンドウシステムを使わなくても ASCII、 Latin-1、日本語、韓国語、中国語などを表示したり編集したりできます。

X を使うことを前提として設定された Mule は、X の上で起動すると自動的に Mule 専用のウィンドウを開きます。X の端末エミュレータの中で Mule を走らせたい場合は、明示的に -nw オプションを使用する必要があります。

Mule のオプション
===========

GNU Emacs のオプションに加え、Mule では以下の X 関係のオプションスイッチが使用できます。

-fs SIZE
     Mule のウィンドウで使うフォントのサイズを SIZE に設定する。

-lsp LINESPACE
     上(u)と下(l)の行間のドットサイズを U+L という形式で設定する。 U, L はどちらか、あるいは両方が省略できる。U と L の初期値は 1。

-fnltn1 FONT
     Latin-1 フォントとして FONT を使用する。

-fnltn2 FONT
     Latin-2 フォントとして FONT を使用する。

-fnltn3 FONT
     Latin-3 フォントとして FONT を使用する。

-fnltn4 FONT
     Latin-4 フォントとして FONT を使用する。

-fngrk FONT
     ギリシャ文字フォントとして FONT を使用する。

-fnarb FONT
     アラビア文字フォントとして FONT を使用する。

-fnhbw FONT
     ヘブライ文字フォントとして FONT を使用する。

-fnkana FONT
     日本語カタカナ文字フォントとして FONT を使用する。

-fnroman FONT
     日本語ローマン文字フォントとして FONT を使用する。

-fncrl FONT
     キリル文字フォントとして FONT を使用する。

-fnltn5 FONT
     Latin-5 フォントとして FONT を使用する。

-fnjpold FONT
     日本語漢字(旧 JIS)フォントとして FONT を使用する。

-fncn FONT
     中国 GB フォントとして FONT を使用する。

-fnjp FONT
     日本語漢字フォントとして FONT を使用する。

-fnkr FONT
     韓国語ハングル文字フォントとして FONT を使用する。

-fnjp2 FONT
     日本語補助漢字フォントとして FONT を使用する。

-fnbig5 FONT
     中国語 Big5 フォントとして FONT を使用する。

さらに Sun のマシンでは、以下の起動時オプションも使用できます。これにより Sun のコンソール画面で ASCII 文字 ばかりでなく Latin-1 や日本語文字などを表示したり編集したりできます。

-sun
     Sun のコンソール画面で Mule 独自のウィンドウを開く。このオプションは、コマンドラインオプションの一番最初に指定されなければならない。

-fb FRAME-BUFFER
     どのフレームバッファを使うかを指定する。このオプションが指定されない場合は、デフォルトとして /dev/fb が使用される。このオプションは、コマンドラインオプションの二番目に指定されなければならない。

-fp PATHLIST
     BDF ファイルを探す際のディレクトリ名のリストを指定する。

-cs CHARSETS
     文字セットとそれに対応する BDF ファイル名とのテーブルファイルを指定する。このオプション指定がされない場合は、デフォルトとして exec-path 指定されるディレクトリの下にある CHARSETS が使用される。

.emacs のサンプル
============

Mule は起動時に各自のホームディレクトリにある .emacs という初期化ファイル(Init file)を参照します。このファイルに Lisp プログラムを記述しておくことにより、Mule を独自にカスタマイズができるようになります。

Mule は Nemacs とは互換性がないため、Nemacs 用の .emacs はそのままではエラーを起こす可能性があります。以下に、Mule と Nemacs(そして GNU Emacs も)で共通して使用できる .emacs の簡単な例を示します。

ただし、byte-compile する場合は注意しなければなりません。Mule と Nemacs では漢字の内部表現が違いますので、コメント以外に漢字文字列を含む emacs lisp ファイルを byte-compile すると Mule と Nemacs の間で共有することはできなくなります。

     ; sample .emacs

     ; Lisp ライブラリの load path に "~/elisp" を追加します。
     (setq load-path (cons (expand-file-name "~/elisp")
                             load-path))

     ; ディスプレイに表示するときの文字コードを日本語 EUC にします。
     (cond ((boundp 'NEMACS) (setq kanji-display-code 3))
           ((boundp 'MULE)
            (set-display-coding-system *euc-japan*)))

     ; 新バッファ作成時のファイル文字コードを *euc-japan* にします。
     (if (boundp 'MULE)
         (set-default-file-coding-system *euc-japan*))

     ; MH のプログラムとやりとりするときの文字コードを JIS に指定します。
     (if (boundp 'MULE)
         (progn
           (define-program-coding-system nil ".*scan.*" (cons *junet* *junet*))
           (define-program-coding-system nil ".*inc.*" (cons *junet*
     *junet*))))
     (if (boundp 'NEMACS)
         (progn
           (define-program-kanji-code nil ".*scan.*" 2)
           (define-program-kanji-code nil ".*inc.*" 2)))

     ; Text モードにするとき、常に auto-fill-mode にします。
     (setq text-mode-hook
           '(lambda () (auto-fill-mode 1)))

     ; mail-mode にしたときに、ファイル文字コードを JIS にセットするようにし
     ; ます。
     (setq mail-mode-hook
           '(lambda ()
     	 (setq kanji-fileio-code 2)  ; for Nemacs
     	 (if (boundp 'MULE)
     	     (set-file-coding-system *junet*))))

     ; GNUS 用の設定を行います。
     ; 注:必ず各サイト用の設定に書き直してください。
     (setq gnus-nntp-server "newshost")
     (autoload 'gnus "gnus" "Read network news." t)
     (autoload 'gnus-post-news "gnuspost" "Post a new news." t)
     (setq gnus-your-domain "your.domain.address")
     (setq gnus-nntp-service "nntp")
     (setq gnus-use-generic-from t)

     ; BS (C-h) キーと DEL キーを入れかえます。
     (load-library "term/bobcat")

多国語文字の扱い
********

Mule は、多国語モードで日本語をはじめ中国語、韓国語などさまざまな言語の文字を扱うことができます。多国語モードにするには、コマンド C-x C-k t(toggle-mc-flag) で変数 mc-flag を t にします (通常は t になっています)。変数 mc-flag のデフォルト値は変数 default-mc-flag に保持され、コマンド C-x C-k T (toggle-default-mc-flag) で設定できます。

変数:
 -- Local Variable: mc-flag

     t
          多国語表示を行ない、カーソルも多国語文字単位で移動。

     nil
          多国語表示を行なわない。カーソル移動などは GNU Emacs と同じ。

     いずれの場合もファイル I/O、プロセス I/O におけるコード系変換が行われます。

 -- Global Variable: default-mc-flag
     mc-flag のデフォルト値。

コマンド:
 -- Command: toggle-mc-flag
     mc-flag の値を、t から nil、nil から t に切替える。

 -- Command: toggle-default-mc-flag
     default-mc-flag の値を、t から nil、nil から t に切替える。

文字セット(character-set)
====================

文字セット(正確には図形文字集合)とは、文字の集まりとそれぞれの文字をあらわすコードを定めたものです。文字セットには、1バイトで表現するものと、複数バイトで表現するものがあります。Mule では ASCII, Latin-1, JIS X0201 片仮名などの 1バイト文字と、漢字, 韓国語文字などの 2バイト文字の両方を扱うことができます。以下に、Mule であらかじめ定義されている文字セットの一覧を示します。

 1. コード長が 1バイトのもの

       * ASCII

       * ISO8859-1 Latin-1

       * ISO8859-2 Latin-2

       * ISO8859-3 Latin-3

       * ISO8859-4 Latin-4

       * ISO8859-7 Greek

       * ISO8859-6 Arabic

       * ISO8859-8 Hebrew

       * JIS X0201 Japanese Katakana

       * JIS X0201 Japanese Roman

       * ISO8859-5 Cyrillic

       * ISO8859-9 Latin-5

       * TIS 620-2533 Thai

 2. コード長が 2バイトのもの

       * JIS X0208 Japanese Old

       * GB2312-1980 Chinese

       * JIS X0208 Japanese

       * KS C5601-1987 Korean

       * JIS X0212 Japanese Supplement

       * Big5 Level 1

       * Big5 Level 2

       * PinYin-ZhuYin

これらのうち，Big5 Level 1，Big5 Level 2，PinYin-ZhuYinの３つは，プライベート文字セットと呼ばれる，ISOに登録されていないものです．Mule では，さらに別のプライベート文字セットを定義して使うこともできます。

コード系(coding-system)
===================

現在、ひとつの言語を表現するのにも複数のコード系が共存して使われています。例えば日本語の漢字コードは、よく使われているものだけでも MS 漢字コード (通称 シフトJIS)、日本語 EUC、7bit JIS コードの 3種類もありますし、中国語や韓国語の場合も同様に複数のコード系が存在しています。

どのコード系が使われているかは OS によって異なります。また、アプリケーションによっても異なる場合があります。ネットワーク経由の通信プロセス(電子メールや電子ニュースなど)は 8ビットを通さないことが多いため、ネットワーク経由で他の計算機と通信を行うようなプログラムでは 7ビットで表現できるコード系が使われています。逆に OS の内部表現や文書ファイルには 8ビットの EUC などが多く使われています。

つまり、電子メールを受け取り、それをファイルに格納したり画面に表示したりするのに、各種コード系相互の変換操作が日常的に行なわれるわけです。このような現実に対応するため、Mule ではファイル入出力、スクリーン表示、キーボード入力、プロセス間通信のそれぞれについて独立に文字コード系を設定できるようになっています。

定義:

バッファ内部コード
     Mule がバッファの内部表現として用いるコード系。 (see ファイルの読み書き)

ファイル文字コード
     文書ファイルで用いられるコード系。 (see File I/O)

プロセス文字コード
     Mule と外部プロセスの通信に用いられるコード系。 (see Process)

ディスプレイ文字コード
     Mule が端末表示用に送信するコード系。 (see Display)

キーボード文字コード
     Mule がキーボード入力として予期しているコード系。 (see Key Input)

これらの処理にそれぞれどのコードが設定されているかは、C-x C-k C (list-coding-system) または C-x C-k c (list-coding-system-briefly) で知ることができます。

コマンド:
 -- Command: list-coding-system
     *Help*バッファを作り、そこに文字コード系に関する変数を表示する。

 -- Command: list-coding-system-briefly
     ミニバッファに文字コード系に関する変数を表示する。

Mule では、以下に示す多数のコード系を使用することができます。

  * Mule のバッファで使われている内部コード

  * MS 漢字コード/シフト JIS (日本語のみ)

  * ISO2022 に基づくもの(JIS [JUNET], EUC, CTEXT を含む)

  * Big5(中国語のみ)

以下、各コード系の概要について説明します。

内部コード
-----

Mule は、多国語文書の内部表現として独自の内部コードを使っています。この内部表現は、Nemacs のものとの互換性はありません。

バッファ中での文字の内部表現
..............

Mule では、登録されている文字セットごとに固有のリーディングキャラクタというものが割り付けられていて、ASCII 以外の文字はすべてリーディングキャラクタを頭につけたものを内部コードとしています。

文字セットは大きく分けると以下に示す種類に分類できます。

Type 1-1: ASCII 文字セット
     ASCII 文字 `C'(`C' は0x7f以下のコード)は、以前(GNU Emacs, Nemacs)の内部表現と同じで、そのままのコードでバッファに保持されます。

Type 1-2: ASCII 以外の 1バイト文字セット
     この文字セットに含まれる文字 `C1' は、リーディングキャラクタ `LC1' をつけて、`LC1 C1' のように表現されています。つまり ASCII 以外の 1バイト文字は、内部表現では 2バイトになります。

Type 1-3: プライベートに使用する 1バイト文字セット
     この文字セットの文字 `C1' は、プライベートリーディングキャラクタ `LCPRV1' と、拡張リーディングキャラクタ `LC12' をつけて `LCPRV1 LC12 C1' のようにバッファ内部では 3バイトで表現されます。

Type 2-3: 2バイト文字セット
     この文字セットは、リーディングキャラクタ `LC2' をつけて `LC2 C21 C22' のように表現されています。`C21' は 2バイト文字の最初のバイト、`C22' は 2番目のバイトです。つまり漢字などの 2バイト文字は、内部表現では 3バイトになります。

Type 2-4: プライベートに使用する 2バイト文字セット
     この文字セットは、プライベートリーディングキャラクタ `LCPRV2' と、拡張リーディングキャラクタ `LC22' をつけて `LCPRV2 LC22 C21 C22' のようにバッファ内部では 4バイトで表現されています。`C21' はプライベート 2バイト文字の最初のバイト、`C22' は 2番目のバイトです。

Type 3-4: 3バイト文字セット
     この文字セットは、リーディングキャラクタ `LC3' をつけて `LC3 C31 C32 C33' のようにバッファ内部では 4バイトで表現されています。`C31' は 3バイト文字の最初のバイト、`C32' は 2番目のバイト、`C33' は 3番めのバイトです。

Type N: 不定長の合成文字(composite character)セット
     この文字セットは、合成文字をあらわすリーディングキャラクタ `LCCMP' を先頭に、`LCCMP LCN1 C11 ... LCN2 C21 ... LCNn Cn1 ...' のように表現されています。文字 `LCN1 C11 ... LCN2 C21 ... LCNn Cn1 ...' は全て同じカラムに表示されます。

ASCII 文字の内部表現は 0XXXXXXX(ASCII 1文字は 7ビットで表現できる)、それ以外の `C1' `C21' `C22' ... の内部表現はそれぞれ 1XXXXXXX(0x80との OR をとり、最上位ビットを 1にしている)です。リーディングキャラクタの内部表現は種類によって異なっています。詳しくは $MULE/doc/character.text を参照して下さい。

Lisp 中での文字オブジェクトの表現
...................

Emacs Lisp では、文字オブジェクトを 255 以下の整数として取り扱っています。 Mule では、文字セットが増えているために、文字オブジェクトを以下のように拡張しています。

Type 1-1: `C' (`C' は 0x7f以下)
     0 ... 0x7f, キャラクタコードそのものと同じ。

Type 1-2: ((LC1 - 0x80) << 8) | C1
     0x01A0 ... 0x0FFF

Type 1-3: ((LC21 - 0x80) << 8) | C1
     0x20A0 ... 0x3FFF

Type 2-3: ((LC2 - 0x80) << 16) | (C21 << 8) | C22
     0x10A0A0 ... 0x19FFFF

Type 2-4: ((LC22 - 0x80) << 16) | (C21 << 8) | C22
     0x40A0A0 ... 0x5FFFFF

Type 3-4: ((C31 - 0x40 << 16) | (C32 << 8) | C33
     0x60A0A0 ... 0x7FFFFF

Type N:
     文字オブジェクトとしては扱えない

例えば、`?' の後に Type-2 の文字 0x81 0xf1 がある場合、その値は 498 ( = ((0x81 & 0x1f) << 8) | 0xf1) になります。

MS 漢字コード(シフトJIS)
----------------

MS 漢字コード(シフトJIS)は、MS-DOS で採用されているコード系です。このコード系は JIS X0208 文字セットの第一水準と第二水準の文字を一定の規則に従って変換し、JIS X0201 文字セットの未定義領域に漢字を割り当てています。MS 漢字コードではエスケープシーケンスなしで、X0201 の英数字および片仮名と、 X0208 の漢字とを混在させることができます。Mule では、X0201 片仮名も含めてこのコード系をサポートしています(Nemacs では X0201 片仮名は使用できませんでした)。

ISO2022
-------

Mule では ISO2022 が定める符号拡張法に基づくコード系もサポートしています。 ISO2022 とは、文字セット(ASCII, JIS X0208 など)を使って情報交換を行う場合の符号化の方法を定めているものです。以下に ISO2022 の簡単な説明を行ないますが、なるべくわかりやすくするために正確でない部分があります。完全な理解のためには ISO2022 のオリジナル文書を参照して下さい。

なお、ISO に登録されている文字セットは、すべて 7ビットで定義されており (漢字などは 2バイトのコードだが、7 + 7 ビットで定義されている)、文字セットの文字数に応じて 94 文字セット, 96 文字セット, 94x94 文字セット, 96x96 文字セットの 4つのカテゴリに分類されています。

  * 94 文字セット: ASCII(B)、JIS X0201 の左半分(J)と右半分(I)、など

  * 96 文字セット: Latin-1(A)、Latin-2(B)、Latin-3(C)、など

  * 94x94 文字セット: GB2312(A)、JIS X0208(B)、KSC5601(C)、など

  * 96x96 文字セット: 今のところ無し

各文字セットのあとの括弧内の文字は終端文字(final character)で、各文字セットを識別するものと考えることができます。

ISO2022 の符号拡張法は、一般的には以下のような 2段階方式になっています。

 1. 使用したい文字セットをエスケープシーケンスを用いて中間バッファの G0, G1, G2, G3 に指示(designate)する。

 2. 次にそのどれかを、制御機能を用いて 7単位のコード表に呼び出す(invoke)。コード表は 8ビット系には左と右(GLとGR)の二つ、7ビット系には一つ(GL)ある。

中間バッファは、普通は G0, G1 が使われ、7ビット系では SI(Shift In)で G0 を、SO(Shift Out)で G1 を呼び出します。8ビット系では、同時にふたつ文字セットを使えるため、GL に G0 を、GR に G1 を呼び出しておくのが普通です。たとえば、JIS 8ビットコードは G0 に JIS X0201 ローマ字を、G1 に X0201 片仮名を指示して、G0 を GL に、G1 を GR に呼び出して使用しているわけです。

指示は、以下のようなエスケープシーケンスで行ないます。

     ESC I F

I は中間文字(intermediate character)で、F は終端文字です。中間文字は 0x20 から 0x2F の 16文字ありますが、主な中間文字の意味は以下の通りです。

$ [0x24]
     複数バイト文字セット(94x94または96x96)を示す

( [0x28]
     終端文字が F である 94 文字セットを G0 に指示する

) [0x29]
     終端文字が F である 94 文字セットを G1 に指示する

* [0x2A]
     終端文字が F である 94 文字セットを G2 に指示する

+ [0x2B]
     終端文字が F である 94 文字セットを G3 に指示する

- [0x2D]
     終端文字が F である 96 文字セットを G1 に指示する

. [0x2E]
     終端文字が F である 96 文字セットを G2 に指示する

/ [0x2F]
     終端文字が F である 96 文字セットを G3 に指示する

また、ISO2022 では規定されていませんが、Mule では以下の中間文字も使用できます。

, [0x2C]
     終端文字が F である 96 文字セットを G0 に指示する

以下に指示のエスケープシーケンスの例を示します。

ESC `(' `B'
     ASCII を G0 に指示する

ESC `-' `A'
     Latin-1 を G1 に指示する

ESC `$' `(' `A' または ESC `$' `A'
     GB2312 を G0 に指示する

ESC `$' `(' `B' または ESC `$' `B'
     JISX0208 を G0 に指示する

ESC `$' `)' `C'
     KSC5601 を G1 に指示する

歴史的な事情から、旧JIS X0208(終端文字 `@')、GB2312(`A')、JIS X0208(`B') を G0 に指示する時は `(' を省略したエスケープシーケンスを使うこともできます。

G0 から G3 に指示された文字セットを使うためには、GL あるいは GR に呼び出さなければいけません。通常、8ビット系では GL に G0 が、GR に G1 が呼び出されており、7ビット系では GL に G0 が呼び出されていますが、G2 や G3 (7ビット系では G1 も)は明示的に呼び出しをかける必要があります。この呼び出しにはロッキングシフト(locking shift)とシングルシフト(single shift)の 2種類があります。

ロッキングシフト
     ロッキングシフトで呼び出された文字セットはずっと呼び出されたままになります。ある文字セットを既に呼び出してあれば、対応するロッキングシフトは無効になります。ロッキングシフトは以下の7つの機能があります。

     SI または LS0
          G0 を GL に呼び出す

     SO または LS1
          G1 を GL に呼び出す

     LS2
          G2 を GL に呼び出す

     LS3
          G3 を GL に呼び出す

     LS1R
          G1 を GR に呼び出す

     LS2R
          G2 を GR に呼び出す

     LS3R
          G3 を GR に呼び出す

     なお、G0 を GR に呼び出すことはできません。

シングルシフト
     シングルシフトは、直後の一文字のみを呼び出します。シングルシフトはロッキングシフトで設定された現在のシフト状態には影響を与えません。

     SS2
          G2 の一文字を呼び出す

     SS3
          G3 の一文字を呼び出す

本来ならば、使いたい文字セットを G0 から G3 のいずれかに指示して、GL または GR に呼び出すという 2段階を行なうのが正式なのですが、事前にアナウンサというもので宣言を行なうことにより文字セットを指示すると同時に呼び出すこともできます。なおアナウンサは当事者間の合意が有れば省略しても良い事になっています。また、使用する文字集合を限定して、デフォルトで G0 から G3 に指示してあることにしてエスケープシーケンスを省略したりすることもあります。

このように、ISO2022 に基づく多国語テキストのエンコーディングにはたくさんの方法があります。現在世界中には、日本の JUNET で使われているもの、いわゆる EUC(Extended Unix Code)、X のコンパウンドテキストなどたくさんのコード系がありますが、これらはすべて ISO2022 の変形です。

Mule では、以下の属性によって ISO2022 を特徴づけています。

 1. G0 から G3 への指示されている文字セットの初期値

 2. 日本語と中国語の省略形の指示を許すかどうか

 3. コントロールキャラクタの前に ASCII を G0 に指示しなければならないか

 4. 行末で ASCII を G0 に指示しなければならないか

 5. 7ビット系か 8ビット系か

 6. ロッキングシフトを使うかどうか

 7. ASCII または JIS X0201-1976 ローマ字のどちらを使うか(日本語の場合のみ)

 8. JIS X0208-1983 または JIS X0208-76 のどちらを使うか(日本語の場合のみ)

これらの属性を指定することによって、ISO2022 に基づいたコード系を作ることができます。

JUNET 方式のコード系
.............

JUNET で使われている、一般的に JIS 7ビット漢字コードと呼ばれているコード系は、7ビット系で、しかも G0 しか使わないものです。

JUNET 方式のコード系(*junet*)の属性

 1. ASCII -> G0

 2. Yes

 3. Yes

 4. Yes

 5. 7ビット系

 6. No

 7. ASCII を使う

 8. JIS X0208 を使う

アナウンサによって、G0 に指示した文字セットは即 GL に呼び出される事になっていますが、このアナウンサは省略されています。そして毎回 G0 に JIS ローマ字を指示したり、日本語漢字文字セットを指示したりしているわけです。 JUNET で使われているエスケープシーケンスは、正確には以下の意味になります。

ESC `(' `B'
     ASCII を G0 へ指示する

ESC `(' `J'
     JIS ローマ字を G0 へ指示する

ESC `$' `@'
     JIS漢字(1978)を G0 へ指示する

ESC `$' `B'
     JIS漢字(1983)を G0 へ指示する

JUNET で認知されているエスケープシーケンスは以上ですが、Mule では ISO2022 に基づいて他にも ESC `$' `A' で中国漢字を指示できますし、 ESC `(' `I' で JIS X0201 片仮名を指示したりできます。

JUNET 方式の利点は、G0 に文字セットを指示するだけで、何語でも使える事です。日本語を使うだけならば G0 に JIS ローマ字, G1 に漢字を指示しておけば、 SI と SO の1バイトづつで ROMAN と漢字の切り替えができますが、他の文字セットを使うときに困ってしまいます。

なお、Mule に附属するドキュメントやソースコードはすべて JUNET 方式のコード系になっています。

EUC(拡張 UNIX コード)
................

EUC は、使用する文字集合を限定し、中間バッファへ指示するエスケープシーケンスを省略したコード系です。EUC は 8ビット系で使用します。

Mule で使われている日本語のための EUC の属性は、以下のようになります。

日本語 EUC (*euc-japan*)の属性

 1. ASCII -> G0, JIS X0208 -> G1, JIS X0201 片仮名 -> G2, JIS X0212 -> G3

 2. Yes

 3. Yes

 4. Yes

 5. 8ビット系

 6. No

 7. ASCII を使う

 8. JIS X0208 を使う

EUC では、G0 が GL に、G1 が GR に呼び出されています。G2 および G3 に指示されている文字セットはシングルシフト(SS2 および SS3)で呼び出します。ロッキングシフトは使用しません。

以上の属性は日本語 EUC の場合ですが、あらかじめ G1 に中国漢字文字集合 (GB2312) を指示してあることにすれば中国語 EUC になりますし、韓国文字集合 (KS C5601)を指示してあることにすれば韓国語 EUC になります。ただ、EUC は、文字集合を指示するシーケンスが省略されているため、そのコードを見ただけでは統計的手法を使わない限り何語の EUC であるかを判断することはできません。よって、EUC では一つのファイルの中に中国語、韓国語、日本語などを混在させることはできないことになります。

コンパウンドテキスト
..........

X Window System で使われているコンパウンドテキストは、EUC と同様に文字集合を指示するエスケープシーケンスを省略しているコード系であると考えることができます。ただし GR に呼び出されている文字は 1バイトコードです。

コンパウンドテキスト(*ctext*)の属性

 1. ASCII -> G0, Latin-1 -> G1

 2. No

 3. No

 4. Yes

 5. 8ビット系

 6. No

 7. ASCII を使う

 8. JIS X0208 を使う

VT の国際モデル文字端末などでは同様のコード系になっていますので、ディスプレイ文字コードにコンパウンドテキストを指定すれば Latin-1 文字を画面に表示できます。

韓国のネットワークで使用されているコード系
.....................

韓国のネットワークで使用されているコード系は、JUNET 方式と同じ 7ビット環境ですが、G0 と G1 の両方を使い、G1 の呼び出しにはロッキングシフトを使います。G1 を呼び出す前に、最初に一回だけ、KSC5601 を G1 に指示するエスケープシーケンスが入ります。

韓国のネットワークで使用されているコード系(*korean-mail*)の属性

 1. ASCII -> G0, KSC5601 -> G1

 2. No

 3. No

 4. Yes

 5. 7ビット系

 6. Yes

 7. No

 8. No

Big5
----

Big5 と呼ばれているコード系には、複数の異なったコード系が存在しているようです。このうちよく知られているものに Big5-ETen と Big5-HKU-form2 があります。この二つは文字の種類が 13,000 以上もあるため、現在の Mule では一つの文字セットとしては扱えません(Mule では、単一の文字セットとして扱える文字種は、最高で約9,200文字までです)。そのため、Mule はこのコード系を以下に述べるような変則的な方法で処理しています。

 1. Mule はこれらを異なった文字セットとしては扱わず、同じ Big5 と呼ぶ文字セットとして扱う(注:Big5 は GB とは別の文字セットである)。

 2. Mule は Big5 を二つのサブ文字セットに分割している。

       * 0xa140 - 0xc67e (Level 1)

       * 0xc6a1 - 0xfefe (Level 2)

     そしてこれらに lc-big5-1 と lc-big5-2 の二つのリーディングキャラクタを割り当てている。

 3. 普通は、各リーディングキャラクタ(or 文字セット)はユニークな文字カテゴリを持つ。しかし lc-big5-1 と lc-big5-2 は、b という同じニモニックのカテゴリになっている。よって、正規表現 \cb は、すべての Big5 文字(Level 1 と Level 2)にマッチする。

 4. もし出力に ISO2022 タイプのコード系が指定された場合、Mule は Big5 を非公式な終端文字(final-character) '0' (Level 1用) と '1' (Level 2用) を使うように変換する。

 5. Big5 コードを表示するのに、ETen と HKU の両方のフォントを使用できる。 Mule は、文字 C6A1 がフォントの中に存在しているかどうかを検査することによってどちらのフォントが使われているかを判定する。もし存在しているならば、 HKU フォントであり、存在していなければ ETen フォントである。

Mule のバッファ
==========

Muleのバッファには、ASCII 文字、その他の 1バイト文字、漢字のような 2バイト文字が共存できます。ASCII の 1バイト文字のことを alphanumerics と呼びます。

新規バッファ生成時には、Mule はバッファの変数 mc-flag に変数 default-mc-flagの値を設定します。

変数 mc-flag が t の時、つまりコード変換を行ない多国語を表示する時には、モードラインに以下のようなコード系ニーモニックが現れます。

      [--]E:--**-Mule: Mule.text    (Fundamental) ---NN%--------------
          ^^

Mule は、ファイル入出力、入力、画面出力、プロセス間通信について、それぞれ独立にコード系を指定させることが出来ますが、通常はファイル用のコード系のニーモニックのみ表示しています。最初の一文字がコード系のニーモニック、次の `:' が現在英語以外の文字(日本語、中国語など)もちゃんと表示するということを示しています。

ニーモニックはそれぞれ

=
     無変換

+
     自動変換

=
     バッファ内部コード

S
     MS 漢字コード(シフト JIS )

s
     MS 漢字コード(シフト JIS )、行末は CRLF

J
     JUNET で使われているコード(およびそれに類するもの)

X
     X で使われているコンパウンドテキストのコード

E
     日本語 EUC コード

K
     韓国語 EUC コード

k
     韓国のネットワークで使用されているコード

C
     中国語 EUC コード

I
     96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系

i
     96 文字セットの呼び出しにロッキングシフトを用いる ISO2022 コード系

B
     BIG5 コード

b
     BIG5 コード、行末は CRLF

を表します。

また、変数 mc-verbose-code に nil 以外の値をセットすると、モードラインにファイル用、キー入力用、画面表示用の三つのコード系のニモニックを表示するようになります。

      [--]E-J:--**-Mule: Mule.text    (Fundamental) ---NN%------------
          ^^^

表示されるコードは左から順に

file-coding-system
     ファイル入出力に用いられるコード(see File I/O)。

keyboard-coding-system
     キーボード入力として予期しているコード(see Key Input)。

display-coding-system
     端末表示に用いているコード(see Display)。

です。

変数:
 -- Local Variable: mc-flag

     t
          多国語表示を行ない、カーソルも多国語文字単位で移動。

     nil
          多国語表示を行なわない。カーソル移動などは GNU Emacs と同じ。

     いずれの場合もファイル I/O、プロセス I/O におけるコード系変換が行われます。

 -- Global Variable: default-mc-flag
     mc-flag のデフォルト値。

 -- Global Variable: mc-verbose-code

     nil
          モードラインにファイル用のコード系のみを表示する。

     non-nil
          モードラインにファイル用、キー入力用、画面表示用の三つのコード系ニモニックを表示する。

コード系の指定
=======

Mule では、ファイル入出力、キー入力、画面表示、プロセス間通信について、それぞれ独立にコード系を指定することができます。実際にコード系として指定できる値(コード系オブジェクト)としては、あらかじめ以下のものが定義されています。

*noconv*
     無変換

*autoconv*
     自動変換

*internal*
     バッファ内部コード

*sjis*
     MS 漢字コード(シフト JIS コード)

*sjis-dos*
     MS 漢字コード(シフト JIS コード)、行末は CRLF

*junet*
     JUNET で使われているコード(およびそれに類するもの)

*oldjis*
     旧 JIS コード

*ctext*
     X で使われているコンパウンドテキストのコード

*euc-japan*
     日本語 EUC コード

*euc-korea*
     韓国語 EUC コード

*iso-2022-kr*

*korean-mail*
     韓国のネットワークで使われているコード

*euc-china*
     中国語 EUC コード

*iso-2022-ss2-8*
     96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(8ビット系)

*iso-2022-ss2-7*
     96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(7ビット系)

*iso-2022-lock*
     96 文字セットの呼び出しにロッキングシフトを用いる ISO2022 コード系

*big5-eten*
     BIG5-ETen コード

*big5-hku*
     BIG5-HKU コード

*big5-eten-dos*
     BIG5-ETen コード、行末は CRLF

*big5-hku-dos*
     BIG5-HKU コード、行末は CRLF

なお、出力時においては *noconv*, *autoconv*, *internal* は全部同じ意味になります。また、入力時には *noconv* と *internal* は同じ意味になります。

以上のコード系があらかじめ定義されていますが、必要ならば関数 make-coding-system を使って自分で新たにコード系を定義することもできます。詳しくは $MULE/doc/coding.text をみてください。

関数:
 -- Function: make-coding-system NAME TYPE MNEMONIC DOC &optional CRLF FLAGS
     シンボル NAME を TYPE, MNEMONIC, DOC, CRLF, FLAGS で示されるコード系として登録する。TYPE はエンコーディングあるいはデコーディングの情報を示す。もし TYPE が次のうちいずれかならば、

     nil: 無変換, t: 自動変換, 0: Internal, 1: Shift-JIS, 2: ISO2022, 3: Big5.

     システムは適切なコード変換機能を提供する。

     MNEMONIC
          このコード系のニモニックとしてモードラインに表示される文字

     DOC
          コード系の説明

     CRLF (option)
          non-nil の場合は、入出力時に CRLF <-> LF 変換を行なう

     FLAGS (option)
          コード系についてのより細かい情報

     TYPEが 2(ISO2022) ならば、FLAGS は以下の list でなければならない。

     LC-G0, LC-G1, LC-G2, LC-G3
          初期値として G? に指示されている文字セットのリーディングキャラクタ。 nil は G? に最初は何も指示されていないことを意味し、lc-invalid は G? には文字セットを指示できないことを意味する。(- loading-char) が指定されていると、出力時に指示が行なわれる。

     SHORT
          non-nil の場合、日本語と中国語の漢字を指示する時の省略形を許す

     ASCII-EOL
          non-nil の場合、出力時、行末毎に G0 に ASCII をに指示する

     ASCII-CNTL
          non-nil の場合、TAB および SPACE を出力する前に G0 に ASCII を指示する

     SEVEN
          non-nil の場合は 7ビット系を意味する

     LOCK-SHIFT
          non-nil の場合、シングルシフトやエスケープシーケンスによる指示の代わりにロッキングシフトを使用する

     USE-ROMAN
          non-nil の場合、JIS X0201-1976 ローマ字を ASCII として使用する

     USE-OLDJIS
          non-nil の場合、JIS X0208-1976 を JIS X0208-1983 として使用する

     TYPE が 3 ならば、FLAGS の t は Big5-ETen を意味し、 non-nil は Big5-HKU を意味する。

キーボード入力
-------

キーボードから ASCII 以外の文字を入力するには、どのコード系を使いたいかをあらかじめ Mule に教えてやる必要があります。これは C-x C-k i (コマンド set-keyboard-coding-system) によって行なえます。 C-x C-k i と入力すると、Mule はミニバッファで、

     Keybaord-coding-system:

と聞いてきますので、キーボード文字コードとして指定したいコード系を入力します。このとき、スペースキーや TAB キーによるコード系名の補完機能が使えます。また、.emacs などでキーボード文字コードを指定する場合は、

     (set-keyboard-coding-system *euc-japan*)

などのようにします。なお、キーボード文字コードに *euc-japan* や *sjis* などの 8ビット系のコードを指定するとメタキーが使用できなくなるので注意してください。また、Mule は keyboard-coding-system によっては、キーマッピングを変更する場合があります。

指定したコード系は keyboard-coding-system の値として保持され、 Mule は入力をそのコードだと思って受け取り、内部コードに変換します。

変数:
 -- Global Variable: keyboard-coding-system
     Muleがキーボード入力として予期しているコード系を保持する変数。指定できる値は以下のいずれか。

     *noconv*
          無変換

     *sjis*
          MS 漢字コード(シフト JIS コード)

     *sjis-dos*
          MS 漢字コード(シフト JIS コード)、行末は CRLF

     *junet*
          JUNET で使われているコード(およびそれに類するもの)

     *oldjis*
          旧 JIS コード

     *ctext*
          X で使われているコンパウンドテキストのコード

     *euc-japan*
          日本語 EUC コード

     *euc-korea*
          韓国語 EUC コード

     *iso-2022-kr*

     *korean-mail*
          韓国のネットワークで使われているコード

     *euc-china*
          中国語 EUC コード

     *iso-2022-ss2-8*
          96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(8ビット系)

     *iso-2022-ss2-7*
          96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(7ビット系)

     *iso-2022-lock*
          96 文字セットの呼び出しにロッキングシフトを用いる ISO2022 コード系

     デフォルト値は nil。

コマンド:
 -- Command: set-keyboard-coding-system CODING-SYSTEM
     変数 keyboard-coding-system を CODING-SYSTEM に設定する。

ディスプレイへの表示
----------

Mule を端末(あるいは端末エミュレータ)で使用している場合、Mule は文字を変数 display-coding-system の値で指定されたコードに変換してからディスプレイに送ります。変数 display-coding-system は C-x C-k d (set-display-coding-system) を呼ぶことで設定できます。C-x C-k d と入力すると、Mule はミニバッファで、

     Display-coding-system:

と聞いてきますので、指定したいコード系を入力します。このとき、スペースキーや TAB キーによるコード系名の補完機能が使えます。また、 .emacs などでディスプレイ文字コードを指定する場合は、

     (set-display-coding-system *euc-japan*)

などのようにします。

変数:
 -- Global Variable: display-coding-system
     Mule が端末表示用に送信するコード系を保持する変数。指定できる値は以下のいずれか。

     *noconv*
          無変換

     *autoconv*
          自動変換

     *internal*
          バッファ内部コード

     *sjis*
          MS 漢字コード(シフト JIS コード)

     *sjis-dos*
          MS 漢字コード(シフト JIS コード)、行末は CRLF

     *junet*
          JUNET で使われているコード(およびそれに類するもの)

     *oldjis*
          旧 JIS コード

     *ctext*
          X で使われているコンパウンドテキストのコード

     *euc-japan*
          日本語 EUC コード

     *euc-korea*
          韓国語 EUC コード

     *iso-2022-kr*

     *korean-mail*
          韓国のネットワークで使われているコード

     *euc-china*
          中国語 EUC コード

     *iso-2022-ss2-8*
          96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(8ビット系)

     *iso-2022-ss2-7*
          96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(7ビット系)

     *iso-2022-lock*
          96 文字セットの呼び出しにロッキングシフトを用いる ISO2022 コード系

     *big5-eten*
          BIG5-ETen コード

     *big5-hku*
          BIG5-HKU コード

     *big5-eten-dos*
          BIG5-ETen コード、行末は CRLF

     *big5-hku-dos*
          BIG5-HKU コード、行末は CRLF

     デフォルト値は *junet*。

コマンド:
 -- Command: set-display-coding-system CODING-SYSTEM
     変数 display-coding-systemを CODING-SYSTEM に設定する。

ファイルの読み書き
---------

Mule の各バッファは2つの変数 mc-flag と file-coding-system を持ちます。1つめの mc-flag はそのバッファが多国語文字を含むかどうかを示します。つまり mc-flag が nil ならば、 Mule は多国語文字があらわれないと思い、基本的に GNU Emacs と同じように振舞います。この場合には Mule を用いて 8ビットデータの編集ができます。

2つめの変数 file-coding-system は、Mule がファイルを書き出すときに使う多国語文字コード系を示します。この変数は関数 C-x C-k f (set-file-coding-system) によって設定できます。デフォルト値は default-file-coding-systemに保持され、C-x C-k F (set-default-file-coding-system) によって変更可能です。

例えば、C-x C-k f と入力すると、Mule はミニバッファで、

     File-coding-system:

と聞いてきますので、指定したいコード系を入力します。このとき、スペースキーや TAB キーによるコード系名の補完機能が使えます。

また、.emacs などでデフォルトのファイル文字コードを指定する場合は、

     (set-default-file-coding-system *euc-japan*)

などのようにします。変数 file-coding-system は、バッファローカルな変数なので、.emacs で値を指定しても意味はありません。

Muleは、ファイルに文書を書き出す前には文書を file-coding-system で指定されるコードに変換します。

変数:
 -- Local Variable: mc-flag

     t
          多国語表示を行ない、カーソルも多国語文字単位で移動。

     nil
          多国語表示を行なわない。カーソル移動などは GNU Emacs と同じ。

     いずれの場合もファイル I/O、プロセス I/O におけるコード系変換が行われます。

 -- Local Variable: file-coding-system
     ファイルを書き出すときに用いられるコード系を保持する変数。指定できる値は以下のいずれか。

     *noconv*
          無変換

     *autoconv*
          自動変換

     *internal*
          バッファ内部コード

     *sjis*
          MS 漢字コード(シフト JIS コード)

     *sjis-dos*
          MS 漢字コード(シフト JIS コード)、行末は CRLF

     *junet*
          JUNET で使われているコード(およびそれに類するもの)

     *oldjis*
          旧 JIS コード

     *ctext*
          X で使われているコンパウンドテキストのコード

     *euc-japan*
          日本語 EUC コード

     *euc-korea*
          韓国語 EUC コード

     *iso-2022-kr*

     *korean-mail*
          韓国のネットワークで使われているコード

     *euc-china*
          中国語 EUC コード

     *iso-2022-ss2-8*
          96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(8ビット系)

     *iso-2022-ss2-7*
          96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(7ビット系)

     *iso-2022-lock*
          96 文字セットの呼び出しにロッキングシフトを用いる ISO2022 コード系

     *big5-eten*
          BIG5-ETen コード

     *big5-hku*
          BIG5-HKU コード

     *big5-eten-dos*
          BIG5-ETen コード、行末は CRLF

     *big5-hku-dos*
          BIG5-HKU コード、行末は CRLF

 -- Global Variable: default-file-coding-system
     バッファの変数 file-coding-system のデフォルト値。

コマンド:
 -- Command: set-file-coding-system CODING-SYSTEM
     変数 file-coding-system の値を CODING-SYSTEM に設定する。

 -- Command: set-default-file-coding-system CODING-SYSTEM
     変数 default-file-coding-systemの値を CODING-SYSTEM に設定する。

ファイル入力
......

バッファの変数 mc-flag の値が t の時は、Mule はそのバッファに読み込まれるファイルは ASCII 以外のコードを含むことを仮定します。Mule はたくさんのコード系を扱えるので、入力されるファイルがそのうちのどのコードで書かれているかを調べなければなりません。入力ファイルが書かれているコードをそのファイルのファイル文字コードと呼びます。

Mule は三つの変数、file-coding-system-for-read, file-coding-system, default-file-coding-system にしたがってファイル文字コードを決定します。file-coding-system は C-x C-k f(コマンド set-file-coding-system) で、 default-file-coding-system は C-x C-k F(コマンド set-default-file-coding-system)によって設定できます。

ファイルを読み込む時の文字コードは file-coding-system-for-read で決められます。通常この変数は *autoconv* に設定されており、どのコードが使われているかは自動判別します。

ただし、ファイルを読み込むときにそのファイルが見つからなかったとき、すなわち新規ファイルの場合には、変数 default-file-coding-system に指定されたコード系がファイル文字コードになります。

まとめると、ファイル文字コードは以下のように設定されます。

既存ファイル読み込時
     file-coding-system-for-read に指定されているコード系。通常は *autoconv* になっているので、ファイルのコード系を自動判別してファイル文字コードを設定する。

空ファイル読み込時
     default-file-coding-system に指定されているコード系。

新バッファ作成時
     default-file-coding-system に指定されているコード系。

ローカルに file-coding-system が設定されていないバッファに既存ファイル挿入時
     file-coding-system-for-read に指定されているコード系。通常は *autoconv* になっているので、挿入されるファイルのコード系を自動判別してファイル文字コードを設定する。

また、find-file, find-alternate-file, find-file-other-window, find-file-read-only, insert-file のいずれかを行なってファイルを読み込む場合に、数引数を与えることによって対話的に file-coding-system-for-read を指定することができます。

例えば、C-u C-x C-f(find-file) と入力すると、Mule はミニバッファでファイル名を聞いた後、

     Coding-system:

のようにファイル文字コードを聞いてきますので、指定したいコード系を入力すれば、指定したコード系でファイルの読み込みを行います。

 -- Local Variable: file-coding-system
     ファイルを書き出すときに用いられるコード系を保持する変数。指定できる値は以下のいずれか。

     *noconv*
          無変換

     *autoconv*
          自動変換

     *internal*
          バッファ内部コード

     *sjis*
          MS 漢字コード(シフト JIS コード)

     *sjis-dos*
          MS 漢字コード(シフト JIS コード)、行末は CRLF

     *junet*
          JUNET で使われているコード(およびそれに類するもの)

     *oldjis*
          旧 JIS コード

     *ctext*
          X で使われているコンパウンドテキストのコード

     *euc-japan*
          日本語 EUC コード

     *euc-korea*
          韓国語 EUC コード

     *iso-2022-kr*

     *korean-mail*
          韓国のネットワークで使われているコード

     *euc-china*
          中国語 EUC コード

     *iso-2022-ss2-8*
          96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(8ビット系)

     *iso-2022-ss2-7*
          96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(7ビット系)

     *iso-2022-lock*
          96 文字セットの呼び出しにロッキングシフトを用いる ISO2022 コード系

     *big5-eten*
          BIG5-ETen コード

     *big5-hku*
          BIG5-HKU コード

     *big5-eten-dos*
          BIG5-ETen コード、行末は CRLF

     *big5-hku-dos*
          BIG5-HKU コード、行末は CRLF

 -- Global Variable: default-file-coding-system
     バッファの変数 file-coding-system のデフォルト値。

 -- Global Variable: file-coding-system-for-read
     ファイルを読み込むときに使われるコード系。指定できる値は、 file-coding-system に指定できるものと同じコード系名か 'query。'query を指定した場合には、ファイル読み込み時にファイル文字コードを対話的に指定できるようになる。

ファイル出力
......

バッファをファイルに書き出す時には、Mule はバッファ中の文書を変数 file-coding-system に示されたコードに変換した上で、書き出しを行ないます。

write-file, append-to-file のいずれかを行なってファイルを書き出す場合に、数引数を与えることによって対話的に書き出すファイル文字コードを指定することができます。

例えば、C-u C-x C-w(write-file) と入力すると、Mule はミニバッファで出力するファイル名を聞いた後、

     Coding-system:

のようにファイル文字コードを聞いてきますので、指定したいコード系を入力すると、そのコード系でファイルを書き出します。

ただし、C-x C-s(save-buffer) ではこの手は使えません (save-buffer で数引数を指定すると別の意味になります)。 save-buffer で文字コードを変えたい場合は、C-x C-k f(set-file-coding-system) でコード系を指定してから save-buffer して下さい。

変数:
 -- Local Variable: file-coding-system
     ファイル出力に用いられるコード系。指定できる値は以下のいずれか。

     *noconv*
          無変換

     *autoconv*
          自動変換

     *internal*
          バッファ内部コード

     *sjis*
          MS 漢字コード(シフト JIS コード)

     *sjis-dos*
          MS 漢字コード(シフト JIS コード)、行末は CRLF

     *junet*
          JUNET で使われているコード(およびそれに類するもの)

     *oldjis*
          旧 JIS コード

     *ctext*
          X で使われているコンパウンドテキストのコード

     *euc-japan*
          日本語 EUC コード

     *euc-korea*
          韓国語 EUC コード

     *iso-2022-kr*

     *korean-mail*
          韓国のネットワークで使われているコード

     *euc-china*
          中国語 EUC コード

     *iso-2022-ss2-8*
          96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(8ビット系)

     *iso-2022-ss2-7*
          96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(7ビット系)

     *iso-2022-lock*
          96 文字セットの呼び出しにロッキングシフトを用いる ISO2022 コード系

     *big5-eten*
          BIG5-ETen コード

     *big5-hku*
          BIG5-HKU コード

     *big5-eten-dos*
          BIG5-ETen コード、行末は CRLF

     *big5-hku-dos*
          BIG5-HKU コード、行末は CRLF

 -- Global Variable: default-file-coding-system
     バッファの変数 file-coding-system のデフォルト値。

外部プロセスとの通信
----------

Mule は外部プロセスやネットワーク上のサーバプロセスを起動し、それらと通信することができます。それぞれのプロセスは入力用/出力用の別々に独自のプロセス文字コードを持っています。Mule は指定された文字コードにテキストを変換して外部プロセスやサーバプロセスと通信し、外部プロセスやサーバプロセスから受け取ったテキストを Mule の内部表現に変換します。あるプロセスとの通信に使われるプロセス文字コードは、入力用と出力用のコード系の cons として変数 current-process-coding-system に格納されています。

関数 start-process や open-network-stream によって外部プロセスを起動したり、call-process や call-process-region によって実行したりする場合には、Mule はそれぞれの関数別に設定されたフックを呼び出してプロセス文字コードを設定します。また C-x C-k p(コマンド set-current-process-coding-system)によってプロセス文字コードを直接設定することもできます。さらに、フック find-process-coding-system の値を変更して Mule がプロセス文字コードを見つける方法をユーザ毎に変更したりすることもできます (see More Process)。

プロセス文字コードのデフォルト値は default-process-coding-system に保持され、関数 set-default-process-coding-system(C-x C-k P)で設定できます。

変数:
 -- Local Variable: current-process-coding-system
     プロセス文字コードの値。

 -- Global Variable: default-process-coding-system
     プロセス文字コードのデフォルト値。

コマンド:
 -- Function: find-process-coding-system BUFFER PROGRAM &optional SERVICEP &rest ARG
     引数で示されるプログラムまたはサービスが使用する入力と出力のコード系の cons を返す。

 -- Command: set-current-process-coding-system (INPUT OUTPUT)
     変数 current-process-coding-system の値、すなわち現在のバッファで走っているプロセスのプロセス文字コードを (INPUT OUTPUT) に設定する。

 -- Command: set-default-process-coding-system (INPUT OUTPUT)
     プロセス文字コードのデフォルト値 default-process-coding-system の値を設定する。

プロセスについてもっと
...........

(load-library "mule-util") を行なうと、Mule がプロセス文字コードを決める方法を変えることができるようになります(mule-util はデフォルトで load されています)。関数 define-program-coding-system は外部プロセスのプロセス文字コードを宣言し、関数 define-service-coding-system はネットワーク上のサーバのプロセス文字コードを宣言します。これらの宣言を行うと、関数 find-process-coding-system は宣言に沿った値を返すようになります。find-process-coding-system が適当な値を返さなかった場合には、Mule は代わりに変数 default-process-coding-system の値を用いてプロセス間通信を行ないます。

関数:
 -- Function: find-process-coding-system BUFFER PROGRAM &optional SERVICEP &rest ARG
     引数で示されるプログラムまたはサービスが使用する入力と出力のコード系の cons を返す。

 -- Function: define-program-coding-system BUFFER PROGRAM CODE
     BUFFER と PROGRAM は正規表現か nil。nil は任意のストリングとマッチする。find-process-coding-systemが BUFFER と PROGRAM の 2つの引数で呼ばれた場合に、プロセス文字コードを決定する CODE を定義する。

     たとえば、(define-program-coding-system nil ".*mail.*" (cons *junet* *junet*)) は、プログラム名が "mail" を含む場合には、そのプログラムとの通信は入力/出力ともに JUNET で使われている JIS コードを使うように find-process-coding-system を変更する。

 -- Function: define-service-coding-system SERVICE HOST CODE
     SERVICE と HOST は正規表現か nil。nil は任意のストリングとマッチする。find-process-coding-systemの引数 SERVICEP が nil 以外の値で呼ばれた場合に、プロセス文字コード決定する CODE を定義する。

     たとえば、(define-service-coding-system "wnn" nil (cons *noconv* *noconv*))は Mule がサービス "wnn" を使用する場合には入力/出力ともにコード変換を行なわないことを宣言する。

コード系の自動変換
=========

Mule では、入力時におけるコード系の自動変換機能を持っています。しかし、この機能はそれほど強力ではなく、以下に示す部類のコード系のみが識別できます。

ASCII
     ASCII コード

INTERNAL
     Mule のバッファ内部コード

SJIS
     MS 漢字コード(シフト JIS)

JUNET
     ISO2022 での、すべての文字が GL に呼び出されているもの

CTEXT
     ISO2022 での、GR に呼び出されている文字が 1バイトコードのもの

EUC
     ISO2022 での、GR に呼び出されている文字が 2バイトコードのもの

BIG5
     Big5 コード

また、行末が CRLF になっているかどうかも検出します。

もしコード系識別ルーチンが上の部類の一つを検出すると、以下の部類によるコード系を返します。

nil (for ASCII)

*internal-code-category*

*sjis-code-category*

*junet-code-category*

*ctext-code-category*

*euc-code-category*

*big5-code-category*

これらはデフォルトでは次のように定義されています。

     (setq *internal-code-category* '(*internal* . *sjis-dos*)
           *sjis-code-category* '(*sjis* . *sjis-dos*)
           *junet-code-category* '(*junet* . *sjis-dos*)
           *euc-code-category* '(*euc-japan* . *sjis-dos*)
           *ctext-code-category* '(*ctext* . *sjis-dos*)
           *big5-code-category* '(*big5-hku* . *big5-hku-dos*))

それぞれの car 部分は行末が LF のコード系で、cdr 部分は行末が CRLF のコード系です。

すなわち、Mule には日本語 EUC, 中国語 EUC, 韓国語 EUC の間の区別はつけられないので、(デフォルトでは)自動変換時にはすべて日本語 EUC であるとみなします。

もしコード系識別ルーチンが、一つのコード系に決定できなかった場合には、変数 code-priority に基づく最も優先順位の高いコード系を返します。また、テキストが ASCII 文字のみからなっているが行末が CRLF のものの場合は、以下のように定義されている *crlf-code-category* を返します。

     (setq *crlf-code-category* '(nil . *sjis-dos*))

変数:
 -- Global Variable: code-priority
     コード系を識別するときの優先順位リスト。

多国語文字についてのまとめ
=============

Mule では、以下のような文字セットを使用することができます。

 1. コード長が 1バイトのもの

       * ASCII

       * ISO8859-1 Latin-1

       * ISO8859-2 Latin-2

       * ISO8859-3 Latin-3

       * ISO8859-4 Latin-4

       * ISO8859-7 Greek

       * ISO8859-6 Arabic

       * ISO8859-8 Hebrew

       * JIS X0201 Japanese Katakana

       * JIS X0201 Japanese Roman

       * ISO8859-5 Cyrillic

       * ISO8859-9 Latin-5

 2. コード長が 2バイトのもの

       * JIS X0208 Japanese Old

       * GB2312-1980 Chinese

       * JIS X0208 Japanese

       * KS C5601-1987 Korean

       * JIS X0212 Japanese Supplement

       * Big5 Level 1

       * Big5 Level 2

 3. プライベート文字セット

       * Pin-Yin-ZhuYin

       * Thai TSCII

Mule は以下に示すような様々なコード系をサポートしています。

*noconv*
     無変換

*autoconv*
     自動変換

*internal*
     バッファ内部コード

*sjis*
     MS 漢字コード(シフト JIS コード)

*sjis-dos*
     MS 漢字コード(シフト JIS コード)、行末は CRLF

*junet*
     JUNET で使われているコード(およびそれに類するもの)

*oldjis*
     旧 JIS コード

*ctext*
     X で使われているコンパウンドテキストのコード

*euc-japan*
     日本語 EUC コード

*euc-korea*
     韓国語 EUC コード

*iso-2022-kr*

*korean-mail*
     韓国のネットワークで使われているコード

*euc-china*
     中国語 EUC コード

*iso-2022-ss2-8*
     96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(8ビット系)

*iso-2022-ss2-7*
     96 文字セットの呼び出しに SS2 を用いる ISO2022 コード系(7ビット系)

*iso-2022-lock*
     96 文字セットの呼び出しにロッキングシフトを用いる ISO2022 コード系

*big5-eten*
     BIG5-ETen コード

*big5-hku*
     BIG5-HKU コード

*big5-eten-dos*
     BIG5-ETen コード、行末は CRLF

*big5-hku-dos*
     BIG5-HKU コード、行末は CRLF

これらのコード系を、ファイル入出力、スクリーン表示、キーボード入力、プロセス間通信のそれぞれについて独立に設定できるようになっています。それぞれの処理に設定されているコード系のことを、以下のように呼びます。

ファイル文字コード
     文書ファイルで用いられるコード系。

ディスプレイ文字コード
     Mule が端末表示用に送信するコード系。

キーボード文字コード
     Mule がキーボード入力として予期しているコード系。

プロセス文字コード
     Mule と外部プロセスの通信に用いられるコード系。

コード系を設定したり、どのコード系が設定されているかを表示させるコマンドは、C-x C-k で始まるキーにバインドされています。

キーボード文字コードの設定
     C-x C-k i(set-keyboard-coding-system)

ディスプレイ文字コードの設定
     C-x C-k d(set-display-coding-system)

ファイル文字コードの設定
     C-x C-k f(set-file-coding-system)

プロセス文字コードの設定
     C-x C-k p(set-current-process-coding-system)

選択されているコード系を表示
     C-x C-k c(list-coding-system)またはC-x C-k C(list-coding-system-briefry)

ファイル文字コードのデフォルト値の設定
     C-x C-k F(set-default-file-coding-system)

プロセス文字コードのデフォルト値の設定
     C-x C-k P(set-default-process-coding-system)

Muleの機能
*******

Mule は多国語文書編集の様々な機能を提供します。

多国語文字コード関連の関数
=============

Mule は多国語文字コード系に関連して以下の関数を提供しています。これらによって、バッファ中のテキストの多国語文字コード系を変換することなどが可能です。

コマンド:
 -- Command: code-convert-region START END SOURCE TARGET
     SOURCE と TARGET は文字コード系の指定。START から END までのテキストの多国語文字コードを、SOURCE からTARGET に変換する。

関数:
 -- Function: code-convert-string STRING SOURCE TARGET
     STRING の多国語文字コードを SOURCE から TARGET に変換し、その結果を返す。

 -- Function: code-detect-region
     ポイントからマークまでのテキストの、多国語文字コード系を調べる。

多国語文書編集機能
=========

Mule は、日本語でいうところの文節単位のオペレーションや多国語テキストの探索、置換を行なうことができます。特に日本語文書においては語単位の操作より、文節単位の操作の方が一般的であるという判断に基づいて、Mule では日本語文字については疑似的な文節単位の操作を行なうように語の概念を拡張しています(ASCII文字のみのテキストについては、オリジナルの GNU Emacs が提供する語単位の操作と同等です。See Syntax)。日本語などには文節境界を示す記法はないので、Mule はすべての文字に対してカテゴリを定義し、これを用いて文節境界を推測し、疑似文節を切り出しています。

多国語文字のシンタックス
------------

GNU Emacs では各バイトに対して char-syntax が定義できます。Mule では GNU Emacs の char-syntax を拡張して、多国語文字コードに対するシンタックスが使えるようになっています。

さらに Mule では char-syntax を多国語文字用に拡張した char-category を定義しています。char-category は、多国語文字コード系に含まれる文字をいくつかのカテゴリに分類します。また、これに伴って、正規表現が拡張および変更されています。

関数:
 -- Function: char-syntax CHAR
     CHAR のシンタックスコードを返す。

 -- Function: char-category CHAR &optional TABLE
     TABLE における CHAR のカテゴリニモニック文字列を返す。TABLE は、デフォルトではカレントバッファのカテゴリテーブルが使われる。

char-syntax
...........

Mule では、関数 modify-syntax-entry によって、すべてのマルチバイト文字のシンタックスを定義することができます。

 -- Function: modify-syntax-entry CHAR S
     文字 CHAR を S で示されるシンタックスに設定する。CHAR は以下のいずれか。

      1. ASCII 文字

      2. マルチバイト文字

      3. マルチバイト文字のリーディングキャラクタ

      4. (リーディングキャラクタ << 8) | (マルチバイト文字の最初のバイト)

     S の最初の文字には次のものが指定できる。

     SPC
          whitespace syntax.

     w
          word constituent.

     _
          symbol constituent.

     .
          punctuation.

     (
          open parenthesis.

     )
          close parenthesis.

     "
          string quote.

     \
          character quote.

     $
          paired delimiter.

     '
          expression prefix operator.

     <
          comment starter.

     >
          comment ender.

     コメントのシンタックスの扱いについては GNU Emacs と同じであるが、 parenthesis のマッチング文字については制限がある。もし、CHAR がマルチバイト文字またはマルチバイト文字のリーディングキャラクタであれば、マッチング文字は同じリーディングキャラクタを持ったものでなくてはならない。もし CHAR が 2バイト文字ならば、マッチング文字の最初のバイトは CHAR の最初のバイトと同じでなければならない。

char-category
.............

シンタックスと同様に、カテゴリも文字の特性を定義します。シンタックスとの違いは以下の通りです。

 1. 各文字は一つ以上のカテゴリに属することができる。

 2. ユーザは define-category で新しいタイプのカテゴリを定義することができる。(例: japanese.el参照)

 3. char-category は、文字のすべてのカテゴリニモニックを文字列として返す。

 4. 正規表現による検索では、\sm や \Sm のかわりに、\cm または \Cm (m はニモニック) が使える。

 -- Function: define-category MNEMONIC CHAR DOC
     MNEMONIC を新しいカテゴリニモニックとしてつくり、CHAR がカテゴリとして MNEMONIC を含むようにそのカテゴリを変更する。

 -- Function: char-category CHAR &optional TABLE
     TABLE における CHAR のカテゴリニモニック文字列を返す。TABLE は、デフォルトではカレントバッファのカテゴリテーブルが使われる。

Mule ではあらかじめ以下の char-category を定義しています。

a
     ASCII 文字

b
     アラビア文字

c
     中国語 2バイト文字

g
     ギリシャ文字

h
     韓国語 2バイト文字

j
     日本語 2バイト文字

k
     日本語 1バイトカタカナ

l
     Latin-1 文字

r
     日本語 1バイトローマ字

t
     Big5 Level2 文字

w
     ヘブライ文字

y
     キリル文字

また、japanese.el で日本語文字に対して以下に示すような char-category を定義しています。

S
     記号。漢字コードの区点が 1, 2, 8区のもの。

A
     英数字。漢字コードの区点が 3区のもの。

H
     ひらがな。漢字コードの区点が 4区のもの、および "ー", "゛", "゜"。

K
     カタカナ。漢字コードの区点が 5区のもの、および "ー", "゛", "゜"。

G
     ギリシャ文字。漢字コードの区点が 6区のもの。

Y
     キリル文字。漢字コードの区点が 7区のもの。

C
     漢字。漢字コードの区点が 16区以上のもの、および "ヽ", "ヾ", "ゝ", "ゞ", "〃", "仝", "々", "〆", "〇"

ある文字のカテゴリは modify-category-entry で変更することができます。

 -- Function: modify-category-entry CHAR CATEGORY &optional TABLE RESET
     CHAR のカテゴリコードを CATEGORY に設定する。CHAR はリーディングキャラクタまたは 1バイト文字コードのリストが指定できる。CATEGORY はニモニック文字で与えられる。カテゴリは、テーブル TABLE に対してのみ変更される。デフォルトではカレントバッファのカテゴリテーブルが指定される。もし RESET が non-nil の場合は、CHAR のカテゴリはリセットされる。

また、現用のカテゴリテーブルの内容の説明は describe-category を使って表示ができます。

 -- Command: describe-category
     *Help*バッファを作り、そこにカテゴリテーブルの内容を表示する。

正規表現の拡張
-------

Mule は非常に強力な正規表現コンパイラ(regular expression compiler)を提供しています。これによって backward の re-match や、regular expression で記述された任意のテキストチャンクのサーチが出来ます。また、正規表現は多国語文字や char-category に対応して拡張および変更されています。

正規表現コンパイラ
.........

Gnu Emacs での正規表現の探索は、まず正規表現を中間コードに変換してからその中間コードを実行して探索します。この変換は正規表現の探索をするたびに行われます。Mule の正規表現コンパイラはこの中間コードを生成します。また正規表現探索を行う関数は正規表現パターンの他に中間コードにしたがって探索を行います。Mule での中間コードは Gnu Emacs のものより拡張されており、より高速に探索を行うことができます。正規表現コンパイラは、さらに後方正規表現を探索する中間コードも生成します。Gnu Emacs での後方正規表現探索はポイントを一つずつ後方へずらしてはそこから始まる文字列が正規表現に合致するかどうかを判定し、合致したとき探索が成功します。 Mule の正規表現コンパイラの後方正規表現探索では真の後方検索を行います。さらに Mule では疑似的な文節 (word) も正規表現を使って記述し、ユーザが定義することができます。

正規表現のコンパイルには、関数 regexp-compile および関数 regexp-word-compile を用います。

 -- Function: regexp-compile RE
     正規表現 RE をコンパイルして前方および後方正規表現探索する中間コードを生成する。

 -- Function: regexp-word-compile RE
     正規表現 RE をコンパイルして文節判定を行うための中間コードを生成する。

例えばバッファに AAAABBBBCDDDD という文字列があり、ポイントが C にある場合、

     (re-search-backward "B+")

ではポイントは最後の B に移動しますが、

     (re-search-backward (regexp-compile "B+"))

ではポイントは最初の B に移動します。

拡張パターン
......

Mule では、正規表現は以下に示すように多国語文字や char-category に対応して拡張および変更されています。

拡張:

\cCATEGORY
     char-category が CATEGORY の文字と合致する。

\CCATEGORY
     char-category が CATEGORY でない文字と合致する。

[...]
     各コードと等しい 1バイトもしくは マルチバイト文字と合致する。

normal code
     それと等しい 1バイトもしくは マルチバイト文字と合致する。

変更:

.
     改行文字を除く 1バイト文字 1文字またはすべてのマルチバイト文字 1文字と合致する。

文節(語の概念の拡張)
-----------

GNU Emacsでは「語」は、word constituent の並びとして定義されています。 Mule では、関数 define-word を使うことによって、ユーザが正規表現で「語」を定義することができます。

 -- Function: define-word-regexp NAME PAT
     「語」NAME の定義を正規表現 PAT で行う。

 -- Function: set-word-regexp NAME
     「語」NAME の定義を正規表現の「語」として使用する。

例えば、

     (define-word-regexp English-word-regexp "\\w+")

は、「語」English-word-regexp を word constitute である文字が 1文字以上並んだものであることを定義します。これは元の word の定義と同じです。

Mule では、この機能を利用して日本語における「語」、すなわち文節を以下のように定義することができます(この定義は worddef.el でなされています)。

     (define-word-regexp japanese-word-regexp
        "\\(\\cA+\\|\\cH+\\|\\cK+\\|\\cG+\\|\\cY+\\|\\cC+\\)\\cH*\\|\\w+")

さらに

     (set-word-regexp japanese-word-regexp)

によって先の「語」の定義が正規表現で使用されます。（この宣言は japanese.el でなされています。）これによってMule は次のような文字のシーケンスを 1つの「語」とみなします。

 1. 連続する word constituents

 2. 連続する同一のカテゴリに属する文字

 3. 前項のものに 0個以上のひらがなが続いたもの

この「語」は、日本語文中ではほぼ文節に対応し、1バイト文字シーケンス中では word と同じものです。

多国語ストリングの探索と置換
--------------

多国語文書についても探索コマンド search-forward, search-backward, isearch-forward, isearch-backward, re-search-forward, re-search-backward, isearch-forward-regexp, isearch-backward-regexp や置換コマンド replace-string, replace-regexp を使うことができます。

インクリメンタル探索(isearch)中にストリング入力を行なうには、 C-k をタイプして下さい。このモードではミニバッファ中でストリングの入力を行なうことができます。ストリング入力が終ったら、RET キーを押して下さい。Mule は isearch を再開します。

探索や置換に用いる正規表現は、多国語文字や char-category に対応して拡張および変更されています(see Regular Expression)。

行詰めと行揃え
-------

Mule は多国語文書についても行詰めと行揃えの機能を提供しています。

行詰め
...

Mule は多国語文書についても、コマンド fill-paragraph による行詰めや、auto-fill-mode における自動行詰め機能を提供しています。

日本語や中国語の文書では、語の間にスペースはなく行は一定の長さで折り返されるのが普通です。しかしこれらの文字のうちの一部(ほとんど記号です)は行頭や行末に現れることができません。このような文字を正しく扱うために、Mule は行の長さを変えることがあります。多国語文書の行詰めはオリジナルの Text Filling の拡張として実現されているので、英文字単語中で行が終ることはありません。

行頭及び行末禁則の一般規則は次のようになります。

行頭禁則文字
     文／句の終りを示す記号は行頭に現れない。このような記号としては句点(、)読点(。)などがある。変数 kinsoku-bol-chars はこのような文字のリストを保持する。

行末禁則文字
     文／句の始まりを示す記号は行末に現れない。このような記号としてはかぎ括弧開け(「)、括弧開け(()などがある。変数 kinsoku-eol-chars はこのような文字のリストを保持する。

Mule は、以下のどちらかの方法(禁則処理)を使って行の長さを変え、行頭行末禁則の規則を守ります。

ぶら下げ処理
     行の長さを 1ないし複数文字分伸ばす。変数 kinsoku-nobashi-limit が伸ばし得る最大文字数を示す。

追いだし処理
     行の長さを 1ないし複数文字分短くする。

Mule は次の場合に限り追い出しを、それ以外の場合ぶら下げを行ないます。

  * 禁則処理を行なわないと行末が行末禁則文字であり、その次の文字が行末禁則でない場合。

  * 行末禁則文字が行末付近で続き、変数 kinsoku-nobashi-limit で示される以上にぶら下げる必要がある場合。

変数:
 -- Global Variable: kinsoku-bol-chars
     行頭禁則文字のリスト。

 -- Global Variable: kinsoku-eol-chars
     行末禁則文字のリスト。

 -- Global Variable: kinsoku-nobashi-limit
     ぶら下げ処理によって伸ばし得る文字数(1バイト文字)の最大値。

行揃え
...

Mule は多国語文書についても行揃えを提供しています。英文の場合には語の間の空白文字を増やすことによって行揃えが行なわれています。多国語の場合には語間には空白文字をいれてはならない場合が多いので、句読点の後ろと alphanumerics と多国語文字の間に空白文字を挿入して行揃えを実現しています。

多国語処理のための拡張
===========

多国語処理を行なうために、ピクチャーモード、矩形領域処理、略称展開 (dynamic abbreviation)の 3点が拡張されています。

ピクチャーモード
--------

Mule におけるピクチャーモードはファイル picture.el へのパッチによって、文字の挿入方向、多国語入力の方法の 2点が拡張されています。

文字の挿入方向の拡張
..........

Emacs のピクチャーモードでは、1文字挿入された後のカーソルの移動方向を上下左右斜めに指定できます。斜めを指定した場合には、縦横各方向にそれぞれ 1 カラム(行)移動します。斜め指定の状態はモードライン上の `nw', `ne', `sw', `se' などのニーモニック表示で示されます。

Mule では、かな，漢字，韓国語文字などは通常のアスキー文字の 2倍の文字幅を持つので、上記に加え 2カラムと 1行斜めという指定が行なえるようになっています。指定状態は、`wnw', `ene', `wsw', `ese' のニーモニックで表示されます。

`se' と `ese' 指定時のカーソルの移動は次のようになります。

     s
      e
       指
        定
         時

     e
       s
         e
           指
             定
               時

コマンド:
 -- Command: picture-movement-wnw
     C-c ~。挿入後、左へ 2カラム、上へ 1行移動する。

 -- Command: picture-movement-ene
     C-c \。挿入後、右へ 2カラム、上へ 1行移動する。

 -- Command: picture-movement-wsw
     C-c ?。挿入後、左へ 2カラム、下へ 1行移動する。

 -- Command: picture-movement-ese
     C-c |。挿入後、右へ 2カラム、下へ 1行移動する。

ピクチャーモードでの多国語入力
...............

Emacs の picture モードでは、通常の文字は全て picture-self-insert というコマンドに割り付けられています。Mule では「たまご」による日本語・中国語入力を行なうために、「たまご」使用時には通常文字を全て egg-self-insert-command に割り付けます。「たまご」 が文字列を確定した後に呼ぶ self-insert-after-hook には picture-insert-after-hook が割り付けられ、この関数が文字列の入力処理を行ないます。

EGG 以外の入力方式 (SKK 等) を用いる場合は、関数 picture-insert-string (C-c k)を実行し、ミニバッファから文字列を読み込まなくてはなりません。

関数:
 -- Function: picture-insert-after-hook BEGIN END
     現在のバッファにストリングを挿入した後実行される hook。2引数 BEGIN と END は挿入したストリングの先頭と最後の位置を示す。

コマンド:
 -- Command: picture-insert-string STR
     picture-movement コマンドによって指定された方向へポイントを移動させながら、ストリング STR の構成文字を一文字ずつ挿入する。

矩形領域の処理
-------

矩形領域(rectangle)の処理はファイル rect.el へのパッチによって拡張されています。

GNU Emacs はバッファ内の矩形領域に対してさまざまな処理を行なう関数を持っています。しかし Mule では矩形領域の境界にまたがって多国語文字(2バイト文字)が存在する可能性があります。これに対処するため、境界上の多国語文字はその横幅に対応する文字数分のアスキーのスペースに置き換えた上で処理を行ないます。

このため、

     		        ↓
     		これは rectangle の
     		境界に,多国語文字が存
     		在する場合の処理の例
     		です。test test test
     			     ↑

上のような2点で指定された矩形領域に対して kill-rectangle を行なうと、

     		        ↓
     		これは rele の
     		境界に,多 字が存
     		在する場 理の例
     		です。test test
     			↑

というように2行目の「文」と3行目の「合」の2文字が削除されます。また、 yank-rectangle を行なっても、

     		        ↓
     		これは rectangle の
     		境界に,多国語  字が存
     		在する場  の処理の例
     		です。test test test
     			     ↑

上記のようになり、元通りには復元しません。

動的な略称展開
-------

ファイル dabbrev.el へのパッチによって、多国語についても動的略称展開(dynamic abbreviation)ができるようになっています。ワードの切り出しは define-word で定義されたものに従います。

Mule Lisp
*********

Emacs Lisp に関していくつかの拡張がなされています。

マーカの拡張
======

Mule では `point-type' という新しいタイプのマーカを提供しています。このタイプのマーカの位置への挿入は、そのマーカをポイントのように挿入されたストリングの直後に移動します。先頭にオリジナルのマーカ、最後尾にこの新しいマーカをおくことで設定される領域は、領域の全ストリングの削除や最後尾へのストリングの挿入などについて特別な配慮を必要としません。

コマンド:
 -- Command: set-marker-type MARKER POINT-TYPE
     POINT-TYPE が nil でなければ、マーカ MARKER のタイプを POINT-TYPE に設定する。nil ならばオリジナルのタイプに設定する。 MARKER を返す。

関数:
 -- Function: insert-after-markers STRING/CHAR
     引数としてストリングか文字(いくつでも)をとる。ストリング／文字(たち)をポイントの後ろに挿入し、挿入位置を指している `point-type' のマーカを挿入されたテキストの直前に移動する。

属性の付与
=====

バッファ中の領域について、表示に関する属性を与えることができます。現在提供されている属性は下線、反転そして太字(ボールド)です。

コマンド:
 -- Command: attribute-on-region ATTR &optional FROM TO
     領域内の属性 ATTR を on にする。現在のところ ATTR は `underline', `inverse', `bold' が使用できる。プログラムから呼ぶ場合はさらに 2引数 FROM と TO をとる。FROM が nil の場合には(point-min)、TO が nil の場合には(point-max)が用いられる。

 -- Command: attribute-off-region ATTR &optional FROM TO
     領域内の属性 ATTR を off にする。ATTR は`underline', `inverse' または `bold'。

関数:
 -- Function: attribute-get-attribute &optional POS
     位置 POS の attribute range を返す。POS のデフォルト値はカレントポイント。 attribute range は、attribute type、その始点、終点のリスト。

コマンド一覧
******

チュートリアル

Mule 日本語版チュートリアルを起動
     C-h T

多国語文字モードの設定

多国語文字モード⇔ alphanumerics モードの切替え
     C-x C-k t

多国語文字モード⇔ alphanumerics モードのデフォルト値の切替え
     C-x C-k T

使用する多国語文字コード系の設定

キーボード文字コードの設定
     C-x C-k i

ディスプレイ文字コードの設定
     C-x C-k d

ファイル文字コードの設定
     C-x C-k f

ファイル読み込み時のファイル文字コードの一時的切替え
     C-u C-x C-f

ファイル書き込み時のファイル文字コードの一時的切替え
     C-u C-x C-w

プロセス文字コードの設定
     C-x C-k p

選択されているコード系を表示
     C-x C-k CまたはC-x C-k c

ファイル文字コードのデフォルト値の設定
     C-x C-k F

プロセス文字コードのデフォルト値の設定
     C-x C-k P

インクリメンタル探索

ストリング入力
     (C-s,C-r などの後)C-kSTRINGRET

ピクチャーモード

左へ 2カラム、上へ 1行カーソル移動
     C-c ~

右へ 2カラム、上へ 1行カーソル移動
     C-c \

左へ 2カラム、下へ 1行カーソル移動
     C-c ?

右へ 2カラム、下へ 1行カーソル移動
     C-c |

変更(キーボード文字コードが ISO2022 系のコード系になっているとき)

ポイントのある単語の綴りチェック
     M-#

かっこの挿入
     M-{