PPxでListFileを使ってみる−Grepと組み合わせ

ListFileというのがある

ListFileというものがPPxにはあります。これは、テキストファイルの一番上に「;ListFile」とつけて、その下にパスを書いておくとそれを仮想ディレクトリとして扱えるというもの。

;ListFile
D:\data\ex-howm\ぷよぷよ\00_INDEX.txt
D:\data\ex-howm\ぷよぷよ\2010-01-25-035054.howm
D:\data\ex-howm\ぷよぷよ\2010-01-25-070706.howm
D:\data\ex-howm\ぷよぷよ\2010-01-28-202739.howm
D:\data\ex-howm\ぷよぷよ\2010-01-31-084726.howm
D:\data\ex-howm\ぷよぷよ\2010-02-12-203507.howm
D:\data\ex-howm\ぷよぷよ\2010-02-14-022249.howm

みたいにしておくと、こんな感じの仮想ディレクトリになる。

ヘルプでは、次のように書かれている。

PPcのWhereIsなどで使用しています。また、次の時にも使えます。
・あちこちのディレクトリに散らばっているよく使うファイルを1つのディレクトリにまとめたいとき。
・外部の検索アプリケーションなどで得た結果一覧をPPcで参照・利用したいとき。

ListFileでGrep

で、これの使い方だが「外部の検索アプリケーションなどで得た結果一覧をPPcで参照・利用したいとき。」というのがおもしろいんじゃないかなと。ListFileというのは、ただのパスが羅列したテキストファイルだからそれを外部ソフトを使って作るのも簡単なんですね。あちこちに散らばっているのをまとめる、というのは、フォルダ構造を工夫するとかfenrirやEverythingとかで何とかなりそうだしね。でも、ListFileの中身のパスを手動で登録するのではなく、自動で登録するような仕組みがあったらこっちの使い方もおもしろいかも。
外部の検索アプリケーションということで、とりあえず思いついたのがGrep。今回はこれで、ListFileを作ってみたいと思います。微妙に、連動ビューからの話とつながってたりなかったり。

説明

ということで今回は、現在のフォルダにあるテキストファイルをGrepして、ヒットしたファイルのみを仮想ディレクトリに表示する、ということをします。
いわば、howmGrepでやってた必要なファイルの絞り込みみたいなのが、PPxでできるようになるわけですね。

とりあえず必要になるものについて

Paper Plane xUI Script Module

これを使うと、*script というのが使えるようになる。連動ビューのとこでも使ってましたね。TORO's Libraryでダウンロードしてきます。

この PPXSCR.DLL は、WSH(Windows Scripting Host) のように
ActiveX Scripting Host を利用して PPx 上でスクリプトを実行する
PPx Module です。

とのこと。

GNU Grep

GNUという、UNIXのコマンドを集めたものがあってその中の一つがこれ。
他にはCYGWINというのも有名らしいけど、そっちの方は特定のDLLを用意してないと駄目とか何とか。
windows用にコンパイルされたのが、ここにあるみたいです。
では、コードを。

PPxGrep.js

//!*script

var WshShell = new ActiveXObject("WScript.Shell");
var ListFileName,SearchString,FolderName,GrepExe;

ListFileName = PPx.Extract("%0" + "\\Script\\PathList.txt");
SearchString = PPx.Extract("%E");
FolderName = PPx.Extract("%1"+"\\*");
GrepExe = PPx.Extract("%0" + "\\grep.exe");


GrepCmd = GrepExe + " -F -l " + SearchString + " " + FolderName;
oExec = WshShell.Exec(GrepCmd);


//ファイルシステムオブジェクトの作成
objFileSys = new ActiveXObject("Scripting.FileSystemObject");
objOutFile = objFileSys.OpenTextFile(ListFileName, 2);

//テキストファイルへの書き込み
objOutFile.WriteLine(";ListFile");
objOutFile.WriteLine(oExec.StdOut.ReadAll());

//テキストファイルのクローズ
objOutFile.Close();

PPx.Execute("%j" + ListFileName);

重要そうなの解説

一応言っておくとこのコードを実行して何が起こっても責任とりません。
間違いとかあったら指摘してくれるとうれしいです。

JScript

PPxでは、WSHに対応している。今回はその中のJScriptを使ってます。
JScriptの場合は、一行目に

//!*script

と書くとPPxスクリプトと認識するらしい。

また、PPx独自の情報は次のようにして取得できる。

PPx.Extract("%E");
PPx.Extract("%R");

%Eは、一行編集ボックスを出すもの。%Rは、カレントディレクトリのパスを返します。詳しくはPPXSCR.TXTを見てください。

Grep

Grepは、

grep (option) [検索文字列] [file name]

というようにすると、ヒットしたファイルパスを返してくれる。
検索文字列には、PPxの編集ボックスから打ち込まれたものが。file nameにはカレントディレクトリが入ります。
optionですが、このコードでは二つつけています。

GrepCmd = GrepExe + " -F -l " + SearchString + " " + FolderName;

の真ん中の" -F -l "ですね。

  • F 指定した検索パターンが正規表現ではなく、普通の文字列として扱われる。
  • l パターンに一致した行を含むファイル名だけを出力する

です。

作ったリストファイルを開く設定

PPx.Execute("%j" + ListFileName);

これで、Grepが完了すると同時にその仮想ディレクトリを開けるようになる。

PPxに登録

上のコードを、PPxGrep.jsという名前で、Scriptフォルダに保存。またScriptフォルダに、ListPath.txtを作っておく。これがListFileになります。
また、GNUGrep.exeを、PPxフォルダにおいておく。
そして、適当なキーに次のコマンドを登録。

*script %0\Script\PPxGrep.js

これで、Grepをかけたいディレクトリに入って、登録したキーを押せば検索キーを入力するダイアログが出て、それにヒットした仮想ディレクトリにいけるというわけですね。

実行しているSSをいくつか載せておきます。

Grepをかけたいディレクトリで、PPxGrep.jsを登録したキーを押す

検索キーワードを入力

仮想ディレクトリにキーワードが入ったファイルが表示される

たしかにキーワード入ってますね^^


後書き

こういうスクリプトを作ってよく思うこと。そもそも使うのか?ということです^^;
まあこういうこともできるよ、ということで。もっとListFileって色々使えると思うから、そのきっかけにでもなったらいいな。

ListFileって他にも使い道あるんでしょうか。僕はこれくらいしか思いつかなかった。というよりあまり外部アプリケーションってしらないのです。もっと他に便利なのもあるのでしょうか。誰か教えてください。
たとえば、Hyper Estraierでインデックスを作ってむにゃむにゃとか、メモファイルをカード型データベースみたくするとか。あるいはファイルを監視してListFileを自動で更新する仕組みを作って仮想ディレクトリに常に自分にとって有用なファイルが並んでいるだとか。このコードって、Grepの部分だけ変えたら何にでも使えそうな気がするんだよね。夢がひろがりんぐwwwwwww

今度は、コメントファイルを使ってテキストファイルの一行目を表示というのをする予定。
どう考えてもここでやってることって、ファイラの域を超えてるよな。コメントファイルもそうだけど。PPx、恐ろしい子