=encoding utf8 =head1 NAME optex - 汎用コマンド・オプション・ラッパー =head1 VERSION Version 1.02 =head1 SYNOPSIS B I [ B<-M>I ] ... または I -> B シンボリックリンク、または B I [ -l | -m ] ... --link, --ln create symlink --unlink, --rm remove symlink --ls list link files --rc list rc files --nop, -x disable option processing --[no]module disable module option on arguments =cut =head1 DESCRIPTION BはPerlモジュールLを利用した汎用コマンドオプション処理ラッパーです。これにより、ユーザはシステム上のあらゆるコマンドに対して独自のオプション・エイリアスを定義し、モジュール形式の拡張性を提供することができます。 対象となるコマンドは引数として与えられます: % optex command またはBへのシンボリックリンクファイルとして指定します: command -> optex 設定ファイルF<~/.optex.d/>I<コマンド>F<.rc>が存在する場合、実行前に評価され、コマンド引数はそれを使用して前処理されます。 =head2 OPTION ALIASES C<-I[TIMESPEC]>オプションを持たないmacOSのCコマンドを思い浮かべてほしい。Bを使い、F<~/.optex.d/date.rc>ファイルに次のような設定をすることで実装できます。 option -I -Idate option -Idate +%F option -Iseconds +%FT%T%z option -Iminutes +%FT%H:%M%z option -Ihours +%FT%H%z option --iso-8601 -I option --iso-8601=date -Idate option --iso-8601=seconds -Iseconds option --iso-8601=minutes -Iminutes option --iso-8601=hours -Ihours 次のコマンドは期待通りに動作します。 % optex date -Iseconds コマンドの検索パスにシンボリックリンクC<< date -> optex >>がある場合は、標準コマンドと同じように使用できますが、サポートされていないオプションがあります。 % date -Iseconds 共通設定はF<~/.optex.d/default.rc>ファイルに保存され、これらのルールはBを介して実行されるすべてのコマンドに適用されます。 実際には、C<--iso-8601>オプションはこのように簡単に定義できる: option --iso-8601 -I$ これはほとんどの場合うまくいくが、このようにC<--iso-8601>オプションだけを先行させると失敗する: % date --iso-8601 -u =head2 COMMAND ALIASES Bのコマンドエイリアスは、シェルのエイリアス機能と変わりませんが、ツールやスクリプトからコマンドとして実行でき、設定ファイルで一括管理できる点が効果的です。 コマンドエイリアスは、このように設定ファイル(F<~/.optex.d/config.toml>)で設定することができる: [alias] tc = "optex -Mtextconv" このようにCからCへシンボリックリンクを張ることができる: % optex --ln tc また、F<$HOME/.optex.d/bin>をC環境にインクルードします。 Cモジュールは、引数として与えられたファイルをプレーンテキストに変換するために使うことができます。このように定義すると、Wordファイルは次のように比較できます。 % tc diff A.docx B.docx エイリアス名はrcファイルとモジュール・ディレクトリを見つけるために使われます。上の例では、F<~/.optex.d/tc.rc>とF<~/.optex.d/tc/>が参照されます。 設定ファイルにシェルスクリプトを記述することも可能です。次の例は、CシェルCコマンドを実装したものです。 [alias] repeat = [ 'bash', '-c', ''' while getopts 'c:i:' OPT; do case $OPT in c) count=$OPTARG;; i) sleep=$OPTARG;; esac done; shift $((OPTIND - 1)) case $1 in [0-9]*) count=$1; shift;; esac while ((count--)); do eval "$*" [ "$sleep" ] && (( count > 0 )) && sleep $sleep done ''', 'repeat' ] Lセクションを読んでください。 =head2 MACROS 複雑な文字列はマクロCを使って合成できます。次の例は、テキスト中の母音を数えるawkスクリプトで、ファイルF<~/.optex.d/awk.rc>で宣言します。 define __delete__ /[bcdfgkmnpsrtvwyz]e( |$)/ define __match__ /ey|y[aeiou]*|[aeiou]+/ define __count_vowels__ < ディレクティブが便利です。CはC