Meadow 関係の覚え書きです。随時更新します。
目次
Meadow で, デフォルトで使う文字集合を変更するもっともよい方法は (日本語の場合)
(set-language-environment "Japanese")
(setq default-input-method "MW32-IME")
のようです。 Meadow ではこれで sjis がデフォルトになります。 中国語の場合 "Japanese" にかえて "Chinese-GB" や "Chinese-BIG5" を使います。 (prefer-coding-system 'sjis) とかでも大丈夫なのですが, こうした方が, ファイルを開くときの優先順序などまで考慮してくれるので, よりよいといえます。 "MW32-IME" を設定しているのは, こうしないと C-\ を押したときに 「japanese という IME はない」としかられるからです。 こういうものなのかどうなのか, わかりません。 "MW32-IME" は international/meadow.el で定義されています。
さて, 一時的にコーディングシステムを変える方法もいろいろあります。 もっとも優先順位の高いのが (universal-coding-system-argument) で, これはメニューからも選べますし, C-x RET c にも割り付けられています。 このコマンドは, 直後に実行する一コマンドのみコーディングシステムを変える, というものです。 たとえば, うっかり GB のファイルを日本語ファイルとして開いてしまった場合, C-x RET c でプロンプトに cn-gb-2312 と打ち込んで, そのあと M-x revert-buffer とやればちゃんと中国語が表示されます。
多国語を使用する人間にとって一番よく使うのは, 新規にオープンするファイルのコーディングシステムを変えたい, というものでしょう。 一時的な変更なら上記の universal-coding-system-argument が使えるのですが, これは毎回指定してやらなければなりません。 もっと恒久的に変更するためには, coding-system-for-read, coding-system-for-write という変数を設定することができます。 たとえば
(setq coding-system-for-read 'cn-gb-2312)
とすれば以後ひらくファイルは GB2312 でかかれているものとみなされます。 デフォルトは nil です。 ただ, この方法は手間がかかるのであまり優れているとは言えません。
もっと賢い方法として, ファイル名からコーディングシステムを自動判別する, というのがあります。 たとえば中国語の場合, GB と BIG5 を拡張子 .gb, .b5 で区別することが多いので,
(modify-coding-system-alist 'file "\\.gb$" 'cn-gb-2312)
(modify-coding-system-alist 'file "\\.hz$" 'hz-gb-2312)
(modify-coding-system-alist 'file "\\.b5$" 'big5)
(modify-coding-system-alist 'file "\\.sj$" 'sjis)
(modify-coding-system-alist 'file "\\.sji?s$" 'sjis)
(modify-coding-system-alist 'file "\\.euc$" 'euc-jp)
(modify-coding-system-alist 'file "\\.jis$" 'junet)
;; 大文字と小文字は区別する.
(modify-coding-system-alist 'file "\\.GB$" 'cn-gb-2312)
(modify-coding-system-alist 'file "\\.HZ$" 'hz-gb-2312)
(modify-coding-system-alist 'file "\\.B5$" 'big5)
(modify-coding-system-alist 'file "\\.SJ$" 'sjis)
(modify-coding-system-alist 'file "\\.SJI?S$" 'sjis)
(modify-coding-system-alist 'file "\\.EUC$" 'euc-jp)
(modify-coding-system-alist 'file "\\.JIS$" 'junet)
のようにします。 現在どういう設定になっているかは, 変数 file-coding-system-alist を見ればわかります。 ただしこの変数を直接変更することはできないみたいです。 なぜ?
特別な設定をせず, ファイル名からも判断がつかなかった場合には, Meadow は coding-category-list 変数をもとにファイルのコーディングシステムを判断するようです。 先に述べた (set-language-environment "Japanese") は自動的に この変数を更新します。 junet → euc-jp → sjis の優先順位になっています。 euc-jp と sjis の判別のつかないファイルはたいてい euc-jp なので, この順位は特に変える必要がないと思います。 sjis と gb を使う人は, この coding-category-list のアタマに gb を足してやればうまく自動判別されるようになると思います(試してません)。 もっとも euc-jp は gb と見分けがつかないので全部 gb として読みこまれてしまいますが。
各方法の優先順位は述べてきた順, つまり
という優先順位を持ちます。
その他, あんまり役に立たないものとして, set-auto-config といういかにもそれらしい名前の函数がありますが, これはファイルそのものに -*- coding:xxx のような指定を書き込んでおくものです。
なお, (setq-default buffer-file-coding-system xxx) というのは 新規ファイルをセーブするときのコーディングシステムを指定するためにあり, 既存のファイルをオープンするときには意味を持ちません。
Meadow の最大の特徴は, Windows アプリケーションでありながら X の BDF フォントが使えること, および本来の Mule の最大の特徴である多言語同時使用でしょう。 オリジナルの Mule で使えた CJK のフォントは勿論, IPA や四声つきアルファベット, タイ・ラオ・エチオピア・ヘブライ・アラビヤなどの文字がそのまま使え, Windows のフォントと混ぜて使えます。 しかしその設定はあまりやさしいものではありません。
基本的な手順は以下のようになります。
とまあ, ずいぶん手間がかかりますが, bdf の登録に関しては 原武生(はら たけより)氏のページに実際の設定が書いてあるので, それをマネすればいいと思います。
mw32misc.el に, このへんの手間を軽減するための便利な函数が定義されているのですが, いろいろありすぎてかえって迷ってしまい, 私の場合は結局ビルトイン函数を単純に組み合わせて使っています。
フォントを設定することによって, いろんな言語のドキュメントを読むことはできるようになりましたが, 入力はどうするのでしょうか。
まず, Windows の日本語IMEはそのまま使えるようです。 ただし, ちょっと問題があります。 C-\ で IME を ON にしたあと, 別なバッファを表示している別なウィンドウに移っても IME は ON のままですが, ここから OFF にするためには C-\ を2回打鍵しなければなりません。 Meadow 側がバッファごとに IME の ON/OFF を覚えているのに, 実際の IME はバッファ変更に気がつかないためにこういう問題が起きるようです。
アクセントつきのラテン文字はどうでしょうか。 Windows95 では複数のキーボードレイアウトを選択することができますが, たとえば英語のインターナショナルキーボードを選択して, キーボードのコーディングシステムを iso-8859-1 にしておき, Alt-Gr n と打っても何も入力されません。 「'e」は単なる「e」になってしまいます。 できないのかな? と思いましたが, どうやら「'」と「e」の打鍵間隔をうんと短くしてやると入力できることもありました。 でもあまりうまくいきません。
しかたがないので Mule 組み込みの入力法である M-x iso-accents-mode を使うことにしましょう。 とりあえずこれで「'e」などを使ってアクセントつき文字を入力することができます。
IPA などを入力するには, LEIM が必要です。 LEIM は GNU Software のミラー FTP サイトから入手可能です。 FTP Site for GNU Softwareにある一覧から適当に選んでください。
なお, Meadow での LEIM の使い方は郡山直大(こおりやま なおひろ)氏の Meadow のページに詳しく, この項も郡山氏の記事を参考にして書いています。
LEIM の設定は(フォントに比べればはるかに)簡単で, LEIM を適当なディレクトリに展開した後, Meadow の上から
M-x quail-update-leim-list-file
と入力すると, leim のあるディレクトリをたずねてくるので, 適当に答えます。 すると leim/quail の下にあるすべての *.el を調べて, それらを入力メソッドとして登録するプログラムのはいった leim-list.el というファイルを自動的に作ってくれます。 あとは .emacs の中から (load "leim-list") でこのファイルを読み込むようにすると, LEIM の IME が使えるようになります。
実際の IME の切り替えは C-u C-\ で行います(C-x RET C-\ でもできますし, メニューから選択することもできます)。 切り替える IME をたずねてくるので ipa と入力すれば IPA 入力モードになり, 「/e」で e が上下逆になった字などを入力できます(もちろん IPA 用の BDF フォントを登録してあれば)。
中国語の場合は, デフォルトで倉頡入力と簡易入力 (倉頡入力の先頭と最後だけを入力するするもの)のみが使えます。 それ以外は cxterm の辞書を変換してやります。 cxterm というのは X Window 用のターミナルプログラム xterm の中国語版で, 自前の入力システムを持っています。 leim の下に CXTERM というディレクトリがあるので, そこをカレントディレクトリにして, コマンドラインから
meadow -batch -l titdic-cnv -f batch-titdic-convert .
と入力すると(かなり待たされますが) *.tit から *.el を生成してくれます。
できた *.el ファイルを quail ディレクトリに移動して, あとは先ほどと同じように quail-update-leim-list-file を実行してやれば, あとはほかの入力方法と同様に使えます。
ただし LEIM のおまけについている cxterm 辞書はたいてい単漢字変換の上に候補がソートされておらず, たいへん効率が悪いので, ifcss の ftp においてある CZComplete という熟語変換辞書を利用した方がいいと思います。 ただ Makefile が UNIX用(ファイルの大文字と小文字を区別している)ので, Windows 上でコンパイル・実行しようと思ったら Makefile を書き直さなければなりません。 なおこの Makefile では *.cit を作っていますが, これは cxterm にしか必要ないファイルなので, quail のためには *.tit だけで十分です。
make に自信がない人の場合, やはり ifcss にある WuBi.tit という五筆字型入力用の辞書を使うことが考えられます。 単漢字変換だとピンインより五筆字型の方が圧倒的に能率がいいので, これを使うことも考えられます。 もっとも quail のしくみは単純なので, 「z」によるワイルドカードその他の便利な機能が使えないのが残念です。
なお, 五筆字型入力を選んだ場合, モード行に「査」と出ることがありますが, これはどうも tit を el に変換したときに解析しそこなったもののようです。 実際には「漢字輸入::五筆字型::」の先頭の「漢」(GB で BABA) がそのまま紛れ込んでおり, それが EUC-JP として解釈されてしまって文字化けしています。 wubi.el を書き直して「五筆」と出るようにしましょう。
直すついでに, 「リターンキーで入力キャンセル, スペースを打つと後ろにそのままスペースが入ってしまう」 という困ったキーアサインも直しておくとよいかと思います :-)
ほかにも電報コードや教会ローマ字(台湾語)などの辞書がありますが, 省略します。
なお中国語用のモジュールはサイズが大きいので, バイトコンパイルしてから使うことをお勧めします。 (leim-list.el をコンパイルする必要はありません)。
Windows95 の普及によって 16色しか表示できないマシンはかなり淘汰されましたが, まだ NT 3.51 を 16色で使っている人もありますし, 256色マシンはまだまだ健在です。 これらのマシンで適当な色を選ぶにはかなり努力を必要とします。
Emacs では, 色はフォントと同様フレームパラメータの一部なので,
(frame-parameter nil 'background-color) ; 現在のフレームの背景色を知る (modify-frame-parameters nil '((background-color . 色指定))) ; 背景色変更 (setq default-frame-alist (nconc '((background-color . 色指定)) default-frame-alist)) ; デフォルト値を変更
のようにいじることができます。 もともとの Emacs の色指定に加えて, Meadow は "#RRGGBB" の形式で Windows の 24bit カラーを任意に指定できます。
しかし 256色以下のマシンでは, へたな色を指定するとディザ表示になってしまいます。 16色しか表示できない16色しか使えないのは当然ですが, 256色表示の可能な機種でも, システムパレットには普通 20色しか定義されていないので, これ以外の色を選ぶと汚いディザになってしまいます。 注意しましょう。
| 16色パレット | 256色パレット | RGB値 | おおまかな説明 |
|---|---|---|---|
| 0 | 0 | 000000 | 黒 |
| 1 | 1 | 800000 | えび茶 |
| 2 | 2 | 008000 | 深緑 |
| 3 | 3 | 808000 | 黄土色 |
| 4 | 4 | 000080 | 濃紺 |
| 5 | 5 | 800080 | 紫 |
| 6 | 6 | 008080 | 青緑 |
| 8 | 7 | C0C0C0 | 明るい灰色 |
| --- | 8 | C0DCC0 | 淡い緑 |
| --- | 9 | A6CAF0 | 淡い水色 |
| --- | 246 | FFFBF0 | わずかに肌色がかった白 |
| --- | 247 | A0A0A4 | 落ち着いた灰色 |
| 7 | 248 | 808080 | 暗い灰色 |
| 9 | 249 | FF0000 | 赤 |
| 10 | 250 | 00FF00 | 明るい緑 |
| 11 | 251 | FFFF00 | 黄 |
| 12 | 252 | 0000FF | 青 |
| 13 | 253 | FF00FF | マゼンタ |
| 14 | 254 | 00FFFF | シアン |
| 15 | 255 | FFFFFF | 白 |
256色になって追加された 4色はさすがに厳選されただけあって, 背景色に指定するとなかなか落ち着いた雰囲気になります。 色指定がうまくいかなくて困っている人は一度試してみてください。
この表が手許にない場合, コントロールパネルの色指定で「色の作成」を選び, 適当な色を選択してから「純色」の欄をダブルクリックすると, システムパレットにある色が選ばれるので, その RGB値を16進に直してやってもうまくいくと思います。
さて, Meadow を複数のマシンにインストールしてあり, 色数の多いマシンでは美しい色を, 256色のマシンではそれなりの色を背景に使いたい, という場合に, いちいちマシンごとに .emacs を書き換えるのでは大変です。 そこで Windows の色指定(ウィンドウの背景・ウィンドウの文字)を起動時に読み取る方法を考えました。
色指定を知る正式な方法は GetSysColor API を使うのですが, 面倒なので ActiveState社の Perl を使ってレジストリ値を読み取ることにします。 (ActiveState はこないだまで ActiveWare という名前でした。 本当によく名前を変える会社です。)
スクリプトはごく短いので, ここに全文をあげます。
#!/usr/bin/perl
use Win32::Registry;
$HKEY_CURRENT_USER->Open("Control Panel\\Colors", $reg);
$reg->GetValues(\%colors);
print "(setq default-frame-alist\n (nconc '(";
printf '(background-color . "#%02x%02x%02x")',
split(' ', $colors{'Window'}->[2]);
printf '(foreground-color . "#%02x%02x%02x")',
split(' ', $colors{'WindowText'}->[2]);
print ")\n default-frame-alist))\n";
このスクリプトを getcolor.pl とでもいう名前にして, .emacs の中で
(eval (read (shell-command-to-string (concat "perl " (expand-file-name "~/getcolor.pl")))))
としてやればいいはずです。 もっともそんなにちょいちょい色を変えない, という人は, .emacs から直接 Perl を実行したりせずに, 結果だけを利用した方が起動が早くなります。
どっちかというと Meadow でなく Mule の話になります。 Mule for Windows だと Info で Mule のところを見れば書いてあったんですが, Meadow では Info が大幅に変わってしまったので今のところうまく情報がみつけられません。
コーディングシステムがどうこう, というのは外部と Meadow のやり取りの話であって, Meadow 内部の文字表現にはただ一種類しかありません。 だからファイルをオープンするときに元のファイルが sjis で書いてあっても, いったんバッファに読み込みさえすれば補助漢字でも GB でも使い放題。 もっともそれをいったんファイルにかき出して, それを再び読み込んだときにちゃんと読めるかどうかはまた別の問題ですが。
では, 実際に Meadow 内部ではどのように文字が表現されているのでしょうか。 確かめるには, C-x RET f emacs-mule にしてファイルに書き出し, ダンプしてみればいいでしょう(フェイスとかの話は省略)。
たとえば「日」という字を JIS, GB, CNS, Big5 でそれぞれ書いてみます。 すると, 下のようになります。
| JIS | 92 C6 FC |
| GB | 91 C8 D5 |
| CNS | 95 C5 CA |
| Big5 | 98 A7 CB |
Big5 以外は先頭バイトを除くと EUC(-JP/CN/TW) と同じになっています。 Big5 は 東アジアの文字集合の概要: 中国語のところに書いた HZ+ と同様のマッピングを行っています(MSB を立てているところが異なる)。
次に, 円記号「¥」を iso-8859-1 と JIS X 0208 で書いてみます。
| ISO-8859-1 | 81 A5 |
| JIS | 92 A1 EF |
以上の例でだいたいのかんじがわかるでしょうか?
ASCII は 1バイト(00-7F)でそのまま, それ以外は先頭の1バイト(8x,9x)が文字集合の種類を表します。 これを leading character (LC) と呼びます。 その後ろの数バイト(A0-FF, バイト数は文字集合によって異なる) は最上位ビットを立てた形で符号化表現します。 1バイトを見るだけで, その文字が多バイト文字の先頭バイトか, 後続バイトか, ASCII か, が判別できるわけで, UTF-8 によく似ています。
実際はもう少し複雑で, 公式の(ISO に登録されているという意味だと思う)文字集合とそうでない私用文字集合を分けており, 後者は識別バイトが 2バイトになります。 つまり 1バイト文字集合では 3バイト, 2バイト文字集合では 4バイトになります。 私用文字集合の識別バイトの 1バイトめ(LCPRV)は 9A-9D, 2バイトめは A0-FE なので, 80-9F/A0-FF... という形をしていることには変わりがありません。
| 種類 | 1バイトめ | 2バイトめ | 3バイトめ | 4バイトめ |
|---|---|---|---|---|
| ASCII | 00-7F | |||
| COMPOSIT(タイ文字など) | 80 | (省略) | ||
| 公式1バイト | 81-8F | A0-FF | ||
| 公式2バイト | 90-99 | A0-FF | A0-FF | |
| 私用1バイト | 9A | A0-DF | A0-FF | |
| 9B | E0-EF | |||
| 私用2バイト | 9C | F0-F4 | A0-FF | A0-FF |
| 9D | F5-FE | |||
問題は「公式2バイト」が 10 種類しかないことで, JISX0208 の 1978 と 1983, GB2312, KSC5601, JISX0212, CNS11643の1と2, Big5の1と2 (実際には公式の文字集合ではないが Mule では特別扱いしている) でそのうちの 9種類埋まっています。 ところが CNS はさらに 3 から 7 までの追加文字集合ができたので, 私用2バイトの F6 から FA までをあてています(ちなみに F5 はエチオピア文字)。
どの文字集合がどの LC を持っているかは, M-x list-character-sets で見ることができます。
本当はマルチバイトでなくて 32bit FLAT の方が美しいのでしょうが, Mule は一から作られたものでなく Emacs の拡張として作られているので, このような妥協はやむを得ないのでしょう。
さて, 以上は「文字列」の表現であり, 「文字」の表現となるとまたちょっと異なっています。 たとえば JIS の「日」の上にカーソルを置いて C-x = すると 0xe37c と表示されます。 さきほどの 92 C6 FC とどういう関係にあるのかわかりにくいと思いますが, e37c は2進表記で 1110 0011 0111 1010 であり, これを下から 7bit ずつに きり直すと 11 1000110 1111010 (3:46:7C) となります。 最初の 3 が LC(92) をシフトさせたもの, 次の 46, 7C は C6, FC の MSB をクリアしたものです。 このへんは Mule の Info を見てください。
さいわい, 文字での表現と文字列での表現を変換する函数群があります。 ただしこのへんはずいぶん以前の Mule と変わってしまっています。 以前は文字集合シンボルはなく, そのかわりに LC 自身を使っていました。 文字から直接 LC を得る char-leading-char とか, 文字を分解する char-component とか, LC からその文字集合の属性を得る (character-set LC) などは一掃されてしまっています。
言語や文字集合・フォントの指定が Meadow と Mule for Windows で大幅に変わっています。 そこで .emacs を共有するためには, Meadow と Mule for Windows のどちらで動いているかを .emacs の中で判別しなければなりません。
Meadow は features に meadow というシンボルをを追加します。 したがって,
(if (featurep 'meadow) Meadow用設定 Mule-for-Windows用設定)
とすれば, ひとつの .emacs を共有することができます。
本当は Meadow でなく emacs20 の新機能に関わる変更の方が大きいので, emacs-major-version 変数などを利用した方がいいのかもしれませんが, 面倒なので私は全部 (featurep 'meadow) だけで分けています。