Paper Plane xUI において開いているタブをListfileで表示してインクリメンタルサーチ
たくさんタブを開いていると、タブの選択もインクリメンタルサーチを使いたくなるのでListFileを使ってなんとかしてみた。
#PPx fenrir を使ってインクリメンタルサーチでタブを選択 - hokorobiの日記 を使っていたけれど fenrir の起動が遅くて嫌になった。
こんなスクリプトを *script で実行。
//!*script
// 開いているタブをListfileで表示してインクリメンタルサーチ
// fenrir を使っていたけど、起動が遅いので ListFile を使ってみる。
// PPx 1.41 x64 + Script Module R14
var tabs = PPx.Pane.Tab;
if (tabs.Count < 3) PPx.Quit(); // 非表示のタブがなければ何もしない
// 重複を除いた非表示のパスを取得。
// path をkeyとする連想配列作成。0 は表示されているパス、1 は非表示のパス。
var paths = {};
var tab = '';
var path = '';
for (var i = 0; i < tabs.Count; i++) {
tab = tabs.Item(i);
path = tab.Extract('%D');
if (paths[path] != undefined && paths[path] == 0) continue;
tab.Type == -2 ? paths[path] = 1 : paths[path] = 0;
}
// 非表示のパスがなければ何もしない
// Object.keys(paths).length は使えなかった。
var pathscnt = 0;
for (var path in paths) pathscnt++;
if (pathscnt < 3) PPx.Quit();
// ListFile 作成
fso = new ActiveXObject('Scripting.FileSystemObject');
var tmpfile = fso.BuildPath(fso.GetSpecialFolder(2), fso.GetTempName());
var f = fso.OpenTextFile(tmpfile, 2, true);
for (var path in paths) {
if (paths[path] == 1) f.Write(path + '\n');
}
f.Close();
// リストファイルを表示してインクリメンタルサーチを実行
// こいつだと駄目だった。
// PPx.Execute('*ppc -k *jumppath ' + tmpfile + '::listfile /noasync /nofixpath %%: %%K"/J"'); //tmpfileの親ディレクトリが表示される。インクリメンタルサーチにはなる
// PPx.Execute('*ppc -k *jumppath ' + tmpfile + '::listfile /noasync /nofixpath'); //この形ならlistfileには入れる
// TODO: タブを選択したいので、新しく開いてしまうタブを消したい。無理かな
// PPx を -single で起動して、元のPPxのタブを変更した後に -single を閉じるとか考えたけど無理そう。
// -choose: で任意のコマンドを実行して終了ということができれば可能性はあるか。
// TODO: Listfileが最後のディレクトリ名だけ表示される。フルパスにしたい。
// XC_pmsk で指定できるが別のListFileは表示方法を変えたい。
// -k 以降が、なぜこうすると動くのかよくわからん……
// これだと %%K"/" は設定によって変えないといけないと思う。
PPx.Execute('*ppc ' + tmpfile + '::listfile -k %%K"/"');
こんな感じでインクリメンタルサーチが始まった状態になる。