PPx

Paper Plane xUI(PPx)とLinuxコマンドの連携

More than 1 year has passed since last update.

PPxからLinuxコマンド等、外部コマンドの実行は、まずショートカットキーやメニュー、ファイル判別時に実行されるコマンド群登録内容を設定し、そこから直接、もしくはPPb経由で行えます。

なお、この登録内容の事を、この記事内では便宜上「コマンド群」と呼ぶ事にします。

commands.png


コマンド群で出来る事

以下の事が出来ます、詳しくは公式HELPへ。


  • 外部コマンドの実行


    • %Ob、または%OBでPPb経由で実行



  • 内部コマンドの実行


    • 上記画像で見えてる「*script」はPPx Script Moduleで追加されるスクリプトを実行するコマンド



  • 環境変数やエイリアスの展開


    • %'ARG'、%'ALIAS'等で展開



  • マクロ文字の利用


    • %FCで選択中のファイル名、等



  • *ifmatchによる条件分岐

これらを連携しコマンド群を書くことが出来ますので、一種のスクリプトのようになっています。

例えば、以下のようなコマンド群の場合

%OB echo %#

PPb経由でechoコマンドを実行し、選択したエントリー一覧を引数として渡して表示します、選択したエントリーの数が多いと自動で複数回の実行に分割されます。

%OB echo %FC

この場合は、エントリーの数分だけエントリーが一つ一つ渡されてechoが実行されます。


Linuxコマンドとの連携方法

エントリー一覧をLinuxコマンドへ渡したり、将来的にLinuxコマンドの実行結果をListFileに出力したいとなると、コマンド群の実行は一度で抑えたくなります。

%#でも引数の最大幅を超えると分割動作する為、この辺りの処理を自作します。

スクリプト内で外部コマンドを実行する処理を書く方法もありますが、こちらはパイプが使えない、標準出力へ出せない、引数の最大幅の制限がある、等の影響を受けます。

ではどうするかというと、エントリー一覧をテキストファイルに吐き出し、そこから標準出力へ吐きだします、そうすればあとはパイプとxargsがありますのでLinuxコマンドの連携は何とかなります。


エントリー一覧のテキストファイル書き出し

この処理は、JScriptで書きます。


entry2file.js

//!*script

//
// エントリー一覧をfilepathへと書き出す
// 引数のサイズ制限の為に実行が複数へと分けられないようにするのに使用
//
// PPx.Arguments.item(0) : 対象のファイルパス
//

var filepath = PPx.Arguments.item(0);
if (filepath == '') {
PPx.Echo('not found path');
PPx.Quit(-1);
}

// エントリー一覧をファンクタへと渡す
function enumEntryName(callback) {
for (var items = new Enumerator(PPx.Entry); !items.atEnd(); items.moveNext()) {
callback(items.item().Name);
}
}

// エントリー一覧の書き出し
// ListFileの場合
//file.WriteLine(";ListFile");
//file.WriteLine(";Base=" + PPx.Extract("%1") + "|1");
var fs = new ActiveXObject("Scripting.FileSystemObject");
var file = fs.OpenTextFile(filepath, 2, true);
enumEntryName(function (entryName) {
file.WriteLine(entryName);
});
file.Close();



エントリー一覧テキストから標準出力への吐き出し

エントリー一覧は単純な一覧テキストのため、catコマンド出力で十分です。

スクリプトのパスを各自の環境に合わせて下さい。


コマンド群

*set ENTRY_FILE=%'temp'\entryfile.tmp

*script %0\script\entry2file.js, %'ENTRY_FILE'
%OBsq cat %'ENTRY_FILE' | nkf -Lu -w

JScript作られたテキストは改行コードがCRLF、文字コードがsjisの為、標準出力をLinuxコマンド用にnkfでUTF8のLFに変換しています。

あとはこの標準出力をパイプで受け取れば、Linuxコマンドと連携するコマンド群を一度の実行に抑える事が出来ます。


終わりに

この記事では連携部分の触りだけを紹介しました、複数の記事で紹介する関係上、各記事毎にスクリプト等が小出しになっており把握し辛くなっています、申し訳ないです。

全記事を書ききったら僕が利用している設定やスクリプトをまとめてアップしようと思います。