mh-format(5) FreeBSD 一般コマンドマニュアル

mh-format

前のページ 上に戻る 次のページ

mh-format



SYNOPSIS

       いくつかの MH コマンド


DESCRIPTION

       いくつかの MH コマンドは、実行中にフォーマット文字列または
       フォーマット・ファイルを利用します。例えば、 scan (1) はそ
       れぞれのメッセージの一覧表示をどのように作成するかを示すた
       めにフォーマット文字列を使いますし、 repl (1) はメッセージ
       の返信をどのように作成するかを示すためにフォーマット・ファ
       イルを使います。

       フォーマット文字列は MH によって能率的に解析されるよう設計
       されているので、必ずしも書いたり理解したりしやすいとは言え
       ません。したがって、初心者は、あるいは MH の上級ユーザーで
       さえも、これを是非とも扱わなければならないというようなもの
       ではありません。 い く つ か の  scan   フォ ー マッ ト が
       /usr/local/lib/mh/scan.time、/usr/local/lib/mh/scan.size、
       そして /usr/local/lib/mh/scan.timely として用意されてい ま
       す。他の scan 及び repl フォーマット・ファイルに関しては、
       /usr/local/lib/mh ディレクトリを見て下さい。あるいは、それ
       はあなたのサイトで書かれたものかも知れませんが。

       実際に新しいフォーマットを書いたり、既存のものを編集したり
       する MH 熟練者があなたのサイトにいれば、あなた自身が出来な
       くてもそれで充分です。このマニュアルはそれをどうやるかにつ
       いて説明しています。なお、C 言語の printf ルーチンについて
       熟知している事を前提にしています。

       フォーマット文字列は通常のテキストと、`%' で始まる特別な複
       数文字のエスケープ・シーケンスから成り立っています。フォー
       マッ ト文字列では、通常の C でのバックスラッシュ文字が使え
       ます。すなわち、`\b'、`\f'、`\n'、`\r'、そして `\t' の事で
       す。 フォーマットファイルでの継続行は `\' の直後に改行文字
       が来ます。文字 `%' または `\' 自身をフォーマット文字列に置
       く際には、それぞれ `%%' と `\\' を用います。エスケープ・シ
       ーケンスには三つの種類があります。ヘッダーの コンポーネ ン
       ト、組み込みの 関数、そして流れの 制御 です。

       コンポーネント・エスケープは `%{component}' と指定し、メッ
       セージで見つかったそれぞれのヘッダーが処理されます。 例 え
       ば、`%{date}'   は メッセージの "Date:" 行の内容を意味しま
       す。全てのコンポーネント・エスケープは文字列の値を持 ち ま
       す。 通常、コンポーネントの値は任意のコントロール文字(タブ
       や改行を含む)をスペースに変換し、先行する、あるいは連 なっ
       ているスペースは省かれます。しかし、コマンドによっては、い
       くつかのコンポーネント・エスケープに違った解釈を与えるかも
       しれません。詳細はそれぞれのコマンドのマニュアルを参照して
       下さい。

       関数エスケープは `%(function)' と指定します。全ての関数 は
       組み込みで、たいていは文字列か数字の値を持ちます。

            %?条件2
                 フォーマット・テキスト 2
            %?条件3
                 フォーマット・テキスト 3
            ...
            %|
                 フォーマット・テキスト N
            %>

       ここで余分なスペースは分かりやすくするために付けただけのも
       のです。これらの構造は明瞭に入れ子にする事が出来ます。これ
       らのフォームは一般的な if-elseif-else-endif ブロックで、こ
       のうちの一つの フォーマット・テキスト 部分だけが実行される
       形式です。

       `%<' と `%?' の制御エスケープは条件を評価します。この条 件
       はたぶん、コンポーネントまたは関数のどちらかでしょう。文法
       上、次の4つの構造があります。

            %<{component}
            %<(function)
            %?{component}
            %?(function)

       これらの制御エスケープは、関数またはコンポーネントの値がゼ
       ロでない (整数値のエスケープの場合)か空でない(文字列値のエ
       スケープの場合)かを調べます。

       もしこのテストが真と評価されれば次の対応する制御エス ケ ー
       プ(`%|'、`%?'、`%>'  のうちの一つ)までのフォーマット・テキ
       ストが普通に解釈されます。次に、対応する `%>' 制御エスケー
       プ までの全てのフォーマット・テキスト(あれば) が飛ばされま
       す。 `%>' 制御エスケープは解釈されません。通 常、 解 釈 は
       `%>' エスケープの後から再開されます。

       しかし、もしこのテストが偽と評価されれば、次の対応する制御
       エスケープ(再び `%|'、`%?'、`%>' のうちの一つ)までのフォー
       マット・テキストが飛ばされます。もし出会った制御エスケープ
       が `%?' ならば、その制御エスケープに対応する条件が評 価 さ
       れ、解釈はその評価の後から前の段落に書かれているように続け
       られます。もし出あった制御エスケープが `%|' ならば、対応す
       る `%>' エスケープまでのフォーマット・テキストが普通に解釈
       されます。先述のように、 `%>' 制御エスケープは解釈されませ
       ん。通常、解釈は `%>' エスケープの後から再開されます。

       `%?'  制御エスケープとそれに続くフォーマット・テキストはな
       くても構いません。そして、たぶんゼロ回またはそれ以上含まれ
       ているでしょう。 `%|' 制御エスケープとそれに続くフォーマッ
       ト・テキストはなくても構いません。そして、たぶんゼロ回また
       は一回含まれているでしょう。


       addr     アドレスのコンポーネント %(func{from})
       expr     関数、                   %(func(func2))
                コンポーネント、制御、   %(func %<{reply-to}%|%{from}%>)
                または、それらの入れ子   %(func(func2{comp}))

       date  型と addr 型は comp 型と同じ文法ですが、要求するヘッ
       ダー・コンポーネントがそれぞれ、日付の文字列であるか、アド
       レスの文字列であるかが違います。

       expr  型の引数を除いて、その他の引数は必須です。 expr 型の
       引数に於いては、先行する `%' はコンポーネント・エスケー プ
       と関数エスケープの場合は必ず省略しなければなりません。また
       制御エスケープの場合は必ず付けなければなりません (関数名と
       最初の制御エスケープの間にはスペースも必要)。

       フォ ーマット文字列の評価は、整数レジスタ num と文字列レジ
       スタ str を持った単純なマシンを想定して行ないます。関数 エ
       ス ケープが処理される時、もし、expr 型の引数を取る場合に、
       引数がなかった場合は、適切に num または str の現在の値が使
       われます。


   B>戻B>りB>値
       コンポーネント・エスケープはそのメッセージ・ヘッダーの値を
       str に書き出します。 integer 型または boolean 型の戻り値を
       返す関数は num に、 string 型の戻り値を返す関数は str にそ
       れぞれ書き込みます (boolean 型は integer 型の部分集合 で、
       値 0=偽 と 1=真 を取ります)。制御エスケープは boolean 型の
       値を返し、num に書き出します。

       全てのコンポーネント・エスケープと、 integer   型 ま た は
       string  型を返す関数は、レジスタ str または num に値を書き
       出す事に加えて、その値を呼び出し元に返します。これらのエス
       ケ ー プは他のエスケープの引数として呼ばれた場合を除いて (
       トップレベルから呼ばれた場合は)、その値を 表 示 し ま す。
       boolean  型を返すエスケープは num に書き出した値を呼び出し
       元にも返しますが、その値は表示されません。

       関数       引数の型 戻り値   説明
       msg                 integer  メッセージ番号
       cur                 integer  メッセージはカレント・メッセージか
       size                integer  メッセージのサイズ
       strlen              integer  str の長さ
       width               integer  出力バッファの大きさ(バイト単位)
       charleft            integer  出力バッファに残っているバイト数
       timenow             integer  現在の UNIX 時刻(秒単位)
       me                  string   ユーザーのメールボックス
       eq         literal  boolean  num == arg
       ne         literal  boolean  num != arg
       gt         literal  boolean  num > arg
       match      literal  boolean  strarg を含むか
       amatch     literal  boolean  strarg で始まるか
       compval    comp     integer  "atoi(comp)" を num に
       trim       expr              str の後ろに付いたスペースを取り除く
       putstr     expr              str を表示する
       putstrf    expr              str を決まった長さで表示する
       putnum     expr              num を表示する
       putnumf    expr              num を決まった長さで表示する
       hencode    expr     string   str を RFC-2047 エンコードする
       hdecode    expr     string   str を RFC-2047 デコードする

       以下の関数は引数として日付のコンポーネントを必要とします。

       関数       引数の型 戻り値   説明
       sec        date     integer  秒
       min        date     integer  分
       hour       date     integer  時 (0-23)
       wday       date     integer  曜日 (日曜=0)
       day        date     string   曜日 (略号)
       weekday    date     string   曜日 (英語表記)
       sday       date     integer  曜日が明示されているか?
                                    (1=明示,0=暗示される,-1=分からない)
       mday       date     integer  日
       yday       date     integer  一年の最初から何日目か
       mon        date     integer  月
       month      date     string   月 (略号)
       lmonth     date     string   月 (英語表記)
       year       date     integer  年 (たぶん > 100)
       zone       date     integer  タイムゾーン
       tzone      date     string   タイムゾーン文字列
       szone      date     integer  タイムゾーンは明示されているか?
                                    (1=明示,0=暗示される,-1=分からない)
       date2local date              日付を現地時刻に変える
       date2gmt   date              日付をグリニッジ時刻に変える
       dst        date     integer  サマータイムになっているか?
       clock      date     integer  UNIX 時刻(秒単位)
       rclock     date     integer  現在より何秒前か
       tws        date     string   正式な RFC-822 表記
       pretty     date     string   ユーザーに分かりやすい表記
       nodate     date     integer  str が日付文字列でない

       以下の関数は引数として、アドレスのコンポーネントを必要とし
       ます。 `*' と書かれている関数は、戻り値としてヘッダー・ コ
       ンポーネントの中の最初に書かれているアドレスだけを保持しま
       す。

       関数       引数の型 戻り値   説明
       proper     addr     string   正式な RFC-822 表記
       friendly   addr     string   ユーザーに分かりやすい表記
       addr       addr     string   mbox@host または host!mbox 表記*
       pers       addr     string   個人名*
       note       addr     string   コメント文*
       mbox       addr     string   ローカル・メールボックス*
       mymbox     addr     integer  ユーザーのアドレスか? (0=no,1=yes)
       の も のへと評価されていきます。最も外側のエスケープは `%'
       が必要ですが、内側のエスケープは要りません。例えば、

            %<(mymbox{from}) To: %{to}%>

       はヘッダー・コンポーネント "From:" の値を str に書き出しま
       す。それから (mymbox) は str を読み、その結果を num に書き
       出します。そして制御エスケープが num を評価しま す。 も し
       num がゼロでない場合は、文字列 "To: " とそれに続けてヘッダ
       ー・コンポーネント "To:" の値が表示されます。

       (mymbox{comp}) について、補足説明をしておきましょう。一 般
       に、これはヘッダー・コンポーネント "comp" にある全てのアド
       レスを、ユーザーのメールボックス名及び全 て の  Alternate-
       Mailboxes と比較します。これは、どれかのアドレスと一致すれ
       ば、真を返しますが、もし "comp" ヘッダーがメッセージに存在
       しない場合も真を返します。必要なら、この場合には (null) 関
       数で明示的に調べておきましょう。 Alternate-Mailboxes に 関
       しては mh-profile (5) も参照して下さい。

       関数エスケープまたはコンポーネント・エスケープが解釈され、
       結果が直ちに表示される時には、表示幅を指定する事が出来、与
       えられた文字数内にきっちりと表示されます。例えば、%4(size)
       というような数値のエスケープはメッセージのサイズを多くとも
       4 桁で表示します。もし、桁あふれをした場合は、最初の位置に
       `?' が出力されます(例えば `?234')。 %4(me) というような 文
       字列のエスケープは最初の 4文字を表示し、それ以降は切り捨て
       ます。表示幅より短い場合は、右側に指定の幅まで文字(通 常、
       空 白)を埋めます。もし、表示幅指定がゼロから始まってる場合
       は、この埋める文字はゼロになります。

       上述のように、関数 (putnumf) と (putstrf) は、その結果を先
       行 す る表示幅指定で指定された文字数で表示します。例えば、
       %06(putnumf(size)) はメッセージのサイズを 6文字の幅で表 示
       し、頭はゼロで埋められます。 %14(putstrf{from}) は "From:"
       ヘッダー・コンポーネントを 14文字の幅で表示し、後ろはス ペ
       ー スで埋められます。 putstrf に対して、表示幅として、負の
       数を与えると、その文字列はその幅の中に右寄せで表示され、埋
       め ら れ る 文字は左側におかれます。なお、関数 (putnum) と
       (putstr) は結果を必要最小限の文字数で表示し、表示幅指定 は
       無視します。

       出力可能な表示幅は内部レジスタに保存されていて、その幅を越
       える出力は全て捨てられます。

       コメントは関数の引数が期待される場所を除いて、たいていの場
       所 に置く事が出来ます。コメントは `%;' で始まり、(エスケー
       プされてない)改行で終ります。

       これを全て頭に置いた上で、ここに scan のデフォルトのフォー
       マット文字列があります。これを読みやすくするために、いくつ
       かの部分に分けます。最初の部分は次の通りです。

            %<{date} %|*%>

       "Date:" 行が存在すればスペース、さもなくば `*'。次、

            %<(mymbox{from})%<{to}To:%14(friendly{to})%>%>

       もしメッセージが自分が出したものであり、且つ "To:" ヘッ ダ
       ーがあるなら、 `To:' と "To:" 行の最初のアドレスをユーザー
       に分かりやすい表記で表示します。続いて、

            %<(zero)%17(friendly{from})%>

       もし、上記二つの条件判断のどちらかに失敗した場合、 "From:"
       行がユーザーに分かりやすい表記で表示されます。制御エスケー
       プの条件判断は num レジスタに値を設定するので、後でそれ を
       利用する事によって、AND や OR の処理をさせる事が出来ます。
       最後に、

            %{subject}%<{body}<<%{body}%>

       "Subject:" 行と ボディの最初の部分(あれば)を表示します。

       もっと複雑な例として、次はデフォルトの replcomps   フォ ー
       マット・ファイルを考えてみましょう。

            %(lit)%(formataddr %<{reply-to}

       ま ず str レジスタを空にし、"Reply-To:" ヘッダーが存在する
       ならそれを整形します。もし存在しないなら、以下 の  else-if
       部分が実行されます。

            %?{from}%?{sender}%?{return-path}%>)\

       "From:"、"Sender:"、そして "Return-Path:" ヘッダーのうち一
       つが存在した時点で止まります。で、

            %<(nonnull)%(void(width))%(putaddr To: )\n%>\

       もし formataddr の結果が空でなかった場合、それがアドレスと
       して width の幅で (必要なら行を折り返して)、頭に "To: " を
       つけて表示します。

            %(lit)%(formataddr{to})%(formataddr{cc})%(for-
       mataddr(me))\

       str を空にし、 "To:" と "Cc:" ヘッダー、そしてユーザーのア
       ドレス (repl の "-cc" オプションで何を指定したかに依る) が
       整形されます。

            %<(nonnull)%(void(width))%(putaddr cc: )\n%>\

            %<{date}In-reply-to: Your message of "\
            %<(nodate{date})%{date}%|%(pretty{date})%>."%<{message-id}
                         %{message-id}%>\n%>\
            --------

       もし "Date:" コンポーネントが存在するなら、 "In-Reply-To:"
       ヘッダーが "Your message of " を付けて表示します。もし、日
       付 が 解析可能なら、ユーザーに分かりやすい形式で出力されま
       す。さもなくば、そのまま出力します。 "Message-ID:" があ れ
       ば、 そ れ も含めます。ダッシュ(`-')の列は生のテキストなの
       で、そのまま出力されます。

       この最後の部分はもうちょっと詳しく述べるのに良い例です。こ
       こにその部分を再び仮想的なコードで書いてみましょう。

            if (comp_exists(date)) then
                 print ("In-reply-to: Your message of \"")
                 if (not_date_string(date.value)) then
                      print (date.value)
                 else
                      print (pretty(date.value))
                 endif
                 print ("\"")
                 if (comp_exists(message-id)) then
                      print ("\n\t")
                      print (message-id.value)
                 endif
                 print ("\n")
            endif

       これは複雑に見えますが、実際上、この方法は個々のヘッダー行
       を取り出し、ユーザーが好む任意の形式で出力するのに充分に柔
       軟性のあるものです。


FILES

       無し。


PROFILE COMPONENTS

       無し。


SEE ALSO

       scan(1), repl(1), ap(8), dp(8)


DEFAULTS

       無し。


CONTEXT

       無し。


HISTORY

       このソフトは MH 6.3 のために寄贈されました。その前までは、
       出力形式の指定はもっと書き易いものでしたが、極めて柔軟性に

ABELNET VPSサービス