開いているタブをListfileで表示してインクリメンタルサーチ - Qiita だと下のようにイマイチだったので別案を考えてみた。
- 新しくタブを開くので、現在開いているタブのカーソル位置が再現できない
- 重複するタブがどんどん開く (同じパスのタブを閉じる で対処は可能)
peco はパスを通して実行できるようにしておく。
以下のそれぞれのファイルを PPx の script フォルダへ保存して *script %0script\selecttabpeco.jp
PPb をドックに入れるとかやりたかったけど無理っぽい。
PPb での経由はせずにコマンドプロンプトで動かす。
peco の結果を PPx で受け取る方法がわからない(ない?)のでクリップボード経由で取得する。
//!*script
// 開いているタブをpecoで選択して切り替え
// PPx 1.50 x64 + Script Module R14
var adTypeBinary = 1;
var adTypeText = 2;
var Fso = new ActiveXObject('Scripting.FileSystemObject');
var file = getListFile();
PPx.Execute('%Obsq *launch peco < ' + file + ' | clip');
var id_path = PPx.Clipboard;
PPx.Execute('*selectppx ' + id_path.substr(0, 3));
Fso.DeleteFile(file);
function getListFile() {
var typeCurrentWindow = -2;
var posFirst = 0;
var posSkipBOM = 3;
var adWriteLine = 1; // 行区切り文字(改行)も入力
var adSaveCreateOverWrite = 2;
var ado = new ActiveXObject('ADODB.Stream');
// UTF-8 でタブ一覧を取得
var tabs = PPx.Pane.Tab;
if (tabs.Count < 3) PPx.Quit(-1);
ado.Type = adTypeText;
ado.Charset = 'UTF-8';
ado.Open();
var tab;
for (var i = 0; i < tabs.Count; i++) {
tab = tabs.Item(i);
if (tab.Type != typeCurrentWindow) continue;
// 表示している Liftfile の名前も表示したかったので .Name を追加
ado.writeText(tab.IDName + ' ' + tab.Name + ' ' + tab.Extract('%D'), adWriteLine);
}
ado.Position = posFirst; // バイナリモードにするため先頭へ移動
ado.Type = adTypeBinary;
ado.Position = posSkipBOM; // BOM を飛ばす
var list = ado.Read();
ado.Close();
// ファイルへ出力
ado.Open();
ado.Write(list);
var file = Fso.BuildPath(PPx.Extract("%'temp'"), Fso.GetTempName());
ado.SaveToFile(file, adSaveCreateOverWrite);
ado.Close();
return file;
}
peco の設定
日本語のフォルダも頻繁に扱うので、標準の peco だと辛い。
migemogrep を使うように設定して日本語のフォルダも選択できるようにする。
バイナリは Releases · peco/migemogrep から取得してパスの通ったフォルダにおく。
~/.config/peco
へ以下の config.json
を置く。
Alt-t で Migemo へ切り替え。RotateFilter の四番目なので四回実行するように設定。
(最初、BufferThreshold を書いていなかったので、絞り込みがやたら遅くて使い物にならないなぁと思っていた。)
{
"Action": {
"my.SelectFilterMigemo": [
"peco.RotateFilter",
"peco.RotateFilter",
"peco.RotateFilter",
"peco.RotateFilter"
]
},
"Keymap": {
"M-t": "my.SelectFilterMigemo"
},
"CustomFilter": {
"Migemo": {
"Cmd": "migemogrep",
"BufferThreshold": 10000
}
}
}