0
|
1 .\" This file is automatically generated. Do not edit!
|
|
2 .\" written by MH-plus project
|
|
3 .SC MH-FORMAT 5
|
|
4 .NA
|
|
5 mh-format \- MH システムのフォーマット・ファイル
|
|
6 .SY
|
|
7 いくつかの \fIMH\fR コマンド
|
|
8 .DE
|
|
9 いくつかの \fIMH\fR コマンドは、実行中に
|
|
10 フォーマット文字列またはフォーマット・ファイルを利用します。
|
|
11 例えば、
|
|
12 \fIscan\fR\0(1) はそれぞれのメッセージの一覧表示をどのように作成するかを
|
|
13 示すためにフォーマット文字列を使いますし、
|
|
14 \fIrepl\fR\0(1) はメッセージの返信をどのように作成するかを示すために
|
|
15 フォーマット・ファイルを使います。
|
|
16
|
|
17 フォーマット文字列は \fIMH\fR によって能率的に解析されるよう設計されて
|
|
18 いるので、必ずしも書いたり理解したりしやすいとは言えません。
|
|
19 したがって、初心者は、あるいは \fIMH\fR の上級ユーザーでさえも、
|
|
20 これを是非とも扱わなければならないというようなものではありません。
|
|
21 いくつかの scan フォーマットが
|
|
22 /usr/local/mh/lib/scan.time、/usr/local/mh/lib/scan.size、そして
|
|
23 /usr/local/mh/lib/scan.timely として用意されています。
|
|
24 他の \fIscan\fR 及び \fIrepl\fR フォーマット・ファイルに関しては、
|
|
25 /usr/local/mh/lib ディレクトリを見て下さい。
|
|
26 あるいは、それはあなたのサイトで書かれたものかも知れませんが。
|
|
27
|
|
28 実際に新しいフォーマットを書いたり、既存のものを編集したりする
|
|
29 \fIMH\fR 熟練者があなたのサイトにいれば、
|
|
30 あなた自身が出来なくてもそれで充分です。
|
|
31 このマニュアルはそれをどうやるかについて説明しています。
|
|
32 なお、C 言語の \fIprintf\fR ルーチンについて熟知している事を前提にしています。
|
|
33
|
|
34 フォーマット文字列は通常のテキストと、`%' で始まる特別な複数文字の
|
|
35 エスケープ・シーケンスから成り立っています。
|
|
36 フォーマット文字列では、
|
|
37 通常の C でのバックスラッシュ文字が使えます。
|
|
38 すなわち、`\\b'、`\\f'、`\\n'、`\\r'、そして `\\t' の事です。
|
|
39 フォーマットファイルでの継続行は `\\' の直後に改行文字が来ます。
|
|
40 文字 `%' または `\\' 自身をフォーマット文字列に置く際には、
|
|
41 それぞれ `%%' と `\\\\' を用います。
|
|
42 .\" 文法を先に述べ、意味を後で述べます。
|
|
43 エスケープ・シーケンスには三つの種類があります。
|
|
44 ヘッダーの \fIコンポーネント\fR、組み込みの \fI関数\fR、
|
|
45 そして流れの \fI制御\fR です。
|
|
46
|
|
47 コンポーネント・エスケープは `%{\fIcomponent\fR\^}' と指定し、
|
|
48 メッセージで見つかったそれぞれのヘッダーが処理されます。
|
|
49 例えば、`%{date}' はメッセージの \*(lqDate:\*(rq 行の内容を意味します。
|
|
50 全てのコンポーネント・エスケープは文字列の値を持ちます。
|
|
51 通常、コンポーネントの値は任意のコントロール文字(タブや改行を含む)を
|
|
52 スペースに変換し、先行する、あるいは連なっているスペースは省かれます。
|
|
53 しかし、
|
|
54 コマンドによっては、
|
|
55 いくつかのコンポーネント・エスケープに違った解釈を与えるかもしれません。
|
|
56 詳細はそれぞれのコマンドのマニュアルを参照して下さい。
|
|
57
|
|
58 関数エスケープは `%(\fIfunction\fR\^)' と指定します。
|
|
59 全ての関数は組み込みで、たいていは文字列か数字の値を持ちます。
|
|
60
|
|
61 .ne 12
|
|
62 .Uh "制御エスケープ"
|
|
63 制御エスケープは `%<'、`%?'、`%|'、`%>'
|
|
64 .\" `%['、`%]'
|
|
65 のどれかです。
|
|
66 これらは組合わさって条件文を構成します。
|
|
67 .sp
|
|
68 .nf
|
|
69 %<条件
|
|
70 \fIフォーマット・テキスト 1\fP
|
|
71 %?条件2
|
|
72 \fIフォーマット・テキスト 2\fP
|
|
73 %?条件3
|
|
74 \fIフォーマット・テキスト 3\fP
|
|
75 \.\.\.
|
|
76 %|
|
|
77 \fIフォーマット・テキスト N\fP
|
|
78 %>
|
|
79 .fi
|
|
80 .sp
|
|
81 ここで余分なスペースは分かりやすくするために付けただけのものです。
|
|
82 これらの構造は明瞭に入れ子にする事が出来ます。
|
|
83 これらのフォームは一般的な \fBif\-elseif\-else\-endif\fP ブロックで、
|
|
84 このうちの一つの \fIフォーマット・テキスト\fP 部分だけが実行される形式です。
|
|
85
|
|
86 `%<' と `%?' の制御エスケープは条件を評価します。
|
|
87 この条件はたぶん、コンポーネントまたは関数のどちらかでしょう。
|
|
88 文法上、次の4つの構造があります。
|
|
89 .sp 1
|
|
90 .nf
|
|
91 %<{component}
|
|
92 %<(function)
|
|
93 %?{component}
|
|
94 %?(function)
|
|
95 .fi
|
|
96 .sp
|
|
97 これらの制御エスケープは、関数またはコンポーネントの値がゼロでない
|
|
98 (整数値のエスケープの場合)か空でない(文字列値のエスケープの場合)かを
|
|
99 調べます。
|
|
100
|
|
101 もしこのテストが真と評価されれば
|
|
102 次の対応する制御エスケープ(`%|'、`%?'、`%>' のうちの一つ)までの
|
|
103 フォーマット・テキストが普通に解釈されます。
|
|
104 次に、
|
|
105 対応する `%>' 制御エスケープまでの全てのフォーマット・テキスト(あれば)
|
|
106 が飛ばされます。
|
|
107 `%>' 制御エスケープは解釈されません。
|
|
108 通常、
|
|
109 解釈は `%>' エスケープの後から再開されます。
|
|
110
|
|
111 しかし、もしこのテストが偽と評価されれば、
|
|
112 次の対応する制御エスケープ(再び `%|'、`%?'、`%>' のうちの一つ)までの
|
|
113 フォーマット・テキストが飛ばされます。
|
|
114 もし出会った制御エスケープが `%?' ならば、
|
|
115 その制御エスケープに対応する条件が評価され、解釈はその評価の後から
|
|
116 前の段落に書かれているように続けられます。
|
|
117 もし出あった制御エスケープが `%|' ならば、
|
|
118 対応する `%>' エスケープまでのフォーマット・テキストが普通に解釈されます。
|
|
119 先述のように、
|
|
120 `%>' 制御エスケープは解釈されません。
|
|
121 通常、
|
|
122 解釈は `%>' エスケープの後から再開されます。
|
|
123
|
|
124 `%?' 制御エスケープとそれに続くフォーマット・テキストは
|
|
125 なくても構いません。そして、たぶんゼロ回またはそれ以上含まれているでしょう。
|
|
126 `%|' 制御エスケープとそれに続くフォーマット・テキストは
|
|
127 なくても構いません。そして、たぶんゼロ回または一回含まれているでしょう。
|
|
128
|
|
129 .\" '%[' と '%]' のエスケープはループ構造を作ります。
|
|
130 .\" 繰り返し実行されるフォーマット文字列に於いて
|
|
131 .\" (\fIscan\fP のように)、これらのエスケープは実行のメイン・ボディを
|
|
132 .\" 区切ります。'%[' の前に現われるフォーマット・テキストは
|
|
133 .\" 最初のメッセージを処理する前に一回だけ実行され、
|
|
134 .\" '%]' エスケープの後に現われるフォーマット・テキストは無視されます
|
|
135 .\" (これらのエスケープは入れ子にする事は出来ません)。
|
|
136 .\"
|
|
137 .Uh "関数エスケープ"
|
|
138 .ne 10
|
|
139 たいていの関数は次のような特定の型の引数を期待します。
|
|
140 .sp 1
|
|
141 .nf
|
|
142 .ta +\w'引数の型 'u +\w'アドレスのコンポーネント 'u
|
|
143 \fI引数の型\fR \fI説明\fR \fI使用例\fR
|
|
144 literal 文字通りの数字、 %(\fIfunc\fR 1234)
|
|
145 または文字列 %(\fIfunc\fR text string)
|
|
146 comp 任意のコンポーネント %(\fIfunc\fR\^{\fIin-reply-to\fR\^})
|
|
147 date 日付のコンポーネント %(\fIfunc\fR\^{\fIdate\fR\^})
|
|
148 addr アドレスのコンポーネント %(\fIfunc\fR\^{\fIfrom\fR\^})
|
|
149 expr 関数、 %(\fIfunc\fR\^(\fIfunc2\fR\^))
|
|
150 コンポーネント、制御、 %(\fIfunc\fR %<{\fIreply-to\fR\^}%|%{\fIfrom\fR\^}%>)
|
|
151 または、それらの入れ子 %(\fIfunc\fR\^(\fIfunc2\fR\^{\fIcomp\fR\^}))
|
|
152 .re
|
|
153 .fi
|
|
154
|
|
155 \fIdate\fR 型と \fIaddr\fR 型は \fIcomp\fR 型と同じ文法ですが、
|
|
156 要求するヘッダー・コンポーネントがそれぞれ、
|
|
157 日付の文字列であるか、アドレスの文字列であるかが違います。
|
|
158
|
|
159 \fIexpr\fR 型の引数を除いて、その他の引数は必須です。
|
|
160 \fIexpr\fR 型の引数に於いては、
|
|
161 先行する `%' はコンポーネント・エスケープと関数エスケープの場合は
|
|
162 必ず省略しなければなりません。
|
|
163 また制御エスケープの場合は必ず付けなければなりません
|
|
164 (関数名と最初の制御エスケープの間にはスペースも必要)。
|
|
165
|
|
166 フォーマット文字列の評価は、
|
|
167 整数レジスタ \fInum\fR と文字列レジスタ \fIstr\fR を持った単純なマシンを
|
|
168 想定して行ないます。
|
|
169 関数エスケープが処理される時、
|
|
170 もし、\fIexpr\fR 型の引数を取る場合に、引数がなかった場合は、
|
|
171 適切に \fInum\fR または \fIstr\fR の現在の値が使われます。
|
|
172
|
|
173 .\" 戻り値
|
|
174 .Uh "戻り値"
|
|
175 コンポーネント・エスケープはそのメッセージ・ヘッダーの値を \fIstr\fR に
|
|
176 書き出します。
|
|
177 \fIinteger\fR 型または \fIboolean\fR 型の戻り値を返す関数は \fInum\fR に、
|
|
178 \fIstring\fR 型の戻り値を返す関数は \fIstr\fR にそれぞれ書き込みます
|
|
179 (\fIboolean\fR 型は \fIinteger\fR 型の部分集合で、値 0=偽 と 1=真 を取ります)。
|
|
180 制御エスケープは \fIboolean\fP 型の値を返し、\fInum\fP に書き出します。
|
|
181
|
|
182 全てのコンポーネント・エスケープと、
|
|
183 \fIinteger\fR 型または \fIstring\fR 型を返す関数は、
|
|
184 レジスタ \fIstr\fR または \fInum\fR に値を書き出す事に加えて、
|
|
185 その値を呼び出し元に返します。
|
|
186 これらのエスケープは
|
|
187 他のエスケープの引数として呼ばれた場合を除いて
|
|
188 (トップレベルから呼ばれた場合は)、
|
|
189 その値を表示します。
|
|
190 \fIboolean\fR 型を返すエスケープは \fInum\fP に書き出した値を
|
|
191 呼び出し元にも返しますが、その値は表示されません。
|
|
192
|
|
193 .nf
|
|
194 .ta \w'Formataddr 'u +\w'Argument 'u +\w'Rboolean 'u
|
|
195 \fI関数\fR \fI引数の型\fR \fI戻り値\fR \fI説明\fR
|
|
196 msg integer メッセージ番号
|
|
197 cur integer メッセージはカレント・メッセージか
|
|
198 .\" unseen integer メッセージは未読か
|
|
199 size integer メッセージのサイズ
|
|
200 strlen integer \fIstr\fR の長さ
|
|
201 width integer 出力バッファの大きさ(バイト単位)
|
|
202 charleft integer 出力バッファに残っているバイト数
|
|
203 timenow integer 現在の UNIX 時刻(秒単位)
|
|
204 me string ユーザーのメールボックス
|
|
205 eq literal boolean \fInum\fR == \fIarg\fR
|
|
206 ne literal boolean \fInum\fR != \fIarg\fR
|
|
207 gt literal boolean \fInum\fR > \fIarg\fR
|
|
208 match literal boolean \fIstr\fR が \fIarg\fR を含むか
|
|
209 amatch literal boolean \fIstr\fR が \fIarg\fR で始まるか
|
|
210 plus literal integer \fIarg\fR + \fInum\fR
|
|
211 minus literal integer \fIarg\fR \- \fInum\fR
|
|
212 divide literal integer \fInum\fR ÷ \fIarg\fR
|
|
213 modulo literal integer \fInum\fR を \fIarg\fR で割った余り
|
|
214 num literal integer \fIarg\fR を \fInum\fR に書き出す
|
|
215 lit literal string \fIarg\fR を \fIstr\fR に書き出す
|
|
216 getenv literal string 環境変数 \fIarg\fR の値を \fIstr\fR に
|
|
217 profile literal string プロファイル・コンポーネント \fIarg\fR を \fIstr\fR に
|
|
218 .\" dat literal int dat[arg] の返り値
|
|
219 nonzero expr boolean \fInum\fR がゼロでない
|
|
220 zero expr boolean \fInum\fR がゼロ
|
|
221 null expr boolean \fIstr\fR が空
|
|
222 nonnull expr boolean \fIstr\fR が空でない
|
|
223 void expr \fIstr\fR または \fInum\fR を設定
|
|
224 comp comp string コンポーネントのテキストを \fIstr\fR に設定
|
|
225 compval comp integer \*(lq\fBatoi\fR(\fIcomp\fR\^)\*(rq を \fInum\fR に
|
|
226 .\" compflag comp integer コンポーネント・フラグ(内部表現)を \fInum\fR に
|
|
227 trim expr \fIstr\fR の後ろに付いたスペースを取り除く
|
|
228 putstr expr \fIstr\fR を表示する
|
|
229 putstrf expr \fIstr\fR を決まった長さで表示する
|
|
230 putnum expr \fInum\fR を表示する
|
|
231 putnumf expr \fInum\fR を決まった長さで表示する
|
|
232 .\" addtoseq literal メッセージをシーケンスに入れる (LBL オプション時)
|
|
233 hencode expr string \fIstr\fR を RFC\-2047 エンコードする
|
|
234 hdecode expr string \fIstr\fR を RFC\-2047 デコードする
|
|
235 .re
|
|
236 .fi
|
|
237
|
|
238 以下の関数は引数として日付のコンポーネントを必要とします。
|
|
239 .sp 1
|
|
240 .nf
|
|
241 .ta \w'Formataddr 'u +\w'Argument 'u +\w'Rboolean 'u
|
|
242 \fI関数\fR \fI引数の型\fR \fI戻り値\fR \fI説明\fR
|
|
243 sec date integer 秒
|
|
244 min date integer 分
|
|
245 hour date integer 時 (0-23)
|
|
246 wday date integer 曜日 (日曜=0)
|
|
247 day date string 曜日 (略号)
|
|
248 weekday date string 曜日 (英語表記)
|
|
249 sday date integer 曜日が明示されているか?
|
|
250 (1=明示,0=暗示される,\-1=分からない)
|
|
251 mday date integer 日
|
|
252 yday date integer 一年の最初から何日目か
|
|
253 mon date integer 月
|
|
254 month date string 月 (略号)
|
|
255 lmonth date string 月 (英語表記)
|
|
256 year date integer 年 (たぶん > 100)
|
|
257 zone date integer タイムゾーン
|
|
258 tzone date string タイムゾーン文字列
|
|
259 szone date integer タイムゾーンは明示されているか?
|
|
260 (1=明示,0=暗示される,\-1=分からない)
|
|
261 date2local date 日付を現地時刻に変える
|
|
262 date2gmt date 日付をグリニッジ時刻に変える
|
|
263 dst date integer サマータイムになっているか?
|
|
264 clock date integer UNIX 時刻(秒単位)
|
|
265 rclock date integer 現在より何秒前か
|
|
266 tws date string 正式な RFC\-822 表記
|
|
267 pretty date string ユーザーに分かりやすい表記
|
|
268 nodate date integer \fIstr\fR が日付文字列でない
|
|
269 .re
|
|
270 .fi
|
|
271
|
|
272 .ne 12
|
|
273 以下の関数は引数として、アドレスのコンポーネントを必要とします。
|
|
274 `*' と書かれている関数は、
|
|
275 戻り値として
|
|
276 ヘッダー・コンポーネントの中の最初に書かれているアドレスだけを保持します。
|
|
277 .sp 1
|
|
278 .nf
|
|
279 .ta \w'Formataddr 'u +\w'Argument 'u +\w'Rboolean 'u
|
|
280 \fI関数\fR \fI引数の型\fR \fI戻り値\fR \fI説明\fR
|
|
281 proper addr string 正式な RFC\-822 表記
|
|
282 friendly addr string ユーザーに分かりやすい表記
|
|
283 addr addr string mbox@host または host!mbox 表記*
|
|
284 pers addr string 個人名*
|
|
285 note addr string コメント文*
|
|
286 mbox addr string ローカル・メールボックス*
|
|
287 mymbox addr integer ユーザーのアドレスか? (0=no,1=yes)
|
|
288 host addr string ホスト・ドメイン*
|
|
289 nohost addr integer ホスト名が書かれてない*
|
|
290 type addr integer ホストの形式* (0=ローカル,1=ネットワーク,
|
|
291 \-1=UUCP,2=分からない)
|
|
292 path addr string ホストの経路指定*
|
|
293 ingrp addr integer アドレスがグループに入っているか*
|
|
294 gname addr string グループ名*
|
|
295 formataddr expr \fIarg\fR を \fIstr\fR に(コンマで区切った)
|
|
296 アドレス・リストとして追加
|
|
297 putaddr literal アドレス・リスト \fIstr\fR を表示する。
|
|
298 引数がラベル(コンポーネント名)になる。
|
|
299 行の幅は \fInum\fR から得る。
|
|
300 .re
|
|
301 .fi
|
|
302
|
|
303 エスケープが入れ子になった場合、
|
|
304 最も内側のものから最も外側のものへと評価されていきます。
|
|
305 最も外側のエスケープは `%' が必要ですが、内側のエスケープは要りません。
|
|
306 例えば、
|
|
307
|
|
308 .ti +.5i
|
|
309 %<(mymbox{from}) To: %{to}%>
|
|
310
|
|
311 はヘッダー・コンポーネント \*(lqFrom:\*(rq の値を \fIstr\fR に書き出します。
|
|
312 それから (\fImymbox\fR\^) は \fIstr\fR を読み、
|
|
313 その結果を \fInum\fR に書き出します。
|
|
314 そして制御エスケープが \fInum\fR を評価します。もし \fInum\fR がゼロで
|
|
315 ない場合は、文字列 \*(lqTo: \*(rq とそれに続けてヘッダー・コンポーネント
|
|
316 \*(lqTo:\*(rq の値が表示されます。
|
|
317
|
|
318 (\fImymbox\fR\^{\fIcomp\fR\^}) について、補足説明をしておきましょう。
|
|
319 一般に、これはヘッダー・コンポーネント \*(lq\fIcomp\fR\*(rq にある
|
|
320 全てのアドレスを、ユーザーのメールボックス名及び全ての
|
|
321 \fIAlternate-Mailboxes\fR と比較します。
|
|
322 これは、どれかのアドレスと一致すれば、真を返しますが、
|
|
323 もし \*(lq\fIcomp\fR\*(rq ヘッダーがメッセージに存在しない場合も
|
|
324 真を返します。必要なら、この場合には (\fInull\fR\^) 関数で明示的に
|
|
325 調べておきましょう。
|
|
326 \fIAlternate-Mailboxes\fR に関しては \fImh-profile\fR\0(5) も参照して下さい。
|
|
327
|
|
328 関数エスケープまたはコンポーネント・エスケープが解釈され、
|
|
329 結果が直ちに表示される時には、
|
|
330 表示幅を指定する事が出来、与えられた文字数内にきっちりと表示されます。
|
|
331 例えば、%4(\fIsize\fR\^) というような数値のエスケープはメッセージのサイズを
|
|
332 多くとも 4桁で表示します。もし、桁あふれをした場合は、最初の位置に
|
|
333 `?' が出力されます(例えば `?234')。
|
|
334 %4(\fIme\fR\^) というような文字列のエスケープは最初の 4文字を表示し、
|
|
335 それ以降は切り捨てます。
|
|
336 表示幅より短い場合は、右側に指定の幅まで文字(通常、空白)を埋めます。
|
|
337 もし、表示幅指定がゼロから始まってる場合は、この埋める文字はゼロになります。
|
|
338
|
|
339 上述のように、
|
|
340 関数 (\fIputnumf\fR\^) と (\fIputstrf\fR\^) は、その結果を
|
|
341 先行する表示幅指定で指定された文字数で表示します。
|
|
342 例えば、
|
|
343 %06(\fIputnumf\fR\^(\fIsize\fR\^)) はメッセージのサイズを
|
|
344 6文字の幅で表示し、頭はゼロで埋められます。
|
|
345 %14(\fIputstrf\^\fR{\fIfrom\^\fR}) は
|
|
346 \*(lqFrom:\*(rq ヘッダー・コンポーネントを 14文字の幅で表示し、
|
|
347 後ろはスペースで埋められます。
|
|
348 \fIputstrf\fR に対して、
|
|
349 表示幅として、負の数を与えると、その文字列はその幅の中に右寄せで表示され、
|
|
350 埋められる文字は左側におかれます。
|
|
351 なお、関数 (\fIputnum\fR\^) と (\fIputstr\fR\^) は結果を必要最小限の文字数で
|
|
352 表示し、表示幅指定は無視します。
|
|
353
|
|
354 出力可能な表示幅は内部レジスタに保存されていて、
|
|
355 その幅を越える出力は全て捨てられます。
|
|
356
|
|
357 コメントは関数の引数が期待される場所を除いて、たいていの場所に置く事が
|
|
358 出来ます。コメントは `%;' で始まり、(エスケープされてない)改行で終ります。
|
|
359
|
|
360 これを全て頭に置いた上で、
|
|
361 ここに \fIscan\fR のデフォルトのフォーマット文字列があります。
|
|
362 これを読みやすくするために、いくつかの部分に分けます。
|
|
363 最初の部分は次の通りです。
|
|
364
|
|
365 .ti +.5i
|
|
366 %4(msg)%<(cur)+%| %>%<{replied}\-%?{encrypted}E%| %>
|
|
367
|
|
368 これはまず、メッセージ番号を 4桁で表示する事を表しています。
|
|
369 次に、メッセージがカレント・メッセージである場合は `+'、そうでない場合は
|
|
370 スペースを出力する事を表しています。
|
|
371 次に、もし \*(lqReplied:\*(rq 行が存在するなら `\-'、
|
|
372 存在しない場合は \*(lqEncrypted:\*(rq を調べ、
|
|
373 存在するなら `E'、そうでない場合はスペースを表示します。
|
|
374 次、
|
|
375
|
|
376 .ti +.5i
|
|
377 %02(mon{date})/%02(mday{date})
|
|
378
|
|
379 月と日をそれぞれ 2桁(一桁の場合は頭に 0 が付く)で、
|
|
380 スラッシュで区切って表示します。
|
|
381 そして、
|
|
382
|
|
383 .ti +.5i
|
|
384 %<{date} %|*%>
|
|
385
|
|
386 \*(lqDate:\*(rq 行が存在すればスペース、さもなくば `*'。
|
|
387 次、
|
|
388
|
|
389 .ti +.5i
|
|
390 %<(mymbox{from})%<{to}To:%14(friendly{to})%>%>
|
|
391
|
|
392 もしメッセージが自分が出したものであり、且つ \*(lqTo:\*(rq ヘッダーがあるなら、
|
|
393 `To:' と \*(lqTo:\*(rq 行の最初のアドレスをユーザーに分かりやすい表記で
|
|
394 表示します。
|
|
395 続いて、
|
|
396
|
|
397 .ti +.5i
|
|
398 %<(zero)%17(friendly{from})%>
|
|
399
|
|
400 もし、上記二つの条件判断のどちらかに失敗した場合、
|
|
401 \*(lqFrom:\*(rq 行がユーザーに分かりやすい表記で表示されます。
|
|
402 制御エスケープの条件判断は \fInum\fR レジスタに値を設定するので、
|
|
403 後でそれを利用する事によって、AND や OR の処理をさせる事が出来ます。
|
|
404 最後に、
|
|
405
|
|
406 .ti +.5i
|
|
407 %{subject}%<{body}<<%{body}%>
|
|
408
|
|
409 \*(lqSubject:\*(rq 行と ボディの最初の部分(あれば)を表示します。
|
|
410
|
|
411 もっと複雑な例として、
|
|
412 次はデフォルトの \fIreplcomps\fR フォーマット・ファイルを考えてみましょう。
|
|
413
|
|
414 .ti +.5i
|
|
415 %(lit)%(formataddr %<{reply-to}
|
|
416
|
|
417 まず \fIstr\fR レジスタを空にし、\*(lqReply-To:\*(rq ヘッダーが存在するなら
|
|
418 それを整形します。もし存在しないなら、以下の else-if 部分が実行されます。
|
|
419
|
|
420 .ti +.5i
|
|
421 %?{from}%?{sender}%?{return-path}%>)\\
|
|
422
|
|
423 \*(lqFrom:\*(rq、\*(lqSender:\*(rq、そして \*(lqReturn-Path:\*(rq
|
|
424 ヘッダーのうち一つが存在した時点で止まります。で、
|
|
425
|
|
426 .ti +.5i
|
|
427 %<(nonnull)%(void(width))%(putaddr To: )\\n%>\\
|
|
428
|
|
429 もし \fIformataddr\fR の結果が空でなかった場合、
|
|
430 それがアドレスとして \fIwidth\fR の幅で (必要なら行を折り返して)、
|
|
431 頭に \*(lqTo: \*(rq をつけて表示します。
|
|
432
|
|
433 .ti +.5i
|
|
434 %(lit)%(formataddr{to})%(formataddr{cc})%(formataddr(me))\\
|
|
435
|
|
436 \fIstr\fR を空にし、
|
|
437 \*(lqTo:\*(rq と \*(lqCc:\*(rq ヘッダー、そしてユーザーのアドレス
|
|
438 (\fIrepl\fR の \*(lq\-cc\*(rq オプションで何を指定したかに依る)が
|
|
439 整形されます。
|
|
440
|
|
441 .ti +.5i
|
|
442 %<(nonnull)%(void(width))%(putaddr cc: )\\n%>\\
|
|
443
|
|
444 結果が空でない場合は、上と同じように \*(lqcc: \*(rq を付けて表示します。
|
|
445
|
|
446 .ti +.5i
|
|
447 %<{fcc}Fcc: %{fcc}\\n%>\\
|
|
448
|
|
449 もし \fIrepl\fR に \*(lq\-fcc\ folder\*(rq オプションが指定された場合
|
|
450 (%{\fIfcc\fR\^} に関する詳細は \fIrepl\fR\0(1) を参照)、
|
|
451 \*(lqFcc:\*(rq ヘッダーが出力されます。
|
|
452
|
|
453 .ti +.5i
|
|
454 %<{subject}Subject: Re: %{subject}\\n%>\\
|
|
455
|
|
456 \*(lqSubject:\*(rq コンポーネントが存在する時は、
|
|
457 適切な返信サブジェクトが出力されます。
|
|
458
|
|
459 .nf
|
|
460 .ti +.5i
|
|
461 %<{date}In-reply-to: Your message of "\\
|
|
462 .ti +.5i
|
|
463 %<(nodate{date})%{date}%|%(pretty{date})%>."%<{message-id}
|
|
464 .ti +.5i
|
|
465 %{message-id}%>\\n%>\\
|
|
466 .ti +.5i
|
|
467 \-\-\-\-\-\-\-\-
|
|
468 .fi
|
|
469
|
|
470 もし \*(lqDate:\*(rq コンポーネントが存在するなら、
|
|
471 \*(lqIn-Reply-To:\*(rq ヘッダーが \*(lqYour message of \*(rq を付けて
|
|
472 表示します。
|
|
473 もし、日付が解析可能なら、ユーザーに分かりやすい形式で出力されます。
|
|
474 さもなくば、そのまま出力します。
|
|
475 \*(lqMessage-ID:\*(rq があれば、それも含めます。
|
|
476 ダッシュ(`\-')の列は生のテキストなので、そのまま出力されます。
|
|
477
|
|
478 この最後の部分はもうちょっと詳しく述べるのに良い例です。
|
|
479 ここにその部分を再び仮想的なコードで書いてみましょう。
|
|
480 .sp 1
|
|
481 .nf
|
|
482 .in +.5i
|
|
483 .ta .5i 1i 1.5i 2i
|
|
484 if (comp_exists(date)) then
|
|
485 print (\*(lqIn-reply-to: Your message of \\\*(lq\*(rq)
|
|
486 if (not_date_string(date.value)) then
|
|
487 print (date.value)
|
|
488 else
|
|
489 print (pretty(date.value))
|
|
490 endif
|
|
491 print (\*(lq\\\*(rq\*(rq)
|
|
492 if (comp_exists(message-id)) then
|
|
493 print (\*(lq\\n\\t\*(rq)
|
|
494 print (message-id.value)
|
|
495 endif
|
|
496 print (\*(lq\\n\*(rq)
|
|
497 endif
|
|
498 .re
|
|
499 .in -.5i
|
|
500 .fi
|
|
501 .sp 1
|
|
502 これは複雑に見えますが、実際上、
|
|
503 この方法は個々のヘッダー行を取り出し、
|
|
504 ユーザーが好む任意の形式で出力するのに充分に柔軟性のあるものです。
|
|
505 .Fi
|
|
506 無し。
|
|
507 .Pr
|
|
508 無し。
|
|
509 .Sa
|
|
510 scan(1), repl(1), ap(8), dp(8)
|
|
511 .De
|
|
512 無し。
|
|
513 .Co
|
|
514 無し。
|
|
515 .Hi
|
|
516 このソフトは MH 6.3 のために寄贈されました。その前までは、
|
|
517 出力形式の指定はもっと書き易いものでしたが、極めて柔軟性に欠けるものでした。
|
|
518 .Bu
|
|
519 \fIMH\fR を BERK オプション付で構築したホストでは、
|
|
520 アドレスの解析は出来ません。
|
|
521 .En
|