6. Meadow

(2005年12月追記: この章の内容は 2004 年に書かれたものです。 内容は現在でも通用しますが,ここで扱っている Meadow 1.15 はすでにかなり古く, Emacs Lisp プログラムの中には対応しないものも出てきました。 たしかに Meadow 1.15 も,ベースとなった GNU Emacs 20.7 も安定した傑作バージョンでした。 Cocoa/GNUstep への Emacs 移植として開発されている Emacs on Aqua は今でも GNU Emacs 20.7 をベースにしています。 自分自身,C# 編集モード (§11.2) が不要なマシンにはまだ Meadow 1.15 を入れています。 しかし,少なくともこれから始める人にとっては, 積極的に新しいバージョンを使うことが, Emacs および Meadow の開発者にとっても本意ではないかと思います。 Meadow 2.10 を扱った §16 にお進みください)

前回予告の時点では,今回は Cygwin 上の Python について書く予定でした。実際,書いていました。 しかし,あらかた書きあがったその日の午後, 編集作業をしていたマシンのハードディスクがクラッシュしてしまいました。 悪いことに突然の不調で他のマシンへのコピーもしていませんでした。 1週間の苦闘もむなしくサルベージに失敗し, あきらめ,気をとりなおして書き直そうとしていたそのとき, Cygwin の emacs と X11 に更新がありました。 X11 版の emacs が,日本語のコピー&ペーストなど, 今までよりずっと使い物になっている様子で, すっかり感激してしまいました (ただし, Cygwin で大きな変更があったときは毎度のことですが,しばらくの間,結構な不具合が出たりして小変更が続きます。 今回は,数日のあいだ xterm で日本語が使えない*1状態が続きました。今は落ち着いてきているようです )。

というわけで,予定を変更し, 次回以降のために下準備をしていた emacs と X11 について先に書くことにします。

しかし,いきなり X11 と emacs をともに導入するのは説明が大変ですから, まずいったん X11 から離れて, emacs の分家筋のひとつ Meadow を Cygwin から使えるようにしましょう。 その設定は,ウィンドウ・システムに特有の事項を除けば emacs と大半が共通です。 また,高機能なテキスト・エディタを早期に導入することで, その後の操作を楽にする,という目的もあります。

6.1 Meadow の導入

Meadow (Multilingual enhancement to gnu Emacs with ADvantages Over Windows) は Unix 上のテキスト・エディタの定番のひとつである emacs を Windows へ移植したもののひとつです。

環境変数 HOME 等を共有していますが, Meadow 自体は Cygwin から独立した,通常の Windows アプリケーションです。 ここでは筆者が今使っている Meadow 1.15 版について説明します。

インストールするには,たとえば, http://www.meadowy.org/meadow/download.html ftp://ftp.ring.gr.jp/pub/pc/meadow/ から Meadow-1.15-i386.tar.gz を get して, Cygwin を使って C: などに展開します*2

01:/cygdrive/c$ gzcat Meadow-1.15-i386.tar.gz | tar xvf -

展開後,コマンド プロンプト からインストーラを実行します。 インストーラ自身はコンソール・アプリケーションです。 特に意図がなければ,途中の質問にはただ Enter キーを押してデフォルトどおりの設定にします*3

C:\Meadow\1.15>install.exe

インストール後,Meadow のショートカット・ファイルの「プロパティ」を開いて,「作業フォルダ」を
%HOMEDRIVE%%HOMEPATH%
などにしておくと便利でしょう。

Windows では環境変数 HOME を設定せず, .emacs ファイルを デフォルトの C:\Meadow\1.15\ に置くことを勧めます。 後から導入する Cygwin 生え抜きの emacs との衝突を避けるためです。

筆者が使っている C:\Meadow\1.15\.emacs1_15-dot-emacs.tar.gz として,C:\Meadow\1.15\site-lisp\site-lisp.tar.gz としてそれぞれアーカイブしておきます。 適宜御利用ください*4
(初期状態では C:\Meadow\1.15\site-lisp\ には subdirs.el だけがありますから,site-lisp.tar.gz を展開した内容を追加します)。

右図は,Windows XP 上でこれらのアーカイブによる設定をした後の Meadow の画面例です。

6.1.1 .emacs ファイル

上記で導入した 1_15-dot-emacs.tar.gz 内の .emacs ファイルの内容について, いくつか,かいつまんで説明します。

;;; .emacs for Meadow
(require 'un-define)			; ftp://ftp.m17n.org/pub/mule/Mule-UCS/
;; (require 'jisx0213)
(set-language-environment "Japanese")
(setq coding-category-raw-text 'utf-8)

Unicode と日本語環境の設定です。 Unicode が不要ならば, (require 'un-define)(setq coding-category-raw-text 'utf-8) の先頭にセミコロンをつけてコメント・アウトします。 起動が多少軽くなります。 前者 require は Mule-UCS ライブラリを読込んで 日本語文字等の Unicode データを用意します (少々重い処理です)。 後者 setq は utf-8 のファイルを euc-jp や shift_jis と同じく自動的にコード判定して読み込めるようにします (正確には少し違うのですが,効果としてはそうです)。

(load-library "term/keyswap")
(global-set-key "\M-j" 'enlarge-window)
(global-set-key "\M-o" 'other-window)
(global-set-key "\C-co" 'overwrite-mode)
(global-set-key "\C-ch" 'help-command)
(global-set-key "\C-cg" 'goto-line)
(setq scroll-step 1                     ; Scroll a window by 1 line
      window-min-height 2)              ; Allow 1-line windows 

(load-library "term/keyswap") はキーコードの 0x7F (ASCII でいう `DEL') と 0x08 (同じく `BS') を交換します。 C-h (Control+h) が一文字後退になります。 デフォルトで C-h に割り当てられていたヘルプ・コマンドは (global-set-key "\C-ch" 'help-command) により, C-c h (Control+c を打鍵してから h を打鍵する) で使えます。 デフォルトでは半画面ごとのスクロールですが, 変数 scroll-step の値を 1 にして,1行ごとのスクロールにします。

6.2 Cygwin から Meadow を使う

Meadow それ自身は純粋な Windows アプリケーションです。 ファイルのパス名も Windows のものしか理解しません。 ですから,たとえばコマンド引数として /tmp/poi.txt ではなく 'C:\cygwin\tmp\poi.txt' を与えなくてはなりません。

そこで,/usr/local/bin/meadow として 下記の zsh スクリプトを用意します (ファイルはここにあります。 ファイル名に拡張子はありません。ただの meadow です。 保存したとき, ブラウザが .txt 等を付加した場合はファイル名を変更して取ってください)。

#!/bin/zsh -
unset HOME LANG
for ((i = 1; i <= $#; i++))
do
  if [ ${argv[i][0]} != '-' ]
  then
    argv[i]=`cygpath -w "$argv[i]"`
  fi
done
exec C:/Meadow/1.15/bin/meadow "$@"

使う前には Shells カテゴリの zsh パッケージをインストールしておきます。 zsh (Z-shell) は高機能で操作性に優れたシェルですが, ここでは文字列を配列として扱えるように言語仕様が拡張された bash として利用しています。

このスクリプトは,コマンド引数のうちハイフン で始まらないものを cygpath コマンドで Windows のパス名に変換してから, Meadow を起動します。 unset HOME は,ホームディレクトリの .emacs を Meadow が誤って読んでしまわないようにします。 unset LANG は,日本語環境でも, 後述の英語スペルチェッカが正しく動作するようにします。

この "meadow" スクリプトにより,下記のように, 普通の Cygwin コマンドと同様に Meadow を起動できるようになります。

01:~$ meadow /tmp/poi.txt

6.3 英語スペルチェッカの導入

Emacs には ispell コマンドを利用したスペルチェック機能があります。 たとえば,調べたい単語の上にカーソルを置いて, M-$ (ESC を打鍵してから $ を打鍵する, または Alt 等を押しながら $ を打鍵する) で, その単語をスペルチェックできます。

下記のように Cygwin に英語スペルチェッカを導入すれば, "meadow" スクリプトで起動した Meadow から,この機能を利用できます。

ついでですから,同じく /usr/share/aspell/ にある spell/usr/local/bin/ にコピーしましょう。 これは従来の spell コマンドと等価な動きを実現するシェル・スクリプトです。 あまり使いませんが,M-x spell-word などとすると spell コマンドが呼び出されます。

6.3.1 aspell と環境変数 LANG

aspell は環境変数 LANG によって単語辞書を選択します。 前回 5.3 節でも少し触れましたが,今の Cygwin で正攻法,つまり標準ライブラリ関数経由で locale を問い合わせると環境変数無視でつねに "C" locale が返されますから, これは aspell が独自に国際化対応をしていることを意味します。

現在,英語 (aspell-en) のほかドイツ語 (aspell-de) とポーランド語 (aspell-pl) が Cygwin のパッケージとして用意されています。 英語では LANG が "en_US" または "C" か, それとも "en_GB" かでアメリカ語辞書とイギリス語辞書を使い分けられます (後者,グレート・ブリテン島の英語では, たとえば "centre" が正しく,"center" がミススペルと判定されます)。

問題は LANG を日本国の日本語 "ja_JP" に設定した場合です。 下記のように単語リストがないといって終了します。

01:~$ LANG=ja_JP ispell -a
Error: No word lists can be found for the language "ja_JP".
11:~$

"meadow" スクリプト では unset LANG をすることで, さしあたりこの問題を回避しました。LANG が未定義のときは "C" locale 扱いですから,アメリカ英語が選ばれます。 もしもイギリス英語のスペルをチェックしたいときは, /usr/local/bin/ にコピーしたシェル・スクリプト ispell と spell の第2行目付近に下記を挿入して,"en_GB" locale で動かすとよいでしょう。

LANG=en_GB
export LANG

6.4 Read-Only MEADOW

前回 5.1 節の .bashrc ファイルで

alias romeadow='meadow -l remacs'

というエイリアスを導入しました。そのときは vi に対する view のような,読み取り専用の meadow を用意するものだ, とだけ述べて説明は後日に延ばしました。 ここではその説明をします。

このエイリアスは,6.2 節の meadow スクリプトに -l remacs オプションを与えて, Meadow に reamcs という名のライブラリ・ファイルを load させます。 そのライブラリ・ファイルは site-lisp.tar.gz に remacs.el として含まれています。 したがって,6.1 節のように site-lisp.tar.gz を導入すると,この romeadow (Read-Only MEADOW) を実際に使うことができます。

remacs.el の内容を下記に示します。このように実質たった3行の Emacs Lisp 式です。ファイルを読み込んだとき, そのバッファを読み取り専用にするようにフックを仕掛けます。

;;;; remacs.el (Read-only Emacs)
(setq find-file-hooks
      (cons (lambda () (setq buffer-read-only t))
	    find-file-hooks))

たとえば次のように使います。

01:~$ romeadow /tmp/poi.txt

romeadow は, ファイルの内容をうっかり壊してしまいたくないときの安全策として使います。 もちろん,ファイルの読み込み時に読み取り専用モードにするだけですから, その後 C-x C-q (Control+x を打鍵してから Control+q を打鍵する) などと 意識的 にモードを解除すれば,書き込み可能になります。

次回予告

次回は Cygwin 上の X11 と (本来の) emacs について説明します。 Python インタープリタについてはその次にお話しします。


脚注

*1 知っている人はよく知っているとおり,近頃の (といっても随分たちますから, 知らないと少し恥ずかしいかもしれません) xterm は, 日本語などの入出力も可能になっています。 入力には従来の kinput2 などがそのまま利用できます。 もちろん,Cygwin の xterm も例外ではありません (くだんの数日間を除く)。 ただし,Cygwin 上の xterm は,疑似端末の実現仕様と xterm のフロントエンドの不整合からか(?),日本語の出力エンコーディングとして実質 UTF-8 しか使えないようです。

*2 思わず使ってしまいましたが,gzcat は zcat の別名です。 Mac OS X 等では標準で用意されていますが,Cygwin にはありませんから,筆者は下記のようにしています。

01:/usr/local/bin$ ln -s /bin/zcat gzcat

昔話をすれば,伝統的な Unix では zcat は compress コマンドの標準出力版でした。後から, より高い圧縮率の GNU gzip がやって来て zcat を襲名したわけですが, 共存可能な名前として gzcat という別名も用意していました。 Mac OS X は先進性とともに伝統の継承を重視してか zcat の別名として gzcat を用意していますが, Cygwin は多くの Linux ディストリビューションと同じく gzcat を捨てています。

なお,GNU tar では,gzcat をパイプでつなげるまでもなく, z オプションを加えることで直接 gz ファイルを展開できます。 最近では GNU tar でない環境も珍しくなってきましたし, 従来,パイプ方式の根拠となっていた x オプションと c オプションの取り違えによる事故に対する防止策も GNU tar に織り込まれていますから,こちらをおぼえておいてもよいでしょう。

01:/cygdrive/c$ tar xzvf Meadow-1.15-i386.tar.gz

*3 Meadow 1.15 のインストールに関しては 川原氏のページ が参考になります。 筆者は氏のフォント設定に一部ならって,太字フォントに Andale Mono を使用しています。 アーカイブ 1_15-dot-emacs.tar.gz 内の .emacs の 33 行目がその設定です。 Andale Mono がインストールされていない環境ではクーリエ体が代替で使われます。

*4 たとえば下記のように展開します。

01:/cygdrive/c/Meadow$ tar xzvf 1_15-dot-emacs.tar.gz
01:/cygdrive/c/Meadow$ tar xzvf site-lisp.tar.gz
目次へ戻る


Copyright (c) 2004, 2005 Oki Software Co., Ltd.