-*-tm manual-*-
tm-view manual

GNU Emacs で動作する汎用的な MIME viewer kernel の `tm-view' について説明します。

tm-view とは

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

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

tm-view は、MIME 処理を行なう前の生の message が入っている各 MUA の article buffer とその内容を user に簡潔に表示するための preview buffer という２つの buffer を管理します。

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

次に、この結果を元に article buffer に対応する preview buffer を作ります。この際、Content-Type に応じて、content 単位で header や body を加工することができます。

mime/viewer-mode を実行した結果できる preview buffer 上で user は、外部 vewer の起動・file 抽出・印刷といった decode 操作を行なうことができます。

［注意］

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

mime/viewer-mode の起動の仕方

Command mime/viewer-mode &optional mother ctl encoding

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

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

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

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

mime/viewer-mode の command

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

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

p
     前の content に移動する

n
     次の content に移動する

SPC
     scroll up する

M-SPC
     scroll down する

DEL
     scroll down する

RET
     次の行に移動する

M-RET
     前の行に移動する

v
     content を再生する           (*2)

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

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

［注意］

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

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

preview buffer の画面構成

preview buffer では各 content に対して

     	[content-subject]
     	(content-header)

     	(content-body)
     	(content-separator)

という情報を表示します。これらは content-type 毎に design を変更したり、表示を抑制することができます。

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

     From: 守岡 知彦 (MORIOKA Tomohiko) <morioka@jaist.ac.jp>
     Newsgroups: zxr.comp.emacs.tm-english
     Subject: tm6.63.tar.gz
     Date: Mon, 26 Jun 1995 17:39:50 JST
     Organization: Chamonix, JAIST, Tatsunokuchi, Ishikawa, Japan
     Reply-To: tm-eng@chamonix.jaist.ac.jp
     To: tm-eng@chamonix.jaist.ac.jp
     In-Reply-To: Your message of "Sun, 25 Jun 1995 23:20:49 MST"
     X-Mua: mh-e 4.1 + tm 6.63 / Mule 2.2 ( 若紫 ) PL02
     X-Mime-Composer: mime.el + tiny-mime 5.12
     X-Ml-Count: 32

     [1  (text/plain)]
       I put tm6.63.tar.gz in ftp.jaist.ac.jp.

       In this version, tm-view uses new MIME encoding/decoding engine
     ``mel (MIME encoding library''. This library has internal/external
     encoding/decoding engine. If data is smaller than a limit, tm-view
     uses internal decoder, otherwise external decoder.

     [2 tm6.63.tar.gz ([anon-ftp] ftp.jaist.ac.jp:/pub/GNU/elisp/mime/alpha)]

     [3  (text/plain)]
     ----
     MORIOKA, Tomohiko <morioka@jaist.ac.jp>

content-subject

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

標準では

             [1.3 test (text/plain)]

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

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

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

     Content-Type field の name paramater もしくは x-name parameter に書かれた file 名 Content-Description field もしくは Subject field に書かれた表題 uuencode の場合の file 名

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

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

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

             [2  (image/gif)]

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

Variable mime-viewer/content-subject-omitting-Content-Type-list

表示しない Content-Type を要素とする list. 関数 mime-viewer/default-content-subject-function によって参照される。

Function mime-viewer/default-content-subject-function cnum cinfo ctype params subj

標準の content-subject 表示関数。変数 mime-viewer/content-subject-omitting-Content-Type-list を参照している。

 -- Variable: mime-viewer/content-subject-function cnum cinfo ctype params subj

     content-subject 表示関数を設定するための変数。既定値は関数 mime-viewer/default-content-subject-function である。

     この変数に、関数 mime-viewer/default-content-subject-function 以外の関数を設定した場合、変数 mime-viewer/content-subject-omitting-Content-Type-list の有効性は保証されないので注意すること。

content-header

ある content の content-number を関数 mime-viewer/header-visible-p に入力してその返り値が t になる場合、その content の content-header が表示されます。この判定関数は、一番上の content でなく、その content の親の 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 によって整形されます。呼ばれる content-header-filter は 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

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

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

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

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

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

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

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

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

content-body

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

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

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

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

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

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

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

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

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

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

標準では何もしない。

content-separator

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

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

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

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

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

Decoding

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

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

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

content の decode 条件の設定

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-plain を起動する時、

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

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

この条件は content-type が text/plain である content なら全ての 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
     content を渡すための 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)
     	     ))