The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

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

VERSION

Version 1.00

SYNOPSIS

optex command [ -Mmodule ] ...

または command -> optex シンボリックリンク、または

optex options [ -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

-I[TIMESPEC]オプションを持たないmacOSのdateコマンドを思い浮かべてほしい。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

コマンド・エイリアスは設定ファイルで次のように設定できる:

    [alias]
        pgrep = [ "greple", "-Mperl", "--code" ]

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

"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モジュールを宣言する:

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

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

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

モジュールi18nGetopt::EX::i18nとして実装され、本ディストリビューションに含まれています。そのため、追加インストールすることなく、上記のように使用することができます。

STANDARD MODULES

標準モジュールはApp::optexにインストールされ、App::optex接頭辞の有無にかかわらず対応できます。

-Mhelp

利用可能なオプションリストを表示します。オプション名は、置換形式、または定義されていればヘルプメッセージとともに表示されます。ヘルプメッセージを省略するには -x オプションを使います。

オプション --man または -h は、利用可能であればドキュメントを表示します。オプション -l はモジュールパスを表示します。オプション -m はモジュールそのものを表示します。他のモジュールの後に使われた場合は、最後に宣言されたモジュールに関する情報を表示します。次のコマンドは second モジュールに関するドキュメントを表示します。

    optex -Mfirst -Msecond -Mhelp --man
-Mdebug

デバッグメッセージを表示します。

-Mutil::argv

コマンド引数を操作するモジュール。詳しくはApp::optex::util::argvを参照してください。

-Mutil::filter

コマンド入出力フィルタを実装するモジュール。詳しくはApp::optex::util::filterを参照してください。

Getopt::EX MODULES

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

-Mi18n (Getopt::EX::i18n)

以下のようにするとギリシャ暦を表示することができます:

    optex -Mi18n cal --gr

OPTIONS

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

--link, --ln [ command ]

~/.optex.d/binディレクトリにシンボリックリンクを作成します。

--unlink, --rm [ -f ] [ command ]

~/.optex.d/binディレクトリのシンボリックリンクを削除します。

--ls [ -l ] [ command ]

~/.optex.d/binディレクトリのシンボリックリンクファイルをリストします。

--rc [ -l ] [ -m ] [ command ]

~/.optex.dディレクトリのrcファイルをリストします。

--nop, -x command

オプション操作を停止します。それ以外はフルパス名を使用します。

--[no]module

optexはデフォルトでターゲットコマンドのモジュールオプション(-M)を扱う。しかし、同じオプションを独自の目的で使用するコマンドもあります。--nomodule オプションはその動作を無効にします。他のオプションの解釈は有効であり、rcファイルやモジュールファイルでmoduleオプションを使用しても問題はありません。

--exit status

通常、optexはコマンドを実行した状態で終了します。このオプションはそれを上書きし、指定したステータスコードで強制終了します。

CONFIGURATION FILE

optexは起動時にTOML形式で書かれた設定ファイル~/.optex.d/config.tomlを読み込みます。

PARAMETERS

no-module

optexがモジュールオプション-Mを解釈しないコマンドを設定します。optexがモジュールオプション--no-moduleを解釈しないコマンドを設定します。

    no-module = [
        "greple",
        "pgrep",
    ]
alias

コマンド・エイリアスを設定します。例

    [alias]
        pgrep = [ "greple", "-Mperl", "--code" ]
        hello = "echo -n 'hello world!'"

コマンドエイリアスは、シンボリックリンクとコマンド引数から呼び出すことができます。

FILES AND DIRECTORIES

PERLLIB/App/optex

システムモジュールディレクトリ

~/.optex.d/

個人用ルートディレクトリ

~/.optex.d/config.toml

設定ファイル

~/.optex.d/default.rc

共通スタートアップファイル

~/.optex.d/command.rc

コマンドのスタートアップファイル

~/.optex.d/command/

コマンドのモジュール・ディレクトリ

~/.optex.d/command/default.pm

コマンドのデフォルトモジュール

~/.optex.d/bin

シンボリックリンクを格納するデフォルトのディレクトリ。

これは必要ませんが、optexのシンボリックリンクを格納する特別なディレクトリを作り、コマンドの検索パスに置くとよい。そうすれば、パスからの追加/削除やシンボリックリンクの作成/削除が簡単にできます。

ENVIRONMENT

OPTEX_ROOT

デフォルトのルートディレクトリ~/.optex.dを上書きします。

OPTEX_CONFIG

デフォルトの設定ファイル OPTEX_ROOT/config.toml を上書きします。

OPTEX_MODULE_PATH

コロン(:)で区切られたモジュールパスを設定します。これらは標準パスの前に挿入されます。

OPTEX_BINDIR

デフォルトのシンボリックリンクディレクトリ OPTEX_ROOT/bin を上書きします。

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-2024 Kazumasa Utashiro