0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Paper Plane xUI で peco を使ってタブを切り替える

Last updated at Posted at 2015-10-10

開いているタブをListfileで表示してインクリメンタルサーチ - Qiita だと下のようにイマイチだったので別案を考えてみた。

  • 新しくタブを開くので、現在開いているタブのカーソル位置が再現できない
  • 重複するタブがどんどん開く (同じパスのタブを閉じる で対処は可能)

peco はパスを通して実行できるようにしておく。
以下のそれぞれのファイルを PPx の script フォルダへ保存して *script %0script\selecttabpeco.jp

PPb をドックに入れるとかやりたかったけど無理っぽい。
PPb での経由はせずにコマンドプロンプトで動かす。
peco の結果を PPx で受け取る方法がわからない(ない?)のでクリップボード経由で取得する。

selecttabpeco.js
//!*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 を書いていなかったので、絞り込みがやたら遅くて使い物にならないなぁと思っていた。)

config.json
{
	"Action": {
		"my.SelectFilterMigemo": [
			"peco.RotateFilter",
			"peco.RotateFilter",
			"peco.RotateFilter",
			"peco.RotateFilter"
		]
	},
	"Keymap": {
		"M-t": "my.SelectFilterMigemo"
	},
	"CustomFilter": {
		"Migemo": {
			"Cmd": "migemogrep",
			"BufferThreshold": 10000
		}
	}
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?