============================================== 2002.06.03 発行 =========
         極私的 Emacs カスタマイズ紹介マガヂン
            Emacs をわたし色に染めて♪
------------------------------------------------------------------------
                       第 23 回 いまさらながら mh-e
------------------------------------------------------------------------
※あなたのカスタマイズをぜひ教えてください。一般的なものから、他の人は
 絶対にしないような「外道」なものまで、何でも結構です。

※解除の方法は、このメールの末尾をごらんください。
========================================================================

	おひさしぶりです、でるもんた・いいじまです。

	仕事のほうがやっと 4 月ごろに一段落したので、発行のほうを再開
	したいと思います。その後、精神的にはむしろ追い詰められていたの
	ですが、運よくというべきか、いろいろあってちょうど休養の機会を
	得たので、この機会に発行してしまおうと思っています。

	こんなことを書くと、「メールマガヂンを発行する気力があるなら働けよ」
	とお叱りを受けそうですが、精神面のサポートをしていただいている専門
	家のかたからも「気分転換のために趣味の活動はどんどんしなさい」と
	言われていますので、会社には半分申し訳ないと思いながらも、発行したい
	と思います。

☆東大 ECC のユーザーの方へ☆

	この春に、東大 ECC の UNIX 環境は大きく変化しました。
	特に Emacs 関連では、mule というコマンド名で起動する標準の Emacs が、
	Emacs 20.7 になっています(日本語入力には Wnn6+Tamago4 を使用)。
	Emacs 20 以降では、当マガヂンの内容がそのままでは通用しない部分が
	少なからずありますので、ご注意ください。

	なお、どうしても旧来の Mule 2.3@19.34 が必要な場合は、omule という
	コマンドで起動できるようになっています。

☆今週のお題☆

	今週のお題は「いまさらながら mh-e」です。

	いまどき、Emacs 上でメールを書くといえば、Mew、SEMI-Gnus、Wanderlust
	といったパッケージが思い浮かびます。しかし当方、大学を卒業して使い
	はじめたプロバイダ(www.ht.sakura.ne.jp)の UNIX 環境にはなんと、
	Emacs 上で動くメールソフトが、mh-e しか入っていませんでした。

	【補足】RMAIL というのもあることはあるのですが、こちらは日本語の
	    ことをまったく考慮してくれない(たとえば、Shift_JIS と
	    EUC のメールが混在するだけで文字化けを起こしますし、もっと
	    悪い条件が重なると、メール全体が回復しがたいエラーを起こす
	    ことがあります)ので、日本人にはお勧めしていません。

	まあ、このサーバーは本業が WWW サーバーで、UNIX へのログイン自体が
	おまけという位置付けなので仕方がないといえば仕方がないのですが、
	出先(インターネットカフェなど)からメールを書く際には不便です。
	そこで、出先からも UNIX サーバーにログインしてまともなメールが
	書けるように、mh-e の設定をしよう、というのが今回のお題です。

☆From: の設定☆

	まず手始めに行ったのが、From: の設定です。

	mh-e では、メールを送信する際、chfn コマンドでシステムに(正確には、
	/etc/passwd に)登録されている名前を使用します。つまり、chfn コマン
	ドで自分の名前を登録しておけば、自動的に

		From: IIJIMA Hiromitsu <delmonta@ht.sakura.ne.jp>

	のように From: フィールドを書いてくれます。

	しかしながら、私の使っているサーバーでは、おそらくセキュリティ上の
	理由でしょうが、

	% ls -l /etc/passwd
	-rw-r--r--  1 root  wheel  10292 May 14 10:48 /etc/passwd

	%  ls -l /usr/bin/chfn
	-r-xr-xr-x  6 root  wheel  28932 Dec 29  1999 /usr/bin/chfn

	となっていて、chfn コマンドは使えなくなっています。その割に、

	% grep delmonta /etc/passwd
	delmonta:*:1177:1000:Users:/home/./delmonta:/usr/bin/tcsh

	となっているので、そのまま mh-e でメールを書くと、

		From: Users <delmonta@ht.sakura.ne.jp>

	となってしまい、あまりうれしくありません。

	幸い、mh-e では、メール作成時に自前で From: ヘッダを加筆すれば
	そちらが優先されるので、毎回手作業で

		From: IIJIMA Hiromitsu <delmonta@ht.sakura.ne.jp>

	と書けば、問題は解決します。しかしながら、面倒です。

	そこで、mh-compose-letter-function という変数を使います。
	この変数に自作の関数名を設定しておけば、M-x mh-smail でメール作成
	モードに入ったときに、その関数を自動的に呼び出してくれます。

	そこで私は、次のように記述しました。

	(setq mh-compose-letter-function 'delmonta-compose-letter-function)

	(defun delmonta-compose-letter-function (szTo szSubject szCc)
		(interactive)
		(goto-char (point-min))
		(insert
			"From: IIJIMA Hiromitsu <delmonta@ht.sakura.ne.jp>\n"
			"Content-type: text/plain; charset=iso-2022-jp\n"
			"Content-transfer-encoding: 7bit\n"
		)
		(goto-char (point-max))
	)

	こうすれば、メール作成時に、必要なヘッダを自動的に挿入してくれる
	ようになります。

☆文字コードの設定☆

	さて、mh-e でメールを書くと、自動的に文字コードが JIS になります。

	それはいいのですが、Mule 2.3 の場合は set-file-coding-system
	(C-x C-k f)、Emacs 20 以降では set-buffer-file-coding-system
	(C-x RET k)で明示的に JIS 以外を指定しても、強制的に JIS で送ら
	れてしまいます。これでは、意図的に JIS 以外のメールを送りたい場合に
	不便です。

	これは、/usr/local/share/emacs/19.34/lisp/mule-init.el というファ
	イルに

	(setq mh-before-send-letter-hook
		'(lambda () (set-file-coding-system *junet*)))

	のように書かれているのが原因です。

	【補足】この mule-init.el というファイルは、Emacs の起動時ではなく、
	    ソースコードから Emacs をコンパイルするときに一度だけ読み
	    込まれるファイルです。したがって、このファイルを書き換えても
	    何の効果もありません。

	そこで、

		(setq mh-before-send-letter-hook nil)

	と指定して、これをつぶしてしまいます。

	しかしこれだけでは、Emacs のデフォルトの文字コードを EUC や Shift_JIS
	に設定している場合には、EUC や Shift_JIS のままでメールを送ってしまう
	ことになります。そこで、さきほどの delmonta-compose-letter-function
	に加筆して、次のようにします。これで、M-x mh-smail でメール作成画面を
	開いたときには、デフォルトで JIS コードになるようになります。

	(defun delmonta-compose-letter-function (szTo szSubject szCc)
		(interactive)
		(goto-char (point-min))
		(insert
			"From: IIJIMA Hiromitsu <delmonta@ht.sakura.ne.jp>\n"
			"Content-type: text/plain; charset=iso-2022-jp\n"
			"Content-transfer-encoding: 7bit\n"
		)
		(goto-char (point-max))

		(cond
		((boundp '*euc-japan*)  ; Emacs 19
			(set-file-coding-system *iso-2022-jp*)
		)((commandp 'set-language-environment)
			(set-buffer-file-coding-system 'iso-2022-jp-unix)
		))
	)

	cond 文(後述)で場合分けしているのは、Emacs のバージョンによって、
	文字コードの設定の仕方が違うからです。

	【余談】以上のような設定をしない生の mh-e では、「書きかけのメール
	    ファイルを EUC で保存し、それを読み込んで、編集せずにその
	    まま送信した場合に、EUC のまま送信してしまう」というバグが
	    あります。これは、メールの送信(M-x mh-send-letter、標準の
	    キー操作では C-c C-c)の際に「メール原稿を上書き保存する」
	    という作業が行われ、このときに JIS コードに変換して保存され
	    るのですが、読み込んでから編集せずに送信した場合、Emacs が
	    「編集されていないので、上書き保存の必要なし」と判断する
	    からです。

	    この対策として、mh-before-send-letter-hook で「ファイルは
	    読み込み後、編集された」というフラグを立てる、という方法が
	    あるのですが、今回の飯嶋式カスタマイズでは、「書きかけの
	    メールファイルは最初から EUC ではなく JIS になるようにして
	    おく」「それをあえて EUC に変更して保存した場合は、その
	    操作をした人間の責任」という考え方に立って、特に対策はして
	    いません。

☆後日補足 - From: や Subject: に全角文字を使うことについて☆

	ご承知のように、通常、メールの From: や Subject: に全角文字を書く
	場合には、「=?iso-2022-jp?B?…」のようにエンコードすることになって
	います。

	しかしながら、mh-e では、tiny-mime などのパッケージを入れない限り、
	From: や Subject: に全角文字を書くと、上記のように符号化せずに
	そのまま JIS コードで送ってしまいます。ご注意ください。

☆補足 - cond 文☆

	さてここで、cond という構文が出てきました。実は cond 文は Emacs
	Lisp では非常に基礎的な構文のひとつで、今までこのメールマガヂンで
	取り上げてこなかったのが不思議なくらいなのですが、ここで説明を
	しておこうと思います。

	cond 文は、要するにほかのプログラミング言語における if - elseif -
	else 文や case 文のようなものだと思っていただければ結構です。

	cond 文の一般形は、次のようになります。

		(cond
			(条件1 実行文1a 実行文1b ....)
			(条件2 実行文2a 実行文2b ....)
				:
			(条件N 実行文Na 実行文Nb ....)
		)

	これは、C 言語風に書くと次のようになります:

	if (条件1)
	{
		実行文1a 実行文1b ....
	}
	else if (条件2)
	{
		実行文2a 実行文2b ....
	}
	:
	else if (条件N)
	{
		実行文Na 実行文Nb ....
	}


	これを書くと、まず「条件1」が評価されます。その結果が真(nil 以外の
	値になる)ならば、「実行文1a 実行文1b ....」が実行されます。

	「条件1」が nil ならば、次に「条件2」が評価され、それが真ならば
	「実行文2a 実行文2b ....」が実行されます。「条件2」も nil ならば
	次の条件文が評価される、という具合に、どれかひとつの条件が真になる
	まで、順番に評価されていきます。

	どの条件も nil になった場合は特にエラーにはなりませんが、いちばん
	最後に

		(t 実行文Ta 実行文Tb ....)

	と書いておくと、それまでのどの条件も nil になった場合に、
	「実行文Ta 実行文Tb ....」が実行されます。これは、一般のプログラ
	ミング言語での、if - elseif 節の最後の else {.....} の部分に相当
	すると考えるといいでしょう。

	if と cond の使い分けですが、どちらを使ってもかまいません。ただ、
	if の場合は、条件が真のときに複数の文を実行するには progn を使う
	必要がありますので、特に、elseif に相当する部分があるような場合には、
	cond のほうが便利だといえるでしょう。

☆次回予告☆

	次回は、また「小ネタ」を探してこようかと思っています。
	もしくは、今までの発行分の訂正・補遺集(web 版には気づいた時点で
	訂正を入れていますが、それをまとめてメールマガジンでも配信)を
	しようと思います。

	何もネタがなければ文法解説をしますが、前回(第 21 回)から 2 年も
	経っていますので、その際にはまず第 21 回の再送からはじめようと
	思います。

	それではまた。

========================================================================
極私的 Emacs カスタマイズ紹介マガジン Emacs をわたし色に染めて♪

☆発行人☆

        でるもんた・いいじま <delmonta@ht.sakura.ne.jp>
                        http://www.ht.sakura.ne.jp/~delmonta/emacs/

                ※このメールマガジンで取り上げてほしいテーマ、ご意見など
                 ありましたら、上のメールアドレスまでお気軽にどうぞ。

☆配信☆
        このメールマガジンは、「インターネットの本屋さん・まぐまぐ」を
        利用して配信しています。
                http://www.mag2.com     (マガジン ID=0000013484)

☆バックナンバー・登録解除・メールアドレス変更は☆

        上記のホームページまでどうぞ。
        なお、手動での登録解除は行っておりませんのでご了承下さい。
=========================================================================

Copyright © IIJIMA Hiromitsu aka Delmonta, 2016/03/10 15:09 JST
これは「古文書」です。 古くなった情報も原則未修正で保存していますのでご注意ください。

古文書本館トップ | 電脳外道学会