名称
mh−format − MH メッセージシステムのためのフォーマットファイル
形式
いくつかの MH コマンド
解説
いくつかの MH コマンドは、 その実行中にフォーマット文字列またはフォーマットファイルを利用します。 例えば scan(1) は、 各メッセージについてどのようにスキャンリスティングを作成するかを 指示するフォーマット文字列を使い、 repl(1) ではメッセージに対してどのように返信を出すかを 指示するフォーマットファイルを使います。
フォーマット文字列は、MH にとって欠くことのできない部分を表すもので、 MH により効率よく解析されるように設計されています。 このため、初心者や一般的な利用者だけでなく、熟練した MH ユーザ にも利用していただけます。 これは、ローカルな MH エキスパートが 実際に新しいフォーマットのコマンドを書いたり、 既存のものを修正したりするのに十分なものです。 この章はその使い方について説明します。
フォーマット文字列は、printf(3) で使用する文字列に良く似ており、 複数文字を表す ‘%’ エスケープを使います。 文字列の指定では、通常 C 言語で用いるバックスラッシュ文字: ‘\b’、 ‘\f’、‘\n’、‘\r’、‘\t’ が用いられます。 フォーマットファイル中では、 次行に継続させる行は ‘\’ に続くニューラインで終えます。
解釈モデルは、num と str という 2つのレジスタを持つ 単純なマシンを基にしています。 num は整数値を、str は文字列を含んでいます。 エスケープが処理されるとき、引数が必要ならば、 num と str の両方の現在値を読みます。 また、値を返すものについては、num または str に書き込みます。
エスケープには次の 3つの種類があります。 コンポーネント、ファンクション、コントロールです。 コンポーネントエスケープは ‘%{name}’ のように指定され、 処理中のメッセージの各ヘッダを作ります。 例えば、‘%{date}’ は該当するメッセージの “Date:” フィールドと 関連しています。 コンポーネントエスケープは常に文字列です。
コントロールエスケープは、‘%<escape’、‘%|’、‘%>’ のうちの 1つです。 これらは、if−then−else 構文に相当します。 もし ‘escape’ がゼロでない場合(整数値のエスケープの場合)、 もしくは空でない場合(文字列エスケープの場合)には、 ‘%|’ または ‘%>’ (どちらか最初にきた方)までが解釈されます。 さもなければ、‘%|’ または ‘%>’ (どちらか最初にきた方)まで スキップして解釈を再開します。
ファンクションエスケープは、‘%(name)’ という形で指定され、静的に定義されます。 次にそのリストをあげます。
エスケープ引数リターン値解釈
nonzero整数整数num は 0 ではない
zero整数整数num は 0 である
eq整数整数num == width
ne整数整数num != width
gt整数整数width > num
null文字列整数str は空
nonnull文字列整数str は空ではない
putstr文字列str をプリントする
putstrf文字列str を指定の width でプリントする
(例えば、%20(putstrf{subject})
putnum整数num をプリントする
putnumf整数num を指定の width でプリントする
(例えば、%4(putnumf(msg))
msg整数メッセージ番号
cur整数メッセージはカレント
size整数メッセージのサイズ
strlen文字列整数str の長さ
me文字列ユーザのメールボックス
plus整数num に width を加算する
minus整数width から num を減算する
charleft整数出力バッファに残っているスペース
timenow整数UNIX 起動以来の時間(秒)
str が日付である場合には、これらのエスケープが有用です。
エスケープ引数リターン値解釈
sec文字列整数秒
min文字列整数分
hour文字列整数時(24時間制で)
mday文字列整数日
mon文字列整数月
wday文字列整数曜日(日曜日が0)
year文字列整数年度
yday文字列整数日付
dst文字列整数夏時間
zone文字列整数時間帯
sday文字列整数曜日
1:明示
0:暗示(MH が計算して出した)
−1:不明(MH は計算できなかった)
clock文字列整数UNIX 起動以来の秒数
rclock文字列整数現在時刻の秒
month文字列文字列月
lmonth文字列文字列月(ロング形式で)
tzone文字列文字列時間帯
day文字列文字列曜日
weekday文字列文字列曜日(ロング形式で)
tws文字列文字列正式な RFC-822 表記による日付
pretty文字列文字列よりユーザフレンドリーな表現
nodate文字列細分化できない日付
str がアドレスである場合には、これらのエスケープが有用です。
エスケープ引数リターン値解釈
pers文字列文字列アドレスの個人名部
mbox文字列文字列アドレスのローカル部
host文字列文字列アドレスのドメイン部
path文字列文字列アドレスのルート部
type文字列整数ホストの型
−1:uucp
0:ローカル
1:ネットワーク
2:不明
nohost文字列整数アドレスにホストの指定がなかった
ingrp文字列整数グループ内に見いだされるアドレス
gname文字列文字列グループ名(第1アドレスにのみある)
note文字列文字列コメントテキスト
proper文字列文字列正式な RFC-822 表記によるアドレス
friendly文字列文字列よりユーザフレンドリーな表記
mymbox文字列アドレスはユーザのメールボックスを参照
formataddr文字列アドレスリストに str をプリントする
これを覚えたところで、scan に対するデフォルトの フォーマット文字列について述べます。 読みやすいようにいくつかの部分に分けてあります。 最初の部分は、
%4(putnumf(msg))%<(cur)+%| %>%<{replied}−%| %>
これは、メッセージ番号が4つの数字でプリントされ、 メッセージがカレントメッセージのときには ‘+’、 そうでなければ空白がプリントされ、 また、“Replied:” フィールドがあれば ‘−’、 そうでなければ空白がプリントされることを指示します。 次に、
%02(putnumf(mon{date}))/%02(putnumf(mday{date}))
では、時刻の時と分が2桁の数字でプリントされます(前ゼロで埋められます)。 次に、
%<{date} %|∗>
は、“Date:” フィールドがなければ ‘∗’ がプリントされ、 そうでないときには空白になります。次に、
%<(mymbox{from})To:%14(putstrf(friendly{to}))
では、メッセージが自分自身からであれば、‘To:’ に続けて、 “To:” フィールド中の第1アドレスが “ユーザ フレンドリー” な表記でプリントされます。 続いて、
%|%17(putstrf(friendly{from}))%>
では、もしメッセージが自分自身からでなければ、 “From:” アドレスがプリントされます。 そして最後に、
%{subject}%<{body}<<%{body}%>
では、サブジェクトと本文の冒頭がプリントされます。
これは複雑なようですが、実際には、個々のフィールドを取り出し、 ユーザの希望するフォーマットでプリントしたりするには 十分対応できる方法なのです。
もし、‘−form formatfile’ スイッチが指定されていれば、 scan は指定されたファイル中の各行をフォーマット文字列とみなし、 それに見合った動作をします。 これによって、ユーザはあらかじめ記録してある スキャンリスティングフォーマットを用いることができます。 /usr/new/lib/mh/scan.time、 usr/new/lib/mh/scan.size、usr/new/lib/mh/scan.timely の 3つのファイルも参照してください。
関連ファイル
なし
プロファイルコンポーネント
なし
関連事項
デフォルト値
なし
コンテクスト
なし
バグ
MH が BERK オプション付きでコンフィギュレーションされているホストでは、 アドレスの解析ができません。
NEWS-OSRelease 3.3