tm-view 7.79 Reference Manual（日本語版）

tm-view 7.79 Reference Manual（日本語版）
***********************************

This file documents tm-view, a MIME Viewer for GNU Emacs.

GNU Emacs 用の MIME Viewer である `tm-view' について説明します。

tm-view って何？
************

tm-view は GNU Emacs で動作する汎用的な MIME viewer です。

tm-view は mime/viewer-mode (mime/viewer-mode) という MIME message を見るための major-mode を MUA ((tm-ja)MUA) に対して提供します。MUA の設計者はこの mode を利用することでその MUA に MIME 機能を付加することができます。

tm-view は MIME message を閲覧するための user interface の核であり、その上で各 content-type ((tm-ja)content-type) を扱うための method (method) と呼ばれるプログラムを動作させます。また、 MIME message の表示の仕方を決める filter (Two buffers for an article) と呼ばれるプログラムを起動時に呼び出します。method と filter を tm-view に組み込む事によって、mime/viewer-mode でさまざまな MIME content-type を扱う事ができます。

mime/viewer-mode の画面構成
**********************

mime/viewer-mode (mime/viewer-mode) では各 part に対して

     	[content-button]
     	(content-header)

     	(content-body)
     	(content-separator)

という情報を表示します。これらは条件に従って design を変更したり、表示を抑制することができます。

以下に、表示例を示します。

     From: morioka@jaist.ac.jp (守岡 知彦 / MORIOKA Tomohiko)
     Subject: Re: 質問？
     Newsgroups: zxr.message.mime
     Date: 22 Oct 93 11:02:44
     Mime-Version: 1.0
     Organization: Japan Advanced Institute of Science and Technology,
             Ishikawa, Japan

     [1  (text/plain)]
       MIME-Edit mode における、MIME message の作り方。

       C-c C-x ? を押すと help が出てくる。

     C-c C-x C-t	insert a text message.
     C-c C-x TAB	insert a (binary) file.
     C-c C-x C-e	insert a reference to external body.
     C-c C-x C-v	insert a voice message.
     C-c C-x C-y	insert a mail or news message.
     C-c C-x RET	insert a mail message.
     C-c C-x C-s	insert a signature file at end.
     C-c C-x t	insert a new MIME tag.
     C-c C-x a	enclose as multipart/alternative.
     C-c C-x p	enclose as multipart/parallel.
     C-c C-x m	enclose as multipart/mixed.
     C-c C-x d	enclose as multipart/digest.
     C-c C-x s	enclose as PGP signed.
     C-c C-x e	enclose as PGP encrypted.
     C-c C-x C-k	insert PGP public key.
     C-c C-x C-p	preview editing MIME message.
     ...

     って訳で、C-c C-x C-i を押して、挿入したい binary file を指定します。

       binary file の MIME encoding には、普通、Base64 を指定します。

     [2  (image/gif)]

     [3  (text/plain)]

       こんな風に、絵入り message のでき上がり。

     〓〓〓〓〓〓〓〓〓〓〓 ロシアン・ティーを一杯。 〓〓〓〓〓〓〓〓〓〓〓
     〓〓〓〓〓  ☆ ジャムではなくマーマレードでもなく蜂蜜で ☆  〓〓〓〓〓
     〓〓〓〓〓         МОРいОКА  ТОМОХИКО         〓〓〓〓〓
     〓〓〓〓〓〓〓  Internet E-mail: <morioka@jaist.ac.jp>  〓〓〓〓〓〓〓

content-button
==============

content-button は part の先頭にあって、その part に関する大まかな情報を表示する部分です。

標準では

             [1.3 test (text/plain)]

のような感じに表示されます。

最初の数字は message 中のこの part の位置を節番号のように表したもので、 content-number と呼びます。

２番目の文字列は表題を表します。この情報は、

 1. Content-Type field ((tm-ja)Content-Type field) の name paramater もしくは x-name parameter に書かれた file 名

 2. Content-Description field ((tm-ja)Content-Description field) もしくは Subject field に書かれた表題

 3. uuencode の場合の file 名

から作ります。どれも存在しない場合は空白が表示されます。

３番目の括弧の中の情報はその part の content-type/subtype を表します。非 MIME part の場合、nil が表示されます。

この content-button は content-header (content-header), content-body (content-body) を表示しない場合、icon のような役割を果たします。例えば、

             [2  (image/gif)]

の上で v を押せばここに入っている絵が表示されます。

また、mouse 操作が可能な場合、content-button を第２ボタン（3 button mouse の場合、中央のボタン）で押せば、同様にその絵が表示されます。 (mime/viewer-mode)

ところで、content-button を表示するのは鬱陶しい場合があるので、 content-button の表示を条件によって抑制することができます。

 -- Variable: mime-viewer/content-button-ignored-ctype-list

     content-button を表示しない content-type を要素とする list.

content-header
==============

content-header はある part の header を表示する部分です。しかし、全ての part の content-header を表示するのは鬱陶しいので、以下のような mechanism によって表示するかしないかを決めています。

ある part の reversed-content-number を関数 mime-viewer/header-visible-p に与えた時の返り値が t になる場合、その part の content-header が表示されます。

この判定関数は、一番上の part でなく、その part の親の content-type ((tm-ja)content-type) が変数 mime-viewer/childrens-header-showing-Content-Type-list で指定されている場合に t を返します。

この条件を変えたい場合は、この関数を再定義して下さい。但し、標準では、変数 mime-viewer/childrens-header-showing-Content-Type-list を参照しますが、再定義した場合、この変数の有効性は保証されないので注意して下さい。

content-header が表示される場合、content-header は content-header-filter と呼ばれる program によって整形されます。 content-header-filter は raw-article-buffer (raw-article-buffer) の major-mode を key として変数 mime-viewer/content-header-filter-alist から探されます。もし、 content-header-filter が見つからなかった場合、関数 mime-viewer/default-content-header-filter が呼ばれます。

 -- Variable: mime-viewer/childrens-header-showing-Content-Type-list

     ある part の子に当たる content の content-header を表示すべき Content-Type を収めた list. 既定値は "message/rfc822" である。

     この変数は関数 mime-viewer/header-visible-p によって参照される。

 -- Function: mime-viewer/header-visible-p rcnum cinfo &optional ctype

     content-info CINFO 中の reversed-content-number が RCNUM である part の header が表示される場合、t を返す。その part の content-type があらかじめわかっている場合、CTYPE に引数として渡すことができる。

 -- Variable: mime-viewer/content-header-filter-alist

     raw-article-buffer の major-mode を key とした連想リストで、値部には content-header-filter が入っている。

 -- Function: mime-viewer/default-content-header-filter

     ある part の content-header を表示すべき時、変数 mime-viewer/content-header-filter-alist の中に content-header-filter が見つからなかった場合に呼び出される。

     変数 mime-viewer/ignored-field-regexp を参照する。

 -- Variable: mime-viewer/ignored-field-list

     content-header を表示する時に、表示しない field を指定する。

     正規表現の list になっており、この値を元に変数 mime-viewer/ignored-field-regexp が作られる。

     この変数は直接操作せず、関数 tm:add-fields や tm:delete-fields を使って操作する。

content-body
============

content-body は part の内容を表示する部分です。

全ての part の内容を表示できるとは限らないし、また、表示したくない part も存在するので、以下のような方法で表示するかしないかを決めています。

ある part の content-body を表示するかどうかは、関数 mime-viewer/body-visible-p が t になるかどうかで決まります。標準では、ある part の content-type が変数 mime-viewer/default-showing-Content-Type-list に設定されている時に表示されます。

ある part の content-body が表示される時、preview buffer には part の内容を content-filter と呼ばれる program によって整形されたものが表示されます。呼ばれる content-filter は raw-article-buffer (raw-article-buffer) の major-mode を key として変数 mime-viewer/content-filter-alist から探されます。もし、この変数に登録されていなかった場合、関数 mime-viewer/default-content-filter が呼ばれます。

 -- Variable: mime-viewer/default-showing-Content-Type-list

     content-body を表示すべき content-type を要素とする list.

 -- Function: mime-viewer/body-visible-p rcnum cinfo &optional ctype

     reversed-content-number が RCNUM である part が表示される場合、 t を返す。その part の content-type があらかじめわかっている場合、 CTYPE に引数として渡すことができる。

 -- Variable: mime-viewer/content-filter-alist

     raw-article-buffer の major-mode を key とした連想リストで、値部には content-filter が入っている。

 -- Function: mime-viewer/default-content-filter rcnum cinfo ctype params subj

     ある part の content-body を表示すべき時、変数 mime-viewer/content-filter-alist の中に content-filter が見つからなかった場合に呼び出される。

     標準では何もしない。

content-separator
=================

content-separator は part の一番最後に part 間の境目を明らかにするために表示されます。

content-separator は関数 mime-viewer/default-content-separatorによって表示されます。標準では、content-header も content-body も表示されない場合のみ、改行を表示します。

content-separator の設定を変更したい場合は、この関数を再定義して下さい。

 -- Function: mime-viewer/default-content-separator rcnum cinfo ctype params subj

     content-number が CNUM である part の content-separator を表示する。標準では、content-header も content-body も表示されない場合のみ、改行を表示する。

mime/viewer-mode での操作
*********************

mime/viewer-mode には以下の機能があります。

u
     上の part に戻る（message の一番上の part でこれを行なうと Summary mode に戻る (*1)）

p
     前の part に移動する

n
     次の part に移動する

SPC
     scroll up する

M-SPC
     scroll down する

DEL
     scroll down する

RET
     次の行に移動する

M-RET
     前の行に移動する

M-RET
     前の行に移動する

<
     message の先頭に移動する

>
     message の末尾に移動する

v
     part を再生する (*2)

e
     part から file を取り出す (*2)

C-c C-p
     part を印刷する (*2)

f
     message 中の X-Face を表示する

mouse-button-2
     preview-buffer 中の mouse button を起動する

     content-button を押せば、その part が再生される(*2)

     URL-button を押せば、その WWW browser が起動される

[注意]

     (*1) tm-MUA で tm-view の設定をしていない場合、Summary mode には戻りません。

     (*2) 実際の動作は対応する method に依ります。

再生処理の実現
*******

mime/viewer-mode では、各 part に対して、play (v), extract (e), print (C-c C-p) という操作を行なうことができます。こうした操作のことを『（part に対する）decode 操作』と呼ぶことにします。また、 play, extract, print という decode 操作の種類のことを decoding-mode と呼ぶことにします。

decode 操作が行なわれた時、その part の content-type ((tm-ja)content-type) などの条件やその場の環境に応じて実際にその操作を実行する手続きが呼ばれます。この手続きのことを method と呼びます。

method には、Emacs Lisp で書かれた 内部 method と、外部 program で実現された 外部 method があります。内部 method は Emacs の機能を使ってきめ細かい処理を行なうことができます。外部 method は非同期プロセス呼び出しを使って実現されているので、実行中待たされずにすみます。このため、静止画や動画などの巨大な data を再生するのに良いでしょう。

part の再生に関する条件の設定
=================

tm-view は decode 操作が行なわれると、変数 mime/content-decoding-condition からその時の条件に合致した method を捜し出して、それを呼び出します。

変数 mime/content-decoding-condition は

             (条件1 条件2 ...)

という形をした list で、各条件は

             ((field-type_1 . value_1)
              (field-type_2 . value_2)
              ...)

という形の連想 list になっています。

例えば、text/plain ((tm-ja)text/plain) の時、tm-plain を起動する時、

             ((type . "text/plain")
              (method "tm-plain" nil 'file 'type 'encoding 'mode 'name))

という条件を書きます。この method の value 部の書式については後で詳しく述べます。

この条件は content-type ((tm-ja)content-type) が text/plain である part なら全ての decoding-mode で有効です。しかし、

             ((type . "text/plain")
              (method "tm-plain" nil 'file 'type 'encoding 'mode 'name)
              (mode . "play"))

なら、play mode の時しか有効になりません。

逆に、

             ((method "metamail" t "-m" "tm" "-x" "-d" "-z" "-e" 'file)
              (mode . "play"))

なら、全ての content-type の play mode で有効になります。

こうして各条件を前から見て行き、最初に有効になった条件が実行されます。

method の値部の書式
-------------

decode-condition の method field は

             (method . SYMBOL)

か

             (method  文字列  FLAG  引数1  引数2  ...)

という形をしています。

前者は内部 method を指定するための形式で、decode 操作が行なわれた時、 SYMBOL という関数が関数呼び出しによって内部 method として呼び出されます。

後者は外部 method を指定するための形式で、decode 操作が行なわれた時、文字列で指定された外部 program が非同期プロセス呼び出しによって外部 method として呼び出されます。

外部 method を指定する場合の method field の書式は以下の通りです。

文字列
     外部 method の名前

FLAG
     t なら content-header も外部 method に渡す。

     nil なら content-body のみを渡す。

引数列
     外部 method の引数

また、外部 method の引数は次のような形式で書きます。

文字列
     その文字列を渡す

'SYMBOL
     SYMBOL を key とした decoding-condition の値を渡す

'文字列
     文字列を key とした decoding-condition の値を渡す

'SYMBOL で指定できるものには、

'file
     part の情報を渡すための file 名

'type
     Content-Type field の content-type/subtype

'encoding
     Content-Transfer-Encoding field の field body

'mode
     decoding-mode

'name
     file に落す場合の file 名

などがあり、'文字列 では Content-Type field の parameter の値が指定できます。

decoding-condition の例
---------------------

以下に decoding-condition の設定例を示します。

     (defvar mime/content-decoding-condition
       '(((type . "text/plain")
          (method "tm-plain" nil 'file 'type 'encoding 'mode 'name))
         ((type . "text/x-latex")
          (method "tm-latex" nil 'file 'type 'encoding 'mode 'name))
         ((type . "audio/basic")
          (method "tm-au"    nil 'file 'type 'encoding 'mode 'name))
         ((type . "image/gif")
          (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
         ((type . "image/jpeg")
          (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
         ((type . "image/tiff")
          (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
         ((type . "image/x-tiff")
          (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
         ((type . "image/x-xbm")
          (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
         ((type . "image/x-pic")
          (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
         ((type . "video/mpeg")`
          (method "tm-mpeg"  nil 'file 'type 'encoding 'mode 'name))
         ((type . "application/octet-stream")
          (method "tm-file"  nil 'file 'type 'encoding 'mode 'name))
         ((type . "message/partial")
          (method . mime/decode-message/partial-region))
         ((method "metamail" t
                  "-m" "tm" "-x" "-d" "-z" "-e" 'file)(mode . "play"))
         ))

例えば、「全部 metamail 使うんや」という場合、

     (setq mime/content-decoding-condition
           '(
             ((method "metamail" t "-m" "tm" "-x" "-d" "-z" "-e" 'file))
            ))

とすれば OK です。

工夫すれば、かなり複雑な条件が書けるでしょう。

以下に、decoding-condition を設定するための有用な関数を紹介します。

 -- Function: set-atype symbol alist

     SYMBOL に条件 ALIST を追加します。

     [例]

               (set-atype 'mime/content-decoding-condition
               	   '((type . "message/external-body")
               	     ("access-type" . "anon-ftp")
               	     (method . mime/decode-message/external-ftp)
               	     ))

環境変数
====

以下に tm-view の標準 method が参照する環境変数を示します。

TM_TMP_DIR
     一時的に作成される file や file 出力する場合の default の出力先として用いられる directory を指定する。省略された場合、/tmp/ が用いられる。

VIDEO_DITHER
     mpeg_play での dither のかけ方を指定する。既定値は `gray'.

TM_WWW_BROWSER
     WWW browser を指定する。既定値は `netscape'.

raw-article-buffer と preview-buffer
***********************************

tm-view は、MIME 処理を行なう前の生の message が入っている raw-article-buffer とその内容を user に簡潔に表示し、user が操作するための preview-buffer という２つの buffer を管理します。 raw-article-buffer の major-mode はもともとの MUA の article 表示用の major-mode であり、preview-buffer の major-mode は mime/viewer-mode (mime/viewer-mode) となります。

mime/viewer-mode を実行すると、tm-view はまず raw-article-buffer の内容を解析し、その message の構造を raw-article-buffer の buffer local 変数 mime::article/content-info に記録します。

次に、この結果を元に raw-article-buffer に対応する preview-buffer を作ります。この際、content-type に応じて、part 単位で header や body を加工することができます。この header を加工するプログラムを header-filter (content-header), body を加工するプログラムを content-filter (content-body) と呼び、これらを総称して filter と呼びます。

preview-buffer を作成する時に、message の表示上の構造を記録した preview-buffer の buffer local 変数 mime::preview/content-list が作られます。tm-view は raw-article-buffer 上の mime::article/content-info と preview-buffer 上の mime::preview/content-list を用いて message を管理します。

[注意]

     この説明書では、Content-Type field の content-type/subtype のことを称して ``content-type'' と呼びます。

raw-article-buffer の buffer local 変数
====================================

Structure mime::content-info rcnum point-min point-max type parameters encoding children

raw-article-buffer における MIME part に関する情報を格納するための構造体。単に content-info とも呼ぶ。

この構造体を参照するには、mime::content-info/スロット名 という content-info を引数にとる関数を用いる。

この構造体のスロットは以下の通りである：

rcnum
     ``reversed content-number'' (list)

point-min
     raw-article-buffer における先頭 point

point-max
     raw-article-buffer における末尾 point

type
     content-type/sub-type（文字列、または、nil）

parameters
     Content-Type field の parameter （連想 list）

encoding
     Content-Transfer-Encoding（文字列、または、nil）

children
     この part に含まれる part（content-info の list）

ある part が multipart もしくは message/rfc822 などの別の part を含むような part であった場合、CHILDREN に別の part の content-info が含まれる事によって、content-info は木構造になる。

 -- Variable: mime::article/content-info

     raw-article-buffer を MIME message として解析した結果 (content-info)

 -- Variable: mime::article/preview-buffer

     raw-article-buffer に対応する preview-buffer.

 -- Function: mime-article/point-content-number point &optional cinfo

     content-info CINFO で管理される領域において、POINT に対応する content-number を返す。

     CINFO が省略された場合は、mime::article/content-infoが用いられる。

 -- Function: mime-article/rcnum-to-cinfo rcnum &optional cinfo

     content-info CINFO で管理される領域において、 reversed-content-number RCNUM に対応する content-info を返す。

     CINFO が省略された場合は、mime::article/content-info が用いられる。

 -- Function: mime-article/cnum-to-cinfo rcnum &optional cinfo

     content-info CINFO で管理される領域において、content-number RCNUM に対応する content-info を返す。

     CINFO が省略された場合は、mime::article/content-info が用いられる。

 -- Function: mime/flatten-content-info &optional cinfo

     content-info CINFO 中に納められた全 part の content-info の list を返す。

     CINFO が省略された場合は、mime::article/content-info が用いられる。

preview-buffer の buffer local 変数
================================

 -- Variable: mime::preview/mother-buffer

     この preview-buffer の親に相当する buffer.

Structure mime::preview-content-info point-min point-max buffer content-info

preview-buffer における MIME content に関する情報を格納するための構造体。単に preview-content-info とも呼ぶ。

この構造体を参照するには、mime::content-info/スロット名 という content-info を引数にとる関数を用いる。

この構造体のスロットは以下の通りである。

point-min
     preview-buffer における先頭 point

point-max
     preview-buffer における末尾 point

buffer
     この part に対応する raw-article-buffer

content-info
     この part に対応する content-info

 -- Variable: mime::preview/content-list

     この preview-buffer の構造をあらわす preview-content-info の list.

 -- Variable: mime::preview/article-buffer

     この preview-buffer に対応する raw-article-buffer.

 -- Variable: mime::preview/original-major-mode

     この preview-buffer のもとになった buffer の major-mode.

 -- Variable: mime::preview/original-window-configuration

     mime/viewer-mode を実行して、この preview-buffer 作る直前の window-configuration.

 -- Function: mime-preview/point-pcinfo point &optional pcl

     preview-content-info PCL で管理される preview-buffer 中の領域において、POINT に対応する part の preview-content-info を返す。

     CINFO が省略された場合は、mime::preview/content-list が用いられる。

MIME message の decode に関する関数
****************************

tm-view の提供する関数を各 MUA ((tm-ja)MUA) に組み込む事によって、各 MUA に MIME 再生機能を付加する事ができます。

tm-view が各 MUA に提供する関数は、MIME preview を行うための関数 mime/viewer-mode と encoded-word ((tm-ja)encoded-word) を decode するための関数群です。

MIME preview に関する関数
===================

Command mime/viewer-mode &optional  mother ctl encoding ibuf obuf mother-keymap

IBUF を MIME message として解析して、その内容を閲覧するための preview-buffer を OBUF に作成し、mime/viewer-mode (mime/viewer-mode)に入ります。

IBUF が省略された場合、current buffer を用います。

MOTHER は、解析の対象とする raw-article-buffer が message/partial 形式の分割された message を結合して作成した場合などにおける元の buffer を指定するために使います。

CTL は Content-Type field ((tm-ja)Content-Type field) の field-body を mime/Content-Type の出力正式にしたものを入れます。この引数がある場合、raw-article-buffer の Content-Type field よりもこの引数を優先します。

ENCODING は Content-Transfer-Encoding field の field-body を入れます。この引数がある場合、raw-article-buffer の Content-Transfer-Encoding field よりもこの引数を優先します。

MOTHER-KEYMAP が指定された場合、mime/viewer-mode の keymap はこの keymap に加えたものとなります。

encoded-word の復元
================

tm-view は RFC 1522 で規定された encoded-word ((tm-ja)encoded-word) を decode するための関数を持っています。

[Memo]

     旧 tiny-mime.el にあった RFC 1522 encoded-word を decode するための関数群は tm-view に引き継がれました。

Command mime/decode-message-header

current buffer の message header 中の encoded-word を decode します。

壊れていたり、不正だったり、decode できない MIME charset ((tm-ja)MIME charset) が用いられている encoded-word は decode されずそのまま残されます。

Command mime-eword/decode-region start end  &optional  unfolding must-unfold

START と END で囲まれた領域中の encoded-word を decode します。

壊れていたり、不正だったり、decode できない MIME charset ((tm-ja)MIME charset) が用いられている encoded-word は decode されずそのまま残されます。

UNFOLDING が non-nil の場合、折り返された field を unfolding します。

MUST-FOLD が non-nil の場合、encoded-word の decode 結果に折り返し、もしくは、改行が含まれている場合、unfold し、改行を除きます。

 -- Function: mime-eword/decode-string string &optional must-unfold

     STRING 中の encoded-word を decode した文字列を返します。

     壊れていたり、不正だったり、decode できない MIME charset ((tm-ja)MIME charset) が用いられている encoded-word は decode されずそのまま出力されます。

     STRING が折り返されている場合、encoded-word を decode する前に STRING は unfold されます。

     MUST-FOLD が non-nil の場合、encoded-word の decode 結果に折り返し、もしくは、改行が含まれていても、それらは unfold され単体の改行文字も取り除かれます。

謝辞
**

最初に、私が tm-view を最初に作った時に、厳しい注文と有益な助言を下さり、その設計に多大な与えられた升谷保博さんに感謝します。

次に、tm-ew-d.el と mel-b.el の前身に当たるmime.el を書き、その配布と改造をお許し下さった榎並嗣智さんに感謝します。

また、LaTeX 用の内部 method と message/partial 用の自動結合 method を提供して下さった岡部寿男さん、tar archive 用の内部 method を提供して下さった上野博さんに感謝します。

最後に、beta test に協力して下さった日本語版、英語版双方の tm mailing list の member に感謝します。