みなさん、こんにちは。

しばらく fl マクロから離れていましたが、やっとマクロの機能拡張の話に戻ることができます。

課題をもう一度整理してみましょう。

#argument の戻り値でどの alternative が入力されたかが分かるという話をしました。そうすると次は alternative ごとに処理を分けたくなりますね。つまり条件分岐が必要になります。そこで #if の登場です。

  • ファイル名にワイルドカードを指定したい。
  • パラメータなしでも動いてほしい。
  • ファイル名を複数指定したい。
  • 最終オープン日時の他に作成日時や更新日時に対応したい。

B については

に読み替えてやればいいので A を実現できれば B はすぐに実現できそうです。

さあここでもう一度 fl マクロのソースを眺めてみましょう。

まずは「A ワイルドカードに対応」です。ワイルドカードをパラメータとして取り込むには、#argument に TEMPLATE alternative を指定すればできましたね。今の fl マクロは、fn1 variable にファイル名を格納するように作っていますのでワイルドカードに相当する個別ファイル名を fn1 variable に格納してやれば動作します。ワイルドカードに相当する個別ファイルは複数あることを考慮すると

  • ワイルドカード(=テンプレート)を何かの variable に代入
  • そのワイルドカードに相当するファイル名を fn1 variable に代入する
  • 現在の fl マクロロジックを使って表示する
  • 次のファイル名をワイルドカードから抽出し fn1 variable に代入する
  • 3 に戻る

というフローで実現できそうです。「1 ワイルドカードを variable に代入」は次のようにしましょう。

#argument/value tmp/TEMPLATE END

B パラメータなしでも動作」の場合は END がヒットすることになります。 この場合には tmp variable が空白になるので * を代入しておきます。これで b. は実装完了です。お手軽ですね。

2 ワイルドカードからファイル名を取りだす」は、#filenames という built-in function を使って次のようにします。

#set fn1 [#filenames/maximum 1/ [tmp]]

4 次のファイル名を取りだす」もやはり #filenames built-in functionを使いますが、オプションが少し変わります。

#set fn1 [#filenames/maximum 1, previous [fn1]/ [tmp]]

5 3 に戻る」は #loop で実現できそうです。

まとめると、A / B を実装した段階でマクロは次のようになります。

実行してみましょう。複数のファイルがある subvol を指定してみます。

結果が出るには出たけれど……美しくありません。その理由はVOL名などのタイトル行がファイル毎に印字された点です。原因は明らかでブレイク処理が入っていないせいですね。ブレイク条件は「 sb2 variable の内容が変更されたとき」で、そのときだけタイトル行を印字すればいいわけです。

breakvol variable を使ってブレイク条件をコントロールしています。

これでずいぶんと見やすくなりました。

次回は「 C ファイル名複数指定」です。Au revoir!