NAME

optex - 汎用コマンドオプションラッパー

VERSION

Version 1.02

SYNOPSIS

optex コマンド [ -Mモジュール ] ...

または コマンド -> optex シンボリックリンク、または

optex オプション [ -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

DESCRIPTION

optexはPerlモジュールGetopt::EXを利用した汎用コマンドオプション処理ラッパーです。ユーザーはシステム上の任意のコマンドに対して自分自身のオプションエイリアスを定義し、モジュールスタイルの拡張性を提供することができます。

対象のコマンドは引数として与えられます:

% optex command

またはoptexへのシンボリックリンクされたファイルとして:

command -> optex

設定ファイル~/.optex.d/コマンド.rcが存在する場合、実行前に評価され、その設定を使用してコマンド引数が事前処理されます。

OPTION ALIASES

macOSのdateコマンドを考えてみましょう。これには-I[TIMESPEC]オプションがありません。optexを使用すると、~/.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

コマンド検索パスにdate -> optexのシンボリックリンクが見つかった場合、標準コマンドと同じように使用できますが、サポートされていないオプションも使用できます。

% date -Iseconds

共通の設定は~/.optex.d/default.rcファイルに保存され、それらのルールはoptexを通じて実行されるすべてのコマンドに適用されます。

実際には、--iso-8601オプションはこのように単純に定義することができます:

option --iso-8601 -I$<shift>

これはほとんどの場合うまく動作しますが、他のオプションの前に単独で--iso-8601オプションがある場合には失敗します:

% date --iso-8601 -u

COMMAND ALIASES

optexのコマンドエイリアスはシェルのエイリアス機能と変わりませんが、ツールやスクリプトからコマンドとして実行できる点、設定ファイルで一括管理できる点が有効です。

コマンドエイリアスは、設定ファイル(~/.optex.d/config.toml)にこのように設定できます:

[alias]
    tc = "optex -Mtextconv"

次のようにtcからoptexへのシンボリックリンクを作成できます:

% optex --ln tc

そして、$HOME/.optex.d/binをあなたのPATH環境に含めます。

textconvモジュールは、引数として与えられたファイルをプレーンテキストに変換するために使用できます。このように定義すると、Wordファイルは次のように比較できます。

% tc diff A.docx B.docx

エイリアス名はrcファイルとモジュールディレクトリを見つけるために使用されます。上記の例では、~/.optex.d/tc.rc~/.optex.d/tc/が参照されます。

設定ファイルにシェルスクリプトを書くことも可能です。次の例は、Cシェルのrepeatコマンドを実装しています。

[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' ]

"CONFIGURATION FILE"セクションを読んでください。

MACROS

マクロdefineを使用して複雑な文字列を構成することができます。次の例は、テキスト内の母音を数えるawkスクリプトで、~/.optex.d/awk.rcファイルに宣言されます。

define __delete__ /[bcdfgkmnpsrtvwyz]e( |$)/
define __match__  /ey|y[aeiou]*|[aeiou]+/
define __count_vowels__ <<EOS
{
    s = tolower($0);
    gsub(__delete__, " ", s);
    for (count=0; match(s, __match__); count++) {
        s=substr(s, RSTART + RLENGTH);
    }
    print count " " $0;
}
EOS
option --vowels __count_vowels__

これは次のように使用できます:

% awk --vowels /usr/share/dict/words

複雑なオプションを設定する場合、expandディレクティブが便利です。expandoptionとほぼ同じように動作しますが、ファイルスコープ内でのみ有効であり、コマンドラインオプションでは使用できません。

expand repository   ( -name .git -o -name .svn -o -name RCS )
expand no_dots      ! -name .*
expand no_version   ! -name *,v
expand no_backup    ! -name *~
expand no_image     ! -iname *.jpg  ! -iname *.jpeg \
                    ! -iname *.gif  ! -iname *.png
expand no_archive   ! -iname *.tar  ! -iname *.tbz  ! -iname *.tgz
expand no_pdf       ! -iname *.pdf

option --clean \
        repository -prune -o \
        -type f \
        no_dots \
        no_version no_backup \
        no_image \
        no_archive \
        no_pdf

% find . --clean -print

MODULES

optexはモジュール拡張もサポートしています。dateの例では、モジュールファイルは~/.optex.d/date/ディレクトリにあります。デフォルトモジュール~/.optex.d/date/default.pmが存在する場合、実行のたびに自動的にロードされます。

これは通常のPerlモジュールなので、パッケージ宣言と最後の真値が必要です。その間には、任意のPerlコードを入れることができます。例えば、次のプログラムはdateコマンドを実行する前に環境変数LANGCに設定します。

package default;
$ENV{LANG} = 'C';
1;

% /bin/date
2017年 10月22日 日曜日 18時00分00秒 JST

% date
Sun Oct 22 18:00:00 JST 2017

他のモジュールは-Mオプションを使用してロードされます。他のオプションとは異なり、-Mは引数リストの最初に置かなければなりません。~/.optex.d/date/ディレクトリのモジュールファイルはdateコマンド専用です。モジュールが~/.optex.d/ディレクトリに配置されている場合、すべてのコマンドから使用できます。

-Mesモジュールを使用したい場合は、次の内容で~/.optex.d/es.pmファイルを作成します。

package es;
$ENV{LANG} = 'es_ES';
1;

% date -Mes
domingo, 22 de octubre de 2017, 18:00:00 JST

指定されたモジュールがライブラリパスに見つからない場合、optexはオプションを無視し、直ちに引数処理を停止します。無視されたオプションは対象のコマンドにそのまま渡されます。

モジュールはサブルーチンコールと共に使用されます。例えば ~/.optex.d/env.pm モジュールは以下のようになります:

package env;
sub setenv {
    while (($a, $b) = splice @_, 0, 2) {
        $ENV{$a} = $b;
    }
}
1;

それから、より一般的な方法で使用することができます。次の例では、最初のフォーマットは読みやすいですが、特殊文字をエスケープする必要がないため、2番目のものの方がタイプしやすいです。

% date -Menv::setenv(LANG=de_DE) # need shell quote
% date -Menv::setenv=LANG=de_DE  # alternative format
So 22 Okt 2017 18:00:00 JST

オプションエイリアスもモジュールの最後に、特別なリテラル __DATA__ の後に宣言することができます。これを使用して、異なる目的のための複数のオプションセットを準備することができます。一般的な i18n モジュールについて考えてみてください:

package i18n;
1;
__DATA__
option --cn -Menv::setenv(LANG=zh_CN) // 中国語 - 簡体字
option --tw -Menv::setenv(LANG=zh_TW) // 中国語 - 繁体字
option --us -Menv::setenv(LANG=en_US) // 英語
option --fr -Menv::setenv(LANG=fr_FR) // フランス語
option --de -Menv::setenv(LANG=de_DE) // ドイツ語
option --it -Menv::setenv(LANG=it_IT) // イタリア語
option --jp -Menv::setenv(LANG=ja_JP) // 日本語
option --kr -Menv::setenv(LANG=ko_KR) // 韓国語
option --br -Menv::setenv(LANG=pt_BR) // ポルトガル語 - ブラジル
option --es -Menv::setenv(LANG=es_ES) // スペイン語
option --ru -Menv::setenv(LANG=ru_RU) // ロシア語

これは以下のように使用することができます:

% date -Mi18n --tw
2017年10月22日 週日 18時00分00秒 JST

~/.optex.d/optex.rc にオートロードモジュールを宣言することができます:

autoload -Mi18n --cn --tw --us --fr --de --it --jp --kr --br --es --ru

その後、モジュールオプションなしでそれらを使用することができます。この場合、オプション --ru は自動的に -Mi18n --ru に置き換えられます。

% date --ru
воскресенье, 22 октября 2017 г. 18:00:00 (JST)

モジュール i18nGetopt::EX::i18n として実装されており、この配布に含まれています。したがって、追加のインストールなしで上記のように使用することができます。

STANDARD MODULES

標準モジュールは App::optex にインストールされており、App::optex プレフィックスの有無にかかわらずアドレス指定することができます。

Getopt::EX MODULES

独自のモジュールに加えて、optexGetopt::EX モジュールも使用することができます。インストールされている標準の Getopt::EX モジュールはこれらです。

OPTIONS

これらのオプションは、optex がシンボリックリンクから実行された場合には効果がありません。

CONFIGURATION FILE

起動時に、optex は TOML 形式で書かれることを想定している設定ファイル ~/.optex.d/config.toml を読み込みます。

PARAMETERS

FILES AND DIRECTORIES

ENVIRONMENT

SEE ALSO

Getopt::EX, Getopt::EX::Loader, Getopt::EX::Module

App::optex::textconv

App::optex::xform

AUTHOR

Kazumasa Utashiro

LICENSE

You can redistribute it and/or modify it under the same terms as Perl itself.

Copyright ©︎ 2017-2025 Kazumasa Utashiro